Ret2esp / Ret2reg
Ret2esp
Kwa sababu ESP (Stack Pointer) daima inaelekeza juu ya steki, mbinu hii inahusisha kubadilisha EIP (Instruction Pointer) na anwani ya maagizo ya jmp esp
au call esp
. Kwa kufanya hivi, shellcode inawekwa moja kwa moja baada ya EIP iliyobadilishwa. Wakati maagizo ya ret
yanatekelezwa, ESP inaelekeza kwenye anwani inayofuata, mahali ambapo shellcode imewekwa kwa usahihi.
Ikiwa Address Space Layout Randomization (ASLR) haijashughulikiwa kwenye Windows au Linux, inawezekana kutumia maagizo ya jmp esp
au call esp
yaliyopatikana kwenye maktaba za pamoja. Walakini, na ASLR ikiwa haijashughulikiwa, inaweza kuhitajika kutazama ndani ya programu yenye kasoro yenyewe kwa maagizo haya (na unaweza kuhitaji kushinda PIE).
Zaidi ya hayo, kuweza kuweka shellcode baada ya uharibifu wa EIP, badala ya katikati ya steki, kuhakikisha kuwa maagizo ya push
au pop
yanayotekelezwa wakati wa operesheni ya kazi hayavurugi shellcode. Kuvuruga huku kunaweza kutokea ikiwa shellcode ingewekwa katikati ya steki ya kazi.
Ukosefu wa nafasi
Ikiwa unakosa nafasi ya kuandika baada ya kubadilisha RIP (labda tu baadhi ya baiti), andika shellcode ya awali ya jmp
kama:
Na andika shellcode mapema kwenye stack.
Mfano
Unaweza kupata mfano wa mbinu hii katika https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp na shambulio la mwisho kama:
Unaweza kuona mfano mwingine wa mbinu hii katika https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. Kuna kipeperushi cha kujaza bila NX kuwezeshwa, hutumiwa kifaa cha kupunguza anwani ya $esp
na kisha jmp esp;
ili kuruka kwenye shellcode:
Ret2reg
Vivyo hivyo, ikiwa tunajua kazi inarudisha anwani ambapo shellcode imewekwa, tunaweza kutumia maagizo ya call eax
au jmp eax
(inayojulikana kama mbinu ya ret2eax), kutoa njia nyingine ya kutekeleza shellcode yetu. Kama eax, daftari lingine lolote lenye anwani ya kuvutia linaweza kutumika (ret2reg).
Mfano
Unaweza kupata mifano hapa:
strcpy
itahifadhi katikaeax
anwani ya buffer ambapo shellcode ilihifadhiwa naeax
haibadilishwi, hivyo niwezekana kutumiaret2eax
.
ARM64
Ret2sp
Katika ARM64 hakuna maagizo yanayoruhusu kuruka kwenye daftari la SP. Inaweza kuwa inawezekana kupata kifaa kinachohamisha sp kwa daftari kisha kuruka kwenye daftari hilo, lakini katika libc ya kali yangu sikuweza kupata kifaa kama hicho:
Niliyogundua zingine zitabadilisha thamani ya usajili ambapo sp ilikopiwa kabla ya kuruka kwenda kwake (kwa hivyo itakuwa haifai):
Ret2reg
Ikiwa usajili una anwani ya kuvutia ni rahisi kuruka kwenda kwake kwa kupata maagizo sahihi. Unaweza kutumia kitu kama:
Katika ARM64, ni x0
ambaye huchukua thamani ya kurudi kwa kazi, kwa hivyo inaweza kuwa kwamba x0 inahifadhi anwani ya buffer inayodhibitiwa na mtumiaji na shellcode ya kutekelezwa.
Mfano wa nambari:
Kwa kuchunguza disassembly ya kazi, ni wazi kuona kwamba anwani ya buffer (inayoweza kudhuriwa na bof na kudhibitiwa na mtumiaji) imehifadhiwa katika x0
kabla ya kurudi kutoka kwa buffer overflow:
Pia ni rahisi kupata kifaa cha br x0
katika kazi ya do_stuff
:
Tutatumia kifaa hicho kuruka kwenda kwake kwa sababu binary imekamilika BILA PIE. Kwa kutumia mfano, ni wazi kuona kwamba kielelezo cha buffer overflow ni 80, hivyo shambulio litakuwa:
Ikiwa badala ya fgets
ingetumika kitu kama read
, ingewezekana kudukua PIE pia kwa kuweka tu byte za mwisho 2 za anwani ya kurudi kurudi kwenye maagizo ya br x0;
bila haja ya kujua anwani kamili.
Na fgets
haitafanyi kazi kwa sababu inaweka null (0x00) byte mwishoni.
Kinga
NX: Ikiwa steki haiwezi kutekelezwa hii haitasaidia kwani tunahitaji kuweka shellcode kwenye steki na kuruka kuitekeleza.
Marejeo
Last updated