ROP - Return Oriented Programing
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Return-Oriented Programming (ROP) is 'n gevorderde eksploitasiemetode wat gebruik word om sekuriteitsmaatreëls soos No-Execute (NX) of Data Execution Prevention (DEP) te omseil. In plaas daarvan om shellcode in te spuit en uit te voer, benut 'n aanvaller stukke kode wat reeds in die binêre of in gelaaide biblioteke teenwoordig is, bekend as "gadgets". Elke gadget eindig tipies met 'n ret
instruksie en voer 'n klein operasie uit, soos om data tussen registers te beweeg of aritmetiese operasies uit te voer. Deur hierdie gadgets saam te ketting, kan 'n aanvaller 'n payload saamstel om arbitrêre operasies uit te voer, wat effektief NX/DEP beskerming omseil.
Beheervloei Hijacking: Eerstens moet 'n aanvaller die beheervloei van 'n program oorneem, tipies deur 'n buffer overflow te benut om 'n gestoor terugadres op die stapel te oorskry.
Gadget Ketting: Die aanvaller kies dan versigtig en ketting gadgets om die gewenste aksies uit te voer. Dit kan behels om argumente vir 'n funksie-aanroep op te stel, die funksie aan te roep (bv. system("/bin/sh")
), en enige nodige opruiming of bykomende operasies te hanteer.
Payload Uitvoering: Wanneer die kwesbare funksie terugkeer, begin dit om die ketting van gadgets uit te voer in plaas daarvan om na 'n wettige ligging terug te keer.
Tipies kan gadgets gevind word met behulp van ROPgadget, ropper of direk van pwntools (ROP).
cdecl: Die oproeper maak die stapel skoon. Funksie argumente word in omgekeerde volgorde (regs na links) op die stapel gepush. Argumente word van regs na links op die stapel gepush.
stdcall: Soortgelyk aan cdecl, maar die kaler is verantwoordelik vir die skoonmaak van die stapel.
Eerstens, kom ons neem aan ons het die nodige gadgets binne die binêre of sy gelaaide biblioteke geïdentifiseer. Die gadgets waarin ons belangstel is:
pop eax; ret
: Hierdie gadget pop die boonste waarde van die stapel in die EAX
register en keer dan terug, wat ons in staat stel om EAX
te beheer.
pop ebx; ret
: Soortgelyk aan die bogenoemde, maar vir die EBX
register, wat beheer oor EBX
moontlik maak.
mov [ebx], eax; ret
: Beweeg die waarde in EAX
na die geheue ligging wat deur EBX
aangedui word en keer dan terug. Dit word dikwels 'n write-what-where gadget genoem.
Daarbenewens het ons die adres van die system()
funksie beskikbaar.
Met behulp van pwntools, berei ons die stapel voor vir die ROP ketting uitvoering soos volg met die doel om system('/bin/sh')
uit te voer, let op hoe die ketting begin met:
'n ret
instruksie vir uitlijning doeleindes (opsioneel)
Adres van die system
funksie (veronderstel ASLR is gedeaktiveer en bekende libc, meer inligting in Ret2lib)
Plekhouer vir die terugadres van system()
"/bin/sh"
string adres (parameter vir die system funksie)
Gebruik die System V AMD64 ABI aanroep konvensie op Unix-agtige stelsels, waar die eerste ses heelgetalle of wysers argumente in die registers RDI
, RSI
, RDX
, RCX
, R8
, en R9
oorgedra word. Bykomende argumente word op die stapel oorgedra. Die terugkeerwaarde word in RAX
geplaas.
Windows x64 aanroep konvensie gebruik RCX
, RDX
, R8
, en R9
vir die eerste vier heelgetalle of wysers argumente, met bykomende argumente wat op die stapel oorgedra word. Die terugkeerwaarde word in RAX
geplaas.
Registers: 64-bit registers sluit RAX
, RBX
, RCX
, RDX
, RSI
, RDI
, RBP
, RSP
, en R8
tot R15
in.
Vir ons doel, laat ons fokus op gadgets wat ons sal toelaat om die RDI register in te stel (om die "/bin/sh" string as 'n argument aan system() oor te dra) en dan die system() funksie aan te roep. Ons neem aan ons het die volgende gadgets geïdentifiseer:
pop rdi; ret: Popp die boonste waarde van die stapel in RDI en keer dan terug. Essensieel om ons argument vir system() in te stel.
ret: 'n Eenvoudige terugkeer, nuttig vir stapel-alignment in sommige scenario's.
En ons weet die adres van die system() funksie.
Hieronder is 'n voorbeeld wat pwntools gebruik om 'n ROP-ketting op te stel en uit te voer wat daarop gemik is om system('/bin/sh') op x64 uit te voer:
In hierdie voorbeeld:
Ons gebruik die pop rdi; ret
gadget om RDI
op die adres van "/bin/sh"
te stel.
Ons spring direk na system()
nadat ons RDI
gestel het, met system()'s adres in die ketting.
ret_gadget
word gebruik vir uitlijning as die teikenomgewing dit vereis, wat meer algemeen in x64 is om behoorlike stapeluitlijning te verseker voordat funksies aangeroep word.
Die x86-64 ABI verseker dat die stapel 16-byte uitgelijnd is wanneer 'n aanroepinstruksie uitgevoer word. LIBC, om prestasie te optimaliseer, gebruik SSE-instruksies (soos movaps) wat hierdie uitlijning vereis. As die stapel nie behoorlik uitgelijnd is (wat beteken RSP is nie 'n veelvoud van 16 nie), sal aanroepe na funksies soos system misluk in 'n ROP-ketting. Om dit reg te stel, voeg eenvoudig 'n ret gadget by voordat jy system in jou ROP-ketting aanroep.
Aangesien x64 registers vir die eerste paar argumente gebruik, vereis dit dikwels minder gadgets as x86 vir eenvoudige funksie-aanroepe, maar om die regte gadgets te vind en te ketting kan meer kompleks wees weens die verhoogde aantal registers en die groter adresruimte. Die verhoogde aantal registers en die groter adresruimte in x64 argitektuur bied beide geleenthede en uitdagings vir eksploitontwikkeling, veral in die konteks van Return-Oriented Programming (ROP).
Kyk na die volgende bladsy vir hierdie inligting:
Introduction to ARM64v8Stapel Kanaries: In die geval van 'n BOF, is dit nodig om die stoor stapel kanarie te omseil om terugwysers te oorskry om 'n ROP-ketting te misbruik.
Gebrek aan Gadgets: As daar nie genoeg gadgets is nie, sal dit nie moontlik wees om 'n ROP-ketting te genereer nie.
Let daarop dat ROP net 'n tegniek is om arbitrêre kode uit te voer. Gebaseer op ROP is baie Ret2XXX tegnieke ontwikkel:
Ret2lib: Gebruik ROP om arbitrêre funksies van 'n gelaaide biblioteek met arbitrêre parameters aan te roep (gewoonlik iets soos system('/bin/sh')
.
Ret2Syscall: Gebruik ROP om 'n oproep na 'n syscall, bv. execve
, voor te berei en dit te laat uitvoer arbitrêre opdragte.
EBP2Ret & EBP Ketting: Die eerste sal EBP misbruik in plaas van EIP om die vloei te beheer en die tweede is soortgelyk aan Ret2lib, maar in hierdie geval word die vloei hoofsaaklik met EBP adresse beheer (alhoewel dit ook nodig is om EIP te beheer).
64-bis, Pie en nx geaktiveer, geen kanarie, oorskry RIP met 'n vsyscall
adres met die enigste doel om na die volgende adres in die stapel te keer wat 'n gedeeltelike oorskryding van die adres sal wees om die deel van die funksie te kry wat die vlag lek.
arm64, geen ASLR, ROP gadget om stapel uitvoerbaar te maak en na shellcode in die stapel te spring.
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)