hacktricks/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md

55 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 打印栈保护 Canaries
{% hint style="success" %}
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持 HackTricks</summary>
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**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>
{% endhint %}
## 放大打印的栈
想象一种情况,一个**容易受到栈溢出攻击**的程序可以执行一个**指向栈溢出部分**的**puts**函数。攻击者知道**canary的第一个字节是空字节**(`\x00`)其余的canary是**随机**字节。然后,攻击者可以创建一个溢出,**覆盖栈直到canary的第一个字节**。
然后,攻击者在有效负载的中间**调用 puts 功能**,这将**打印所有的canary**(除了第一个空字节)。
有了这些信息,攻击者可以**构造并发送一个新的攻击**知道了canary在**同一个程序会话**中)。
显然,这种策略非常**受限**,因为攻击者需要能够**打印**他的**有效负载**的**内容**以**外泄canary**,然后能够创建一个新的有效负载(在**同一个程序会话**中)并**发送**真正的缓冲区溢出。
**CTF 示例:**&#x20;
* [**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第一步是填充溢出直到 canary 的字节 0x00然后调用 puts 泄露它。使用 canary 创建 ROP gadget 来调用 puts 以泄露 GOT 中 puts 的地址,然后使用 ROP gadget 调用 `system('/bin/sh')`
* [**https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html)
* 32 位ARM没有 relrocanarynx没有 pie。溢出并调用 puts 来泄露 canary + ret2lib 调用 `system` 以及 ROP 链来弹出 r0参数 `/bin/sh`)和 pcsystem 的地址)
## 任意读取
通过类似格式**字符串**提供的**任意读取**,可能可以泄露 canary。查看这个例子[**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) ,您可以阅读关于滥用格式字符串以读取任意内存地址的内容。
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
* 这个挑战以一种非常简单的方式滥用格式字符串来从栈中读取 canary。
{% hint style="success" %}
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持 HackTricks</summary>
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**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>
{% endhint %}