ROP - Return Oriented Programing
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Return-Oriented Programming (ROP) ni mbinu ya juu ya unyakuzi inayotumika kupita hatua za usalama kama No-Execute (NX) au Data Execution Prevention (DEP). Badala ya kuingiza na kutekeleza shellcode, mshambuliaji anatumia vipande vya msimbo vilivyopo tayari katika binary au katika maktaba zilizopakiwa, vinavyojulikana kama "gadgets". Kila gadget kwa kawaida huishia na amri ya ret
na inatekeleza operesheni ndogo, kama vile kuhamasisha data kati ya register au kufanya operesheni za hesabu. Kwa kuunganisha gadgets hizi pamoja, mshambuliaji anaweza kujenga payload ili kufanya operesheni zisizo na mipaka, kwa ufanisi akipita ulinzi wa NX/DEP.
Control Flow Hijacking: Kwanza, mshambuliaji anahitaji kuingilia mtiririko wa udhibiti wa programu, kwa kawaida kwa kutumia udhaifu wa buffer overflow ili kuandika anwani ya kurudi iliyohifadhiwa kwenye stack.
Gadget Chaining: Mshambuliaji kisha anachagua kwa makini na kuunganisha gadgets ili kutekeleza vitendo vinavyohitajika. Hii inaweza kujumuisha kuandaa hoja za wito wa kazi, kuita kazi hiyo (kwa mfano, system("/bin/sh")
), na kushughulikia usafishaji wowote unaohitajika au operesheni za ziada.
Payload Execution: Wakati kazi iliyo hatarini inarudi, 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 pwntools (ROP).
cdecl: Mtu anayeita anasafisha stack. Hoja za kazi zinawekwa kwenye stack kwa mpangilio wa kinyume (kulia-kushoto). Hoja zinawekwa kwenye stack kutoka kulia kwenda kushoto.
stdcall: Inafanana na cdecl, lakini mtu anayeitwa ndiye anayehusika na kusafisha stack.
Kwanza, hebu tuweke dhana kwamba tumetambua gadgets zinazohitajika ndani ya binary au maktaba zake zilizopakiwa. Gadgets tunazovutiwa nazo ni:
pop eax; ret
: Gadget hii inachukua thamani ya juu ya stack na kuhamasisha kwenye register ya EAX
na kisha inarudi, ikitupa udhibiti wa EAX
.
pop ebx; ret
: Inafanana na ile ya juu, lakini kwa register ya EBX
, ikiruhusu udhibiti wa EBX
.
mov [ebx], eax; ret
: Inahamisha thamani katika EAX
kwenda kwenye eneo la kumbukumbu linaloonyeshwa na EBX
na kisha inarudi. Hii mara nyingi inaitwa write-what-where gadget.
Zaidi ya hayo, tuna anwani ya kazi ya system()
inapatikana.
Kwa kutumia pwntools, tunaandaa stack kwa ajili ya utekelezaji wa mnyororo wa ROP kama ifuatavyo tukilenga kutekeleza system('/bin/sh')
, angalia jinsi mnyororo unavyoanza na:
Amri ya ret
kwa ajili ya usawa (hiari)
Anwani ya kazi ya system
(tukidhani ASLR imezimwa na libc inajulikana, maelezo zaidi katika Ret2lib)
Mahali pa kurudi kutoka kwa system()
Anwani ya string "/bin/sh"
(hoja kwa kazi ya system)
Uses the System V AMD64 ABI calling convention on Unix-like systems, where the first six integer or pointer arguments are passed in the registers RDI
, RSI
, RDX
, RCX
, R8
, and R9
. Additional arguments are passed on the stack. The return value is placed in RAX
.
Windows x64 calling convention uses RCX
, RDX
, R8
, and R9
for the first four integer or pointer arguments, with additional arguments passed on the stack. The return value is placed in RAX
.
Registers: 64-bit registers include RAX
, RBX
, RCX
, RDX
, RSI
, RDI
, RBP
, RSP
, and R8
to R15
.
Kwa kusudi letu, hebu tuzingatie gadgets ambazo zitaturuhusu kuweka RDI register (ili kupitisha "/bin/sh" string kama hoja kwa system()) na kisha kuita kazi ya system(). Tutadhani tumetambua gadgets zifuatazo:
pop rdi; ret: Inachukua thamani ya juu ya stack na kuiweka kwenye RDI na kisha inarudi. Muhimu kwa kuweka hoja yetu kwa system().
ret: Kurudi rahisi, muhimu kwa usawa wa stack katika hali fulani.
Na tunajua anwani ya kazi ya system().
Below is an example using pwntools to set up and execute a ROP chain aiming to execute system('/bin/sh') on x64:
Katika mfano huu:
Tunatumia pop rdi; ret
gadget kuweka RDI
kwenye anwani ya "/bin/sh"
.
Tunaruka moja kwa moja kwenye system()
baada ya kuweka RDI
, na anwani ya system() katika mnyororo.
ret_gadget
inatumika kwa ajili ya usawa ikiwa mazingira ya lengo yanahitaji hivyo, ambayo ni ya kawaida zaidi katika x64 ili kuhakikisha usawa sahihi wa stack kabla ya kuita kazi.
The x86-64 ABI inahakikisha kwamba stack inakuwa na usawa wa byte 16 wakati amri ya call inatekelezwa. LIBC, ili kuboresha utendaji, inatumia SSE instructions (kama movaps) ambazo zinahitaji usawa huu. Ikiwa stack haijawa na usawa sahihi (kumanisha RSP si mara kadhaa ya 16), kuita kazi kama system kutashindwa katika ROP chain. Ili kurekebisha hili, ongeza tu ret gadget kabla ya kuita system katika mnyororo wako wa ROP.
Kwa sababu x64 inatumia register kwa ajili ya hoja chache za kwanza, mara nyingi inahitaji gadgets chache zaidi kuliko x86 kwa ajili ya kuita kazi rahisi, lakini kupata na kuunganisha gadgets sahihi kunaweza kuwa ngumu zaidi kutokana na kuongezeka kwa idadi ya register na nafasi kubwa ya anwani. Kuongezeka kwa idadi ya register na nafasi kubwa ya anwani katika usanifu wa x64 kunatoa fursa na changamoto kwa maendeleo ya exploit, hasa katika muktadha wa Return-Oriented Programming (ROP).
Angalia ukurasa ufuatao kwa habari hii:
Introduction to ARM64v8Stack Canaries: Katika BOF, inahitajika kupita duka la stack canary ili kuandika tena viashiria vya kurudi ili kutumia mnyororo wa ROP.
Ukosefu wa Gadgets: Ikiwa hakuna gadgets za kutosha, haitakuwa rahisi kuunda mnyororo wa ROP.
Kumbuka kwamba ROP ni mbinu tu ya kutekeleza msimbo wa kiholela. Kulingana na ROP, mbinu nyingi za Ret2XXX zilikuwa zimeendelezwa:
Ret2lib: Tumia ROP kuita kazi za kiholela kutoka maktaba iliyopakiwa na vigezo vya kiholela (kawaida kitu kama system('/bin/sh')
.
Ret2Syscall: Tumia ROP kuandaa wito kwa syscall, e.g. execve
, na kufanya itekeleze amri za kiholela.
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 inahitajika kudhibiti EIP).
64 bit, Pie na nx zimewezeshwa, hakuna canary, andika tena RIP na anwani ya vsyscall
kwa lengo moja la kurudi kwenye anwani inayofuata kwenye stack ambayo itakuwa ni kuandika tena sehemu ya anwani ili kupata sehemu ya kazi inayovuja bendera
arm64, hakuna ASLR, ROP gadget kufanya stack iweze kutekelezwa na kuruka kwenye shellcode katika stack
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)