WWW2Exec - atexit()
Last updated
Last updated
Leer & oefen AWS Hack:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hack: HackTricks Opleiding GCP Red Team Expert (GRTE)
Tans is dit baie vreemd om dit uit te buit!
atexit()
is 'n funksie waar ander funksies as parameters oorgedra word. Hierdie funksies sal uitgevoer word wanneer 'n exit()
uitgevoer word of die terugkeer van die hooffunksie.
As jy die adres van enige van hierdie funksies kan wysig om na 'n shell-kode byvoorbeeld te wys, sal jy beheer oor die proses kry, maar dit is tans meer ingewikkeld.
Tans is die adresse van die funksies wat uitgevoer moet word, versteek agter verskeie strukture en uiteindelik is die adres waarna dit wys nie die adresse van die funksies nie, maar is versleutel met XOR en verskuiwings met 'n willekeurige sleutel. Dus is hierdie aanvalsvektor tans nie baie nuttig ten minste op x86 en x64_86 nie.
Die versleutelingsfunksie is PTR_MANGLE
. Ander argitekture soos m68k, mips32, mips64, aarch64, arm, hppa... implementeer nie die versleuteling-funksie nie omdat dit dieselfde teruggee as wat dit as inset ontvang het. Dus sou hierdie argitekture vatbaar wees vir hierdie vektor.
Jy kan 'n diepgaande verduideliking vind oor hoe dit werk by https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html
Soos verduidelik in hierdie pos, As die program afsluit deur return
of exit()
te gebruik, sal dit __run_exit_handlers()
hardloop wat geregistreerde vernietigers sal roep.
As die program afsluit via _exit()
-funksie, sal dit die exit
-systaalaanroep roep en die afsluit-handelaars sal nie uitgevoer word nie. Om te bevestig dat __run_exit_handlers()
uitgevoer word, kan jy 'n breekpunt daarop stel.
Die belangrike kode is (bron):
Merk op hoe map -> l_addr + fini_array -> d_un.d_ptr
gebruik word om die posisie van die array van funksies om te roep te bereken.
Daar is 'n paar opsies:
Oorskryf die waarde van map->l_addr
om dit te laat wys na 'n vals fini_array
met instruksies om willekeurige kode uit te voer
Oorskryf l_info[DT_FINI_ARRAY]
en l_info[DT_FINI_ARRAYSZ]
inskrywings (wat min of meer opeenvolgend in die geheue is), om hulle te laat wys na 'n vervals Elf64_Dyn
struktuur wat weer array
laat wys na 'n geheue sonde wat deur die aanvaller beheer word.
Hierdie uiteensetting oorskryf l_info[DT_FINI_ARRAY]
met die adres van 'n beheerde geheue in .bss
wat 'n vals fini_array
bevat. Hierdie valse array bevat eerstens 'n een gadget adres wat uitgevoer sal word en dan die verskil tussen die adres van hierdie vals array en die waarde van map->l_addr
sodat *array
na die valse array wys.
Volgens die hoofpos van hierdie tegniek en hierdie uiteensetting laat ld.so 'n aanwysing op die stapel wat wys na die binêre link_map
in ld.so. Met 'n willekeurige skryf is dit moontlik om dit te oorskryf en dit te laat wys na 'n vals fini_array
wat deur die aanvaller beheer word met die adres na 'n een gadget byvoorbeeld.
Na die vorige kode kan jy 'n ander interessante afdeling met die kode vind:
In hierdie geval sou dit moontlik wees om die waarde van map->l_info[DT_FINI]
te oorskryf wat na 'n vervalsde ElfW(Dyn)
struktuur wys. Vind meer inligting hier.
__run_exit_handlers
Soos hier verduidelik, as 'n program afsluit via return
of exit()
, sal dit __run_exit_handlers()
uitvoer wat enige vernietigersfunksie wat geregistreer is, sal aanroep.
Kode van _run_exit_handlers()
:
Kode van __call_tls_dtors()
:
Vir elke geregistreerde funksie in tls_dtor_list
, sal dit die pointer vanaf cur->func
demangle en dit oproep 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
baie naby aan die stapel kanarie en PTR_MANGLE koekie is. Dus, met 'n oorvloei daarop sou dit moontlik wees om die koekie en die stapel kanarie te owerwrite.
Deur die PTR_MANGLE koekie te oorskryf, sou dit moontlik wees om die PTR_DEMANLE
funksie te verbygaan deur dit in te stel op 0x00, wat beteken dat die xor
wat gebruik word om die werklike adres te kry, net die gekonfigureerde adres is. Dan, deur te skryf na die dtor_list
is dit moontlik om verskeie funksies aan mekaar te koppel met die funksie adres en sy argument.
Laastens, let daarop dat die gestoorde pointer nie net met die koekie ge-xor sal word nie, maar ook 17 bietjies geroteer sal word:
So jy moet hierdie in ag neem voordat jy 'n nuwe adres byvoeg.
Vind 'n voorbeeld in die oorspronklike pos.
__run_exit_handlers
Hierdie tegniek word hier verduidelik en hang weer af van die program wat afsluit deur return
of exit()
te roep sodat __run_exit_handlers()
geroep word.
Laat ons meer kode van hierdie funksie nagaan:
Die veranderlike f
wys na die initial
struktuur en afhangende van die waarde van f->flavor
sal verskillende funksies aangeroep word.
Afhanklik van die waarde sal die adres van die funksie om te roep in 'n ander plek wees, maar dit sal altyd gedekodeer wees.
Verder, in die opsies ef_on
en ef_cxa
is dit ook moontlik om 'n argument te beheer.
Dit is moontlik om die initial
struktuur in 'n foutopsporing-sessie met GEF hardloop gef> p initial
te kontroleer.
Om hiervan misbruik te maak, moet jy ofwel die PTR_MANGLE
koekie lek of uitvee 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.