Ret2csu
https://www.scs.stanford.edu/brop/bittau-brop.pdfBasiese Inligting
ret2csu is 'n haktegniek 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 gebruik (soos libc), het dit 'n paar ingeboude funksies om te bestuur hoe verskillende dele van die program met mekaar praat. Onder hierdie funksies is daar 'n paar verborge juwele wat as ons ontbrekende gadgets kan optree, veral een genaamd __libc_csu_init
.
Die Tovergadgets in __libc_csu_init
In __libc_csu_init
is daar twee reekse instruksies (gadgets) om uit te lig:
Die eerste reeks laat ons toe om waardes in verskeie registers (rbx, rbp, r12, r13, r14, r15) op te stel. Dit is soos gleuwe waar ons getalle of adresse wat ons later wil gebruik, kan stoor.
Hierdie toestel stel ons in staat om hierdie registers te beheer deur waardes van die stok af te haal en in hulle te plaas.
Die tweede reeks gebruik die waardes wat ons opgestel het om 'n paar dinge te doen:
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 plek wat bepaal word deur die waardes in r15 en rbx bymekaar te tel, en dan rbx met 8 te vermenigvuldig.
Dalk weet jy nie enige adres om daar te skryf nie en jy benodig 'n
ret
instruksie. Let daarop dat die tweede gadget ook sal eindig in 'nret
, maar jy sal aan 'n paar 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 vir 'n wyser in die geheue na dit te soek en maak[r12 + rbx*8]
die adres met die wyser na _init:
rbp
enrbx
moet dieselfde waarde hê om die sprong te vermyDaar is 'n paar weggelaatde pops wat jy in ag moet neem
RDI en RSI
'n Ander manier om rdi
en rsi
van die ret2csu-toestel te beheer is deur dit spesifieke offsette te benader:
Kyk na hierdie bladsy vir meer inligting:
pageBROP - Blind Return Oriented ProgrammingVoorbeeld
Die gebruik van die oproep
Stel jou voor jy wil 'n stelseloproep 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 instel, maar jy kan nie enige vind nie.
Hier kom ret2csu in spel:
Stel die Registers Op: Gebruik die eerste "magic gadget" om waardes van die stok af te haal 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
enrsi
te plaas (vanaf r14 en r13 onderskeidelik), wat parameters gereed maak vir 'n funksieoproep. Verder, deurr15
enrbx
te beheer, kan jy die program 'n funksie laat aanroep wat by die adres geleë is 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 wel dat die vorige aanval nie bedoel is om 'n RCE
uit te voer nie, dit is bloot bedoel om 'n funksie genaamd win
aan te roep (die adres van win
neem vanaf stdin deur gets in die ROP-ketting te roep en dit in r15 te stoor) met 'n derde argument met die waarde 0xdeadbeefcafed00d
.
Oorbrugging van die oproep en bereiking van ret
Die volgende aanval is onttrek vanaf hierdie bladsy waar die ret2csu gebruik word, maar in plaas daarvan om die oproep te gebruik, word die vergelykings omseil en word die ret
na die oproep bereik:
Hoekom nie net libc direk gebruik nie?
Gewoonlik is hierdie gevalle ook vatbaar 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 dit mag nie moontlik wees om gadgets te vind om al hierdie direk in te stel nie.
Last updated