SROP - Sigreturn-Oriented Programming
Basiese Inligting
Sigreturn
is 'n spesiale syscall wat hoofsaaklik gebruik word om op te ruim nadat 'n seinhandler sy uitvoering voltooi het. Seine is onderbrekings wat deur die bedryfstelsel na 'n program gestuur word, dikwels om aan te dui dat 'n uitsonderlike situasie plaasgevind het. Wanneer 'n program 'n sein ontvang, pauzeer dit tydelik sy huidige werk om die sein met 'n seinhandler te hanteer, 'n spesiale funksie wat ontwerp is om met seine te werk.
Nadat die seinhandler klaar is, moet die program sy vorige toestand hervat asof niks gebeur het nie. Dit is waar sigreturn
in die spel kom. Dit help die program om terug te keer van die seinhandler en herstel die program se toestand deur die stapelraam (die gedeelte van geheue wat funksie-oproepe en plaaslike veranderlikes stoor) wat deur die seinhandler gebruik is, op te ruim.
Die interessante deel is hoe sigreturn
die program se toestand herstel: dit doen dit deur alle CPU se registerwaardes op die stapel te stoor. Wanneer die sein nie meer geblokkeer is nie, pop sigreturn
hierdie waardes van die stapel af, wat effektief die CPU se registers na hul toestand voor die sein hanteer is, reset. Dit sluit die stapelpunt-register (RSP) in, wat na die huidige bokant van die stapel wys.
Om die syscall sigreturn
van 'n ROP-ketting te bel en die registerwaardes wat ons wil hê dat dit in die stapel moet laai, by te voeg, is dit moontlik om alle registerwaardes te beheer en dus te bel byvoorbeeld die syscall execve
met /bin/sh
.
Let op hoe dit 'n type Ret2syscall sou wees wat dit baie makliker maak om parameters te beheer om ander Ret2syscalls aan te roep:
Ret2syscallAs jy nuuskierig is, dit is die sigcontext-struktuur wat in die stapel gestoor word om later die waardes te herstel (diagram van hier):
Vir 'n beter verduideliking kyk ook:
Voorbeeld
Jy kan hier 'n voorbeeld vind waar die oproep na signeturn via ROP saamgestel word (die waarde 0xf
in rxa plaas), alhoewel dit die finale uitbuiting van daar is:
Kontroleer ook die exploit van hier waar die binêre reeds sigreturn
aangeroep het en daarom is dit nie nodig om dit met 'n ROP te bou nie:
Ander Voorbeelde & Verwysings
Assembly binêre wat toelaat om na die stapel te skryf en dan die
sigreturn
syscall aanroep. Dit is moontlik om op die stapel 'n ret2syscall via 'n sigreturn struktuur te skryf en die vlag wat binne die geheue van die binêre is, te lees.Assembly binêre wat toelaat om na die stapel te skryf en dan die
sigreturn
syscall aanroep. Dit is moontlik om op die stapel 'n ret2syscall via 'n sigreturn struktuur te skryf (die binêre het die string/bin/sh
).64 bits, geen relro, geen canary, nx, geen pie. Eenvoudige buffer overflow wat die
gets
funksie misbruik met 'n gebrek aan gadgets wat 'n ret2syscall uitvoer. Die ROP-ketting skryf/bin/sh
in die.bss
deur weergets
aan te roep, dit misbruik diealarm
funksie om eax op0xf
te stel om 'n SROP aan te roep en 'n shell uit te voer.64 bits assembly program, geen relro, geen canary, nx, geen pie. Die vloei laat toe om in die stapel te skryf, verskeie registers te beheer, en 'n syscall aan te roep en dan
exit
aan te roep. Die geselekteerde syscall is 'nsigreturn
wat registre stel eneip
beweeg om 'n vorige syscall instruksie aan te roep enmemprotect
uit te voer om die binêre ruimte oprwx
te stel en die ESP in die binêre ruimte te stel. Volg die vloei, die program sal weer lees in ESP aanroep, maar in hierdie geval sal ESP na die volgende instruksie wys, sodat 'n shellcode as die volgende instruksie geskryf en uitgevoer sal word.SROP word gebruik om uitvoeringsregte (memprotect) aan die plek te gee waar 'n shellcode geplaas is.
Last updated