Ret2lib + Printf leak - arm64
Ret2lib - obejście NX z ROP (bez ASLR)
Kompiluj bez canary:
Find offset
x30 offset
Tworząc wzór za pomocą pattern create 200
, używając go i sprawdzając offset za pomocą pattern search $x30
, możemy zobaczyć, że offset wynosi 108
(0x6c).
Patrząc na zdisassemblowaną funkcję main, możemy zobaczyć, że chcielibyśmy skoczyć do instrukcji, aby bezpośrednio skoczyć do printf
, którego offset od miejsca, w którym binarka jest załadowana, wynosi 0x860
:
Find system and /bin/sh
string
/bin/sh
stringPonieważ ASLR jest wyłączony, adresy będą zawsze takie same:
Find Gadgets
Musimy mieć w x0
adres do ciągu /bin/sh
i wywołać system
.
Używając rooper, znaleziono interesujący gadget:
Ten gadżet załaduje x0
z $sp + 0x18
i następnie załaduje adresy x29 i x30 z sp oraz skoczy do x30. Dzięki temu gadżetowi możemy kontrolować pierwszy argument, a następnie skoczyć do systemu.
Exploit
Ret2lib - obejście NX, ASL i PIE z wyciekami printf ze stosu
Kompiluj bez canary:
PIE i ASLR, ale bez canary
Runda 1:
Wyciek PIE ze stosu
Wykorzystanie bof do powrotu do main
Runda 2:
Wyciek libc ze stosu
ROP: ret2system
Wyciek printf
Ustawiając punkt przerwania przed wywołaniem printf, można zobaczyć, że na stosie znajdują się adresy do powrotu do binarki oraz adresy libc:
Próbując różnych offsetów, %21$p
może wyciekować adres binarki (obejście PIE), a %25$p
może wyciekować adres libc:
Odejmując wyciekający adres libc od podstawowego adresu libc, można zobaczyć, że offset wyciekającego adresu od podstawy wynosi 0x49c40
.
offset x30
Zobacz poprzedni przykład, ponieważ bof jest taki sam.
Znajdź Gadżety
Jak w poprzednim przykładzie, musimy mieć w x0
adres do ciągu /bin/sh
i wywołać system
.
Używając roopera, znaleziono inny interesujący gadżet:
Ten gadżet załaduje x0
z $sp + 0x78
i następnie załaduje adresy x29 i x30 z sp oraz skoczy do x30. Dzięki temu gadżetowi możemy kontrolować pierwszy argument, a następnie skoczyć do systemu.
Exploit
Last updated