Stack Shellcode
Podstawowe informacje
Kod shellcode na stosie to technika używana w eksploatacji binarnej, gdzie atakujący zapisuje shellcode do stosu podatnego programu, a następnie modyfikuje Wskaźnik Instrukcji (IP) lub Rozszerzony Wskaźnik Instrukcji (EIP), aby wskazywał na lokalizację tego shellcode, powodując jego wykonanie. Jest to klasyczna metoda używana do uzyskania nieautoryzowanego dostępu lub wykonania dowolnych poleceń na systemie docelowym. Oto rozbudowanie procesu, w tym prosty przykład w języku C i sposób napisania odpowiadającego exploitu przy użyciu Pythona z pwntools.
Przykład w języku C: Podatny program
Zacznijmy od prostego przykładu podatnego programu w języku C:
Ten program jest podatny na przepełnienie bufora ze względu na użycie funkcji gets()
.
Kompilacja
Aby skompilować ten program wyłączając różne zabezpieczenia (aby zasymulować środowisko podatne na ataki), możesz użyć poniższej komendy:
-fno-stack-protector
: Wyłącza ochronę stosu.-z execstack
: Sprawia, że stos jest wykonywalny, co jest konieczne do wykonania shellcode przechowywanego na stosie.-no-pie
: Wyłącza wykonywalność niezależną od pozycji, ułatwiając przewidywanie adresu pamięci, w którym będzie znajdować się nasz shellcode.-m32
: Kompiluje program jako wykonywalny 32-bitowy plik, często używany ze względu na prostotę w rozwijaniu exploitów.
Python Exploit using Pwntools
Oto jak można napisać exploit w Pythonie, korzystając z pwntools, aby przeprowadzić atak ret2shellcode:
Ten skrypt konstruuje ładunek składający się z slajdu NOP, kodu powłoki, a następnie nadpisuje EIP adresem wskazującym na slajd NOP, zapewniając wykonanie kodu powłoki.
Slajd NOP (asm('nop')
) jest używany do zwiększenia szansy, że wykonanie "poślizgnie się" do naszego kodu powłoki bez względu na dokładny adres. Dostosuj argument p32()
do adresu początkowego bufora plus przesunięcia, aby trafić na slajd NOP.
Protections
ASLR powinien być wyłączony, aby adres był niezawodny podczas kolejnych wykonan lub adres, pod którym będzie przechowywana funkcja, nie będzie zawsze taki sam i będziesz potrzebować wycieku, aby dowiedzieć się, gdzie jest załadowana funkcja win.
Kanarki stosu również powinny być wyłączone, w przeciwnym razie skompromitowany adres powrotu EIP nie zostanie nigdy wykonany.
NX ochrona stosu uniemożliwi wykonanie kodu powłoki wewnątrz stosu, ponieważ ta strefa nie będzie wykonawcza.
Inne przykłady i odnośniki
64-bitowy, ASLR z wyciekiem adresu stosu, napisz kod powłoki i skocz do niego
32-bitowy, ASLR z wyciekiem adresu stosu, napisz kod powłoki i skocz do niego
32-bitowy, ASLR z wyciekiem adresu stosu, porównanie w celu zapobieżenia wywołaniu exit(), nadpisanie zmiennej wartością, napisz kod powłoki i skocz do niego
arm64, brak ASLR, gadżet ROP do sprawienia, że stos będzie wykonawczy i skok do kodu powłoki na stosie
Last updated