ROP - Return Oriented Programing
Taarifa Msingi
Programu ya Kurudi kwa Mwelekeo (ROP) ni mbinu ya kudukua ya juu inayotumika kuzunguka hatua za usalama kama No-Execute (NX) au Data Execution Prevention (DEP). Badala ya kuingiza na kutekeleza shellcode, muhusika hutumia 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 kutekeleza operesheni za kupindukia, kwa ufanisi kuzunguka ulinzi wa NX/DEP.
Jinsi ROP Inavyofanya Kazi
Udukuzi wa Mwelekeo wa Kudhibiti: Kwanza, muhusika anahitaji kudhibiti mwelekeo wa programu, kwa kawaida kwa kutumia kosa la kujaza kijazo kubadilisha anwani iliyohifadhiwa ya kurudi kwenye rundo.
Unganishaji wa Gadgets: Mhusika kisha kwa uangalifu huchagua na kuunganisha gadgets kutekeleza hatua zinazotakiwa. Hii inaweza kuhusisha kuweka vigezo kwa wito wa kazi, kuita kazi (k.m.,
system("/bin/sh")
), na kushughulikia usafi wowote unaohitajika au operesheni zaidi.Utekelezaji wa Mzigo wa Data: Wakati kazi inayoweza kudhurika inaporudi, badala ya kurudi kwenye eneo halali, inaanza kutekeleza mnyororo wa gadgets.
Zana
Kwa kawaida, gadgets zinaweza kupatikana kwa kutumia ROPgadget, ropper au moja kwa moja kutoka pwntools (ROP).
Mnyororo wa ROP kwenye Mfano wa x86
Mbinu za Kuita x86 (biti 32)
cdecl: Mpigaji anasafisha rundo. Vigezo vya kazi vinapigwa kwenye rundo kwa mpangilio wa kurudi (kulia-kushoto). Vigezo vinapigwa kwenye rundo kutoka kulia kwenda kushoto.
stdcall: Kama cdecl, lakini mpokeaji anahusika na kusafisha rundo.
Kupata Gadgets
Kwanza, hebu tuchukulie tumetambua gadgets muhimu ndani ya faili ya binary au maktaba zilizopakiwa. Gadgets tunayovutiwa nayo ni:
pop eax; ret
: Gadget hii inapiga anwani ya juu ya rundo kwenye rejista yaEAX
na kisha kurudi, ikiruhusu kudhibitiEAX
.pop ebx; ret
: Kama hapo juu, lakini kwa rejista yaEBX
, ikiruhusu kudhibitiEBX
.mov [ebx], eax; ret
: Inahamisha thamani katikaEAX
kwenye eneo la kumbukumbu linaloelekezwa naEBX
kisha kurudi. Mara nyingi huitwa gadget ya kuandika-nini-wapi.Kwa kuongezea, tuna anwani ya kazi ya
system()
inayopatikana.
Mnyororo wa ROP
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, habari zaidi katika Ret2lib)Nafasi ya anwani ya kurudi kutoka kwa
system()
Anwani ya mfuatano wa
"/bin/sh"
(parameta kwa kazi ya system)
Mnyororo wa ROP katika Mfano wa x64
Mifumo ya Kuita x64 (64-bit)
Hutumia System V AMD64 ABI kwenye mifumo inayofanana na Unix, ambapo vigezo vya kwanza sita vya nambari au pointa hupitishwa kwenye rejista
RDI
,RSI
,RDX
,RCX
,R8
, naR9
. Vigezo vingine hupitishwa kwenye steki. Thamani ya kurudi hutiwa kwenyeRAX
.Mfumo wa kuita wa Windows x64 hutumia
RCX
,RDX
,R8
, naR9
kwa vigezo vinne vya kwanza vya nambari au pointa, na vigezo vingine hupitishwa kwenye steki. Thamani ya kurudi hutiwa kwenyeRAX
.Rejista: Rejista za 64-bit ni pamoja na
RAX
,RBX
,RCX
,RDX
,RSI
,RDI
,RBP
,RSP
, naR8
hadiR15
.
Kupata Vifaa vya Gadgets
Kwa madhumuni yetu, tuzingatie vifaa ambavyo vitatuwezesha 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 kwenye RDI na kisha kurudi. Muhimu kwa kuweka hoja yetu kwa system().
ret: Kurudi kwa kawaida, inayofaa kwa upangilio wa steki katika hali fulani.
Na tunajua anwani ya kazi ya system().
Mnyororo wa ROP
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
kuwekaRDI
kwa anwani ya"/bin/sh"
.Tunaruka moja kwa moja kwa
system()
baada ya kuwekaRDI
, 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.
Upangilio wa Stak
ABI ya x86-64 inahakikisha kuwa stak ina upangilio wa byte 16 wakati maagizo ya wito yanatekelezwa. LIBC, kwa kuboresha utendaji, inatumia maagizo ya SSE (kama movaps) ambayo yanahitaji upangilio huu. Ikiwa stak haijapangiliwa vizuri (maana yake 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.
Tofauti Kuu kati ya x86 na x64
Kwa kuwa x64 inatumia rejista kwa hoja za kwanza chache, mara nyingi inahitaji vifaa vichache kuliko x86 kwa wito wa kazi za kawaida, 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 usanidi wa x64 hutoa fursa na changamoto kwa maendeleo ya kutumia, hasa katika muktadha wa Return-Oriented Programming (ROP).
Mnyororo wa ROP katika Mfano wa ARM64
Msingi wa ARM64 & Mikataba ya Wito
Angalia ukurasa ufuatao kwa habari hii:
pageIntroduction to ARM64v8Kinga Dhidi ya ROP
Stack 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.
Mbinu za msingi za ROP
Tambua kuwa ROP ni mbinu tu ya kutekeleza kanuni za aina yoyote. Kulingana na ROP, mbinu nyingi za Ret2XXX ziliendelezwa:
Ret2lib: Tumia ROP kuita kazi za aina yoyote kutoka kwa maktaba iliyopakiwa na vigezo vya aina yoyote (kawaida kitu kama
system('/bin/sh')
.
Ret2Syscall: Tumia ROP kuandaa wito kwa syscall, k.m.
execve
, na kufanya iitumie amri za aina yoyote.
EBP2Ret & EBP Chaining: La kwanza litatumia EBP badala ya EIP kudhibiti mtiririko na la pili ni kama Ret2lib lakini katika kesi hii mtiririko unadhibitiwa hasa na anwani za EBP (ingawa pia ni muhimu kudhibiti EIP).
Mifano na Marejeo Mengine
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 kazi ambayo inavuja benderaarm64, hakuna ASLR, kifaa cha ROP kufanya stak iweze kutekelezeka na kuruka kwa shellcode kwenye stak
Last updated