WWW2Exec - atexit()
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
__atexit Strukture
Tans is dit baie vreemd om dit te benut!
atexit()
is 'n funksie waaraan ander funksies as parameters oorgedra word. Hierdie funksies sal uitgevoer word wanneer 'n exit()
of die terugkeer van die hoofd uitgevoer word.
As jy die adres van enige van hierdie funksies kan wysig om na 'n shellcode te verwys, sal jy beheer oor die proses verkry, maar dit is tans meer ingewikkeld.
Tans is die adresse na die funksies wat uitgevoer moet word versteek agter verskeie strukture en uiteindelik is die adres waaraan dit verwys nie die adresse van die funksies nie, maar is geënkripteer met XOR en verskuiwings met 'n ewekansige sleutel. So tans is hierdie aanvalsvector nie baie nuttig nie, ten minste op x86 en x64_86.
Die enkripsiefunksie is PTR_MANGLE
. Ander argitekture soos m68k, mips32, mips64, aarch64, arm, hppa... implementeer nie die enkripsie funksie nie omdat dit diezelfde teruggee as wat dit as invoer ontvang het. So hierdie argitekture sou deur hierdie vektor aangeval kon word.
Jy kan 'n diepgaande verduideliking vind oor hoe dit werk in https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html
link_map
Soos verduidelik in hierdie pos, As die program verlaat deur return
of exit()
sal dit __run_exit_handlers()
uitvoer wat geregistreerde vernietigers sal aanroep.
As die program verlaat via _exit()
funksie, sal dit die exit
syscall aanroep en die uitgangshandelaars sal nie uitgevoer word nie. So, om te bevestig dat __run_exit_handlers()
uitgevoer word, kan jy 'n breekpunt daarop stel.
Die belangrike kode is (bron):
Note hoe map -> l_addr + fini_array -> d_un.d_ptr
gebruik word om die posisie van die array van funksies om aan te roep te bereken.
Daar is 'n paar opsies:
Oorskryf die waarde van
map->l_addr
om dit na 'n valsefini_array
met instruksies om arbitrêre kode uit te voer, te laat wys.Oorskryf
l_info[DT_FINI_ARRAY]
enl_info[DT_FINI_ARRAYSZ]
inskrywings (wat meer of minder aaneengeskakel in geheue is), om hulle na 'n vervalsteElf64_Dyn
struktuur te laat wys wat weerarray
na 'n geheue gebied wat die aanvaller beheer, sal laat wys.Hierdie skrywe oorskryf
l_info[DT_FINI_ARRAY]
met die adres van 'n beheerde geheue in.bss
wat 'n valsefini_array
bevat. Hierdie valse array bevat eers 'n one gadget adres wat uitgevoer sal word en dan die verskil tussen die adres van hierdie valse array en die waarde vanmap->l_addr
sodat*array
na die valse array sal wys.Volgens die hoofpos van hierdie tegniek en hierdie skrywe laat ld.so 'n wysser op die stapel wat na die binêre
link_map
in ld.so wys. Met 'n arbitrêre skrywe is dit moontlik om dit oor te skryf en dit na 'n valsefini_array
wat deur die aanvaller beheer word, te laat wys met die adres na 'n one gadget byvoorbeeld.
Volg die vorige kode kan jy 'n ander interessante afdeling met die kode vind:
In hierdie geval sal dit moontlik wees om die waarde van map->l_info[DT_FINI]
te oorskryf wat na 'n vervalste ElfW(Dyn)
struktuur wys. Vind meer inligting hier.
TLS-Storage dtor_list oorskrywing in __run_exit_handlers
__run_exit_handlers
Soos hier verduidelik, as 'n program via return
of exit()
verlaat, sal dit __run_exit_handlers()
uitvoer wat enige geregistreerde vernietigersfunksies sal aanroep.
Kode van _run_exit_handlers()
:
Kode van __call_tls_dtors()
:
Vir elke geregistreerde funksie in tls_dtor_list
, sal dit die pointer van cur->func
demangle en dit aanroep met die argument cur->obj
.
Deur die tls
funksie van hierdie fork van GEF te gebruik, is dit moontlik om te sien dat die dtor_list
eintlik baie naby die stack canary en PTR_MANGLE koekie is. So, met 'n oorgang daarop, sou dit moontlik wees om die koekie en die stack canary te oorwrite.
Deur die PTR_MANGLE koekie te oorwrite, sou dit moontlik wees om die PTR_DEMANLE
funksie te omseil deur dit op 0x00 te stel, wat beteken dat die xor
wat gebruik word om die werklike adres te kry net die adres is wat geconfigureer is. Dan, deur op die dtor_list
te skryf, is dit moontlik om verskeie funksies met die funksie adres en sy argument te ketting.
Laastens, let daarop dat die gestoor pointer nie net met die koekie xored gaan word nie, maar ook 17 bits gedraai sal word:
So jy moet dit in ag neem voordat jy 'n nuwe adres byvoeg.
Vind 'n voorbeeld in die oorspronklike pos.
Ander gemanipuleerde wysers in __run_exit_handlers
__run_exit_handlers
Hierdie tegniek is hier verduidelik en hang weer af van die program wat verlaat deur return
of exit()
aan te roep sodat __run_exit_handlers()
aangeroep word.
Kom ons kyk na meer kode van hierdie funksie:
Die veranderlike f
verwys na die initial
struktuur en afhangende van die waarde van f->flavor
sal verskillende funksies aangeroep word.
Afhangende van die waarde, sal die adres van die funksie om aan te roep in 'n ander plek wees, maar dit sal altyd demangled wees.
Boonop is dit in die opsies ef_on
en ef_cxa
ook moontlik om 'n argument te beheer.
Dit is moontlik om die initial
struktuur in 'n foutopsporing sessie met GEF wat gef> p initial
loop, te kontroleer.
Om dit te misbruik, moet jy ofwel die leak of die PTR_MANGLE
cookie verwyder en dan 'n cxa
inskrywing in initial oorskryf met system('/bin/sh')
.
Jy kan 'n voorbeeld hiervan vind in die oorspronklike blogpos oor die tegniek.
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated