Ret2win
Basiese Inligting
Ret2win-uitdagings is 'n gewilde kategorie in Capture The Flag (CTF)-kompetisies, veral in take wat binêre uitbuiting behels. Die doel is om 'n kwesbaarheid in 'n gegewe binêre lêer uit te buit om 'n spesifieke, onaangeroepe funksie binne die binêre lêer uit te voer, dikwels iets soos win
, flag
, ens. Hierdie funksie druk gewoonlik 'n vlag of 'n suksesboodskap uit wanneer dit uitgevoer word. Die uitdaging behels tipies die oorskrywing van die terugkeeradres op die stapel om die uitvoervloei na die gewenste funksie te stuur. Hier is 'n meer gedetailleerde verduideliking met voorbeelde:
C-voorbeeld
Beskou 'n eenvoudige C-program met 'n kwesbaarheid en 'n win
-funksie wat ons beoog om te roep:
Om hierdie program te kompileer sonder stapelbeskerming en met ASLR gedeaktiveer, kan jy die volgende bevel gebruik:
-m32
: Kompileer die program as 'n 32-bis binêre (dit is opsioneel maar algemeen in CTF-uitdagings).-fno-stack-protector
: Deaktiveer beskerming teen stoor oorvloei.-z execstack
: Staan die uitvoering van kode op die stoor toe.-no-pie
: Deaktiveer Posisioneel Onafhanklike Uitvoerbare om te verseker dat die adres van diewin
-funksie nie verander nie.-o vulnerable
: Noem die uitvoer lêervulnerable
.
Python Uitbuiting met behulp van Pwntools
Vir die uitbuiting, sal ons pwntools gebruik, 'n kragtige CTF-raamwerk vir die skryf van uitbuitings. Die uitbuitingskrip sal 'n lading skep om die buffer te oorvloei en die terugkeeradres met die adres van die win
-funksie te oorskryf.
Om die adres van die win
funksie te vind, kan jy gdb, objdump, of enige ander gereedskap gebruik wat jou in staat stel om binêre lêers te inspekteer. Byvoorbeeld, met objdump
, kan jy die volgende gebruik:
Hierdie bevel sal jou die samestelling van die win
-funksie wys, insluitend sy beginadres.
Die Python-skrip stuur 'n sorgvuldig saamgestelde boodskap wat, wanneer verwerk deur die vulnerable_function
, die buffer oorloop en die terugkeeradres op die stapel oorskryf met die adres van win
. Wanneer vulnerable_function
terugkeer, spring dit na win
in plaas daarvan om na main
terug te keer of af te sluit, en die boodskap word gedruk.
Beskermings
PIE moet gedeaktiveer word sodat die adres betroubaar oor uitvoerings is of die adres waar die funksie gestoor sal word, sal nie altyd dieselfde wees nie en jy sou 'n lek nodig hê om uit te vind waar die
win
-funksie gelaai is. In sommige gevalle, wanneer die funksie wat die oorloop veroorsaakread
of soortgelyk is, kan jy 'n Gedeeltelike Oorskrywing van 1 of 2 byte doen om die terugkeeradres te verander om diewin
-funksie te wees. As gevolg van hoe ASLR werk, is die laaste drie heks-nibbles nie willekeurig nie, so daar is 'n 1/16 kans (1 nibble) om die korrekte terugkeeradres te kry.Stapelkanaries moet ook gedeaktiveer word, anders sal die gekompromitteerde EIP terugkeeradres nooit gevolg word nie.
Ander voorbeelde & Verwysings
32-bis, geen ASLR
64-bis met ASLR, met 'n lek van die bin-adres
64-bis, geen ASLR
32-bis, geen ASLR, dubbele klein oorloop, eerste om die stapel te oorloop en die grootte van die tweede oorloop te vergroot
32-bis, relro, geen kanarie, nx, geen pie, formaatstring om die adres
fflush
met diewin
-funksie te oorskryf (ret2win)32-bis, nx, niks anders, gedeeltelike oorskrywing van EIP (1Byte) om die
win
-funksie te roep32-bis, nx, niks anders, gedeeltelike oorskrywing van EIP (1Byte) om die
win
-funksie te roepDie program valideer slegs die laaste byte van 'n nommer om vir die grootte van die inset te kyk, daarom is dit moontlik om enige grootte by te voeg solank die laaste byte binne die toegelate reeks is. Dan skep die inset 'n bufferoorloop wat uitgebuit word met 'n ret2win.
64-bis, relro, geen kanarie, nx, pie. Gedeeltelike oorskrywing om die
win
-funksie te roep (ret2win)arm64, PIE, dit gee 'n PIE-lek die
win
-funksie is eintlik 2 funksies, dus ROP-gadget wat 2 funksies oproepARM64, off-by-one om 'n
win
-funksie te roep
ARM64 Voorbeeld
pageRet2win - arm64Last updated