ROP - Return Oriented Programing
Last updated
Last updated
Jifunze na zoezi la AWS Hacking:Mafunzo ya HackTricks ya Mtaalam wa Timu Nyekundu ya AWS (ARTE) Jifunze na zoezi la GCP Hacking: Mafunzo ya HackTricks ya Mtaalam wa Timu Nyekundu ya GCP (GRTE)
Programu ya Kurudi kwa Mwelekeo (ROP) ni mbinu ya udukuzi ya juu inayotumika kuzunguka hatua za usalama kama No-Execute (NX) au Data Execution Prevention (DEP). Badala ya kuingiza na kutekeleza shellcode, muhusika anatumia vipande vya nambari tayari zilizopo kwenye faili ya binary au maktaba zilizopakiwa, inayoitwa "gadgets". Kila gadget kawaida hukamilika na maagizo ya ret
na hufanya operesheni ndogo, kama vile kuhamisha data kati ya rejista au kufanya operesheni za hisabati. Kwa kuunganisha vipande hivi vya gadgets pamoja, muhusika anaweza kujenga mzigo wa data kufanya operesheni za kupindukia, kwa ufanisi kupuuza ulinzi wa NX/DEP.
Udukuzi wa Mwelekeo wa Kudhibiti: Kwanza, muhusika anahitaji kudhibiti mwelekeo wa programu, kwa kawaida kwa kutumia kosa la kujaza kijazo ili kubadilisha anwani iliyohifadhiwa ya kurudi kwenye rundo.
Unganishaji wa Gadgets: Mhusika kisha kwa uangalifu huchagua na kuunganisha gadgets kutekeleza vitendo vinavyotakiwa. Hii inaweza kuhusisha kuweka hoja kwa wito wa kazi, kuita kazi (k.m., system("/bin/sh")
), na kushughulikia usafi au operesheni zingine zinazohitajika.
Utekelezaji wa Mzigo wa Data: Wakati kazi inayoweza kudhuriwa inaporudi, badala ya kurudi kwenye eneo halali, inaanza kutekeleza mnyororo wa gadgets.
Kwa kawaida, gadgets zinaweza kupatikana kwa kutumia ROPgadget, ropper au moja kwa moja kutoka kwa pwntools (ROP).
cdecl: Mpigaji anasafisha rundo. Hoja za kazi huwekwa kwenye rundo kwa mpangilio wa kurudi (kulia-kushoto). Hoja zinawekwa kwenye rundo kutoka kulia kwenda kushoto.
stdcall: Kama cdecl, lakini mpokeaji anahusika na kusafisha rundo.
Kwanza, hebu tuchukulie tumetambua gadgets muhimu ndani ya binary au maktaba zilizopakiwa. Gadgets tunayovutiwa nayo ni:
pop eax; ret
: Gadget hii inapiga nje thamani ya juu ya rundo kwenye rejista ya EAX
na kisha kurudi, kuruhusu udhibiti wa EAX
.
pop ebx; ret
: Kama hapo juu, lakini kwa ajili ya rejista ya EBX
, ikiruhusu udhibiti wa EBX
.
mov [ebx], eax; ret
: Inahamisha thamani katika EAX
kwenye eneo la kumbukumbu linaloelekezwa na EBX
kisha kurudi. Mara nyingi huitwa gadget ya andika-nini-wapi.
Kwa kuongezea, tuna anwani ya kazi ya system()
inapatikana.
Kwa kutumia pwntools, tunajiandaa rundo kwa utekelezaji wa mnyororo wa ROP kama ifuatavyo lengo likiwa kutekeleza system('/bin/sh')
, angalia jinsi mnyororo unavyoanza na:
Maagizo ya ret
kwa madhumuni ya upangaji (hiari)
Anwani ya kazi ya system
(tukidhani ASLR imelemazwa na libc inayojulikana, maelezo zaidi katika Ret2lib)
Nafasi ya anwani ya kurudi kutoka kwa system()
Anwani ya string ya "/bin/sh"
(parameta kwa kazi ya system)
Hutumia System V AMD64 ABI wito wa mkataba kwenye mifumo inayofanana na Unix, ambapo vigezo vya kwanza sita vya nambari au pointa hupitishwa kwenye rejista RDI
, RSI
, RDX
, RCX
, R8
, na R9
. Vigezo vingine hupitishwa kwenye steki. Thamani ya kurudi hutiwa kwenye RAX
.
Wito wa mkataba wa Windows x64 hutumia RCX
, RDX
, R8
, na R9
kwa vigezo vinne vya kwanza vya nambari au pointa, na vigezo vingine hupitishwa kwenye steki. Thamani ya kurudi hutiwa kwenye RAX
.
Rejista: Rejista za 64-bit ni pamoja na RAX
, RBX
, RCX
, RDX
, RSI
, RDI
, RBP
, RSP
, na R8
hadi R15
.
Kwa madhumuni yetu, tuzingatie vifaa vitakavyoturuhusu kuweka rejista ya RDI (ili kupitisha herufi "/bin/sh" kama hoja kwa system()) na kisha kuita kazi ya system(). Tutadhani tumetambua vifaa vifuatavyo:
pop rdi; ret: Hupokea thamani ya juu ya steki ndani ya RDI na kisha kurudi. Muhimu kwa kuweka hoja yetu kwa system().
ret: Kurudi rahisi, inayofaa kwa upangilio wa steki katika hali fulani.
Na tunajua anwani ya kazi ya system().
Hapa chini ni mfano ukitumia pwntools kuweka na kutekeleza mnyororo wa ROP ukiwa na lengo la kutekeleza system('/bin/sh') kwenye x64:
Katika mfano huu:
Tunatumia kifaa cha pop rdi; ret
kuweka RDI
kwa anwani ya "/bin/sh"
.
Tunaruka moja kwa moja kwa system()
baada ya kuweka RDI
, na anwani ya system() katika mnyororo.
ret_gadget
hutumiwa kwa upangilio ikiwa mazingira ya lengo yanahitaji, ambayo ni ya kawaida zaidi katika x64 kuhakikisha upangilio sahihi wa stak kabla ya kuita kazi.
ABI ya x86-64 inahakikisha kuwa stak ina upangilio wa byte 16 wakati maagizo ya wito yanatekelezwa. LIBC, kuboresha utendaji, inatumia maagizo ya SSE (kama movaps) ambayo yanahitaji upangilio huu. Ikiwa stak haiko sawa (maana RSP sio maradufu ya 16), wito kwa kazi kama system utashindwa katika mnyororo wa ROP. Ili kusahihisha hili, tuongeze tu ret gadget kabla ya kuita system katika mnyororo wako wa ROP.
Tangu x64 hutumia rejista kwa hoja za kwanza chache, mara nyingi inahitaji vifaa vichache kuliko x86 kwa wito rahisi wa kazi, lakini kupata na kuunganisha vifaa sahihi kunaweza kuwa ngumu zaidi kutokana na idadi kubwa ya rejista na nafasi kubwa ya anwani. Idadi kubwa ya rejista na nafasi kubwa ya anwani katika usanifu wa x64 hutoa fursa na changamoto kwa maendeleo ya kutumia udhaifu, hasa katika muktadha wa Return-Oriented Programming (ROP).
Angalia ukurasa ufuatao kwa habari hii:
Introduction to ARM64v8Stack Canaries: Katika kesi ya BOF, ni muhimu kuzidi kizuizi cha stak canary ili kubadilisha pointa za kurudi ili kutumia mnyororo wa ROP.
Uhaba wa Vifaa: Ikiwa hakuna vifaa vya kutosha, haitawezekana kuzalisha mnyororo wa ROP.
Tambua kuwa ROP ni mbinu tu ya kutekeleza nambari ya kupendelea. Kulingana na ROP, mbinu nyingi za Ret2XXX ziliendelezwa:
Ret2lib: Tumia ROP kuita kazi za kupendelea kutoka kwa maktaba iliyojazwa na vigezo vya kupendelea (kawaida kitu kama system('/bin/sh')
.
Ret2Syscall: Tumia ROP kuandaa wito kwa syscall, k.m. execve
, na kufanya iitumie amri za kupendelea.
EBP2Ret & EBP Chaining: Ya kwanza itatumia EBP badala ya EIP kudhibiti mtiririko na ya pili ni sawa na Ret2lib lakini katika kesi hii mtiririko unadhibitiwa hasa na anwani za EBP (ingawa pia ni muhimu kudhibiti EIP).
Biti 64, Pie na nx imewezeshwa, hakuna canary, zaidi ya RIP na anwani ya vsyscall
kwa kusudi la kurudi kwa anwani inayofuata kwenye stak ambayo itakuwa kuzidi sehemu ya anwani kupata sehemu ya kazi ambayo inavuja bendera
arm64, hakuna ASLR, kifaa cha ROP kufanya stak iwezekane na kuruka kwa shellcode kwenye stak
Jifunze & zoezi la Kuvamia AWS:Mafunzo ya HackTricks AWS Red Team Expert (ARTE) Jifunze & zoezi la Kuvamia GCP: Mafunzo ya HackTricks GCP Red Team Expert (GRTE)