Odpověď od Jasona je správným řešením. Chtěl jsem však dát alternativní odpověď bez Pythonu, ale z terminálu. IMO Python je vždy upřednostňován pro lepší automatizaci, ale někdy prostě chcete mít rychlé zneužití bez dalších nástrojů.
S ohledem na to by byl přirozený pokus něco jako níže:
echo -e "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ xbe \ xba \ xfe \ xca \ x0a" | nc pwnable.kr 9000
Koneckonců, toto je přesná replika výše uvedeného kódu v Pythonu, že? Kromě toho server prosí, aby se lišil:
*** zjištěno rozbití zásobníku ***: / home / bof / bof ukončeno přetečení mě:
Takže v čem je tedy problém?
Zamyslete se nad výše uvedeným příkazem. Odesílá spoustu znaků na konec vzdáleného procesu v naději, že běží / bin / sh. Stále nás však chyba přivítala. Důvodem je to, že posíláme správné užitečné zatížení, ale pak se zastavujeme . EOF. / bin / sh nemá žádný vstup, takže provádění pokračuje na další řádek, dokud se nenakopne ochrana zásobníku.
Důvod, proč Python funguje a příkaz echo
nefunguje, je kontinuita. Python nezavírá stream, zatímco verze terminálu ano.
Chcete-li to dokázat, zde je o něco delší verze terminálu exploit, která ve skutečnosti funguje:
echo -e "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ xbe \ xba \ xfe \ xca \ x0a" > payload.bin
Nejprve uložíme přesný plat . Dále spustíme následující příkaz:
cat payload.bin - | nc pwnable.kr 9000
(Všimněte si - po payload.bin, poté, co kočka provede výstup obsahu payload.bin, začne vydávat vše, co přijde přes stdin)
A voila! Nyní jste skutečně uvnitř. Můžete zkusit zadat příkazy prostředí, například cat flag
nebo touch / tmp / pwned
nebo cokoli chcete.
Fíha! To bylo dlouhé. Doufám, že tato informace pomůže dalším zmateným duším, stejně jako mi pomohla před chvílí.