Ret2csu
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)
ret2csu is 'n hacking tegniek wat gebruik word wanneer jy probeer om beheer oor 'n program te neem, maar nie die gadgets kan vind wat jy gewoonlik gebruik om die program se gedrag te manipuleer nie.
Wanneer 'n program sekere biblioteke (soos libc) gebruik, het dit 'n paar ingeboude funksies om te bestuur hoe verskillende stukke van die program met mekaar kommunikeer. Onder hierdie funksies is daar 'n paar verborge juwele wat as ons ontbrekende gadgets kan optree, veral een genaamd __libc_csu_init
.
In __libc_csu_init
is daar twee reekse instruksies (gadgets) om te beklemtoon:
Die eerste reeks laat ons toe om waardes in verskeie registers (rbx, rbp, r12, r13, r14, r15) op te stel. Dit is soos slots waar ons nommers of adresse kan stoor wat ons later wil gebruik.
This gadget allows us to control these registers by popping values off the stack into them.
The second sequence uses the values we set up to do a couple of things:
Beweeg spesifieke waardes na ander registers, wat hulle gereed maak vir ons om as parameters in funksies te gebruik.
Voer 'n oproep uit na 'n ligging wat bepaal word deur die waardes in r15 en rbx bymekaar te tel, en dan rbx met 8 te vermenigvuldig.
Miskien weet jy nie van enige adres om daar te skryf nie en jy het 'n ret
instruksie nodig. Let daarop dat die tweede gadget ook sal eindig in 'n ret
, maar jy sal aan sekere voorwaardes moet voldoen om dit te bereik:
Die voorwaardes sal wees:
[r12 + rbx*8]
moet na 'n adres wys wat 'n aanroepbare funksie stoor (as daar geen idee en geen pie is nie, kan jy net die _init
funksie gebruik):
As _init by 0x400560
is, gebruik GEF om 'n wysser in geheue daarna te soek en maak [r12 + rbx*8]
die adres met die wysser na _init:
rbp
en rbx
moet dieselfde waarde hê om die sprong te vermy
Daar is 'n paar weggelate pops wat jy in ag moet neem
Nog 'n manier om rdi
en rsi
vanaf die ret2csu gadget te beheer, is deur toegang te verkry tot spesifieke offsets:
Kyk na hierdie bladsy vir meer inligting:
BROP - Blind Return Oriented ProgrammingStel jou voor jy wil 'n syscall maak of 'n funksie soos write()
aanroep, maar jy het spesifieke waardes in die rdx
en rsi
registers as parameters nodig. Normaalweg sou jy soek na gadgets wat hierdie registers direk stel, maar jy kan nie enige vind nie.
Hier kom ret2csu in die spel:
Stel die Registers Op: Gebruik die eerste magiese gadget om waardes van die stapel af te pop en in rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), en r15 te plaas.
Gebruik die Tweede Gadget: Met daardie registers ingestel, gebruik jy die tweede gadget. Dit laat jou toe om jou gekose waardes in rdx
en rsi
(van r14 en r13, onderskeidelik) te beweeg, wat die parameters vir 'n funksie-aanroep voorberei. Boonop, deur r15
en rbx
te beheer, kan jy die program dwing om 'n funksie aan te roep wat geleë is by die adres wat jy bereken en in [r15 + rbx*8]
plaas.
Jy het 'n voorbeeld wat hierdie tegniek gebruik en dit hier verduidelik, en dit is die finale uitbuiting wat dit gebruik het:
Let daarop dat die vorige exploit nie bedoel is om 'n RCE
te doen nie, dit is bedoel om net 'n funksie genaamd win
aan te roep (wat die adres van win
van stdin wat gets in die ROP-ketting aanroep en dit in r15 stoor) met 'n derde argument met die waarde 0xdeadbeefcafed00d
.
Die volgende exploit is uit hierdie bladsy onttrek waar die ret2csu gebruik word, maar in plaas daarvan om die oproep te gebruik, is dit die vergelykings te omseil en die ret
na die oproep te bereik:
Gewoonlik is hierdie gevalle ook kwesbaar vir ret2plt + ret2lib, maar soms moet jy meer parameters beheer as wat maklik beheer kan word met die gadgets wat jy direk in libc vind. Byvoorbeeld, die write()
funksie vereis drie parameters, en om gadgets te vind om al hierdie direk in te stel mag nie moontlik wees nie.
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)