mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
2.4 KiB
2.4 KiB
打印栈金丝雀
{{#include ../../../banners/hacktricks-training.md}}
扩大打印的栈
想象一个情况,其中一个易受攻击的程序可以执行一个puts函数,指向****栈溢出的一部分。攻击者知道金丝雀的第一个字节是一个空字节(\x00),其余的金丝雀是随机字节。然后,攻击者可以创建一个溢出,覆盖栈直到金丝雀的第一个字节。
然后,攻击者在有效负载的中间调用puts功能,这将打印所有金丝雀(除了第一个空字节)。
有了这些信息,攻击者可以制作并发送一个新的攻击,知道金丝雀(在同一程序会话中)。
显然,这种战术是非常受限的,因为攻击者需要能够打印其有效负载的内容以提取金丝雀,然后能够创建一个新的有效负载(在同一程序会话中)并发送****真实的缓冲区溢出。
CTF示例:
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64位,启用ASLR但没有PIE,第一步是填充溢出直到金丝雀的字节0x00,然后调用puts并泄漏它。利用金丝雀创建一个ROP小工具来调用puts以泄漏GOT中puts的地址,然后是一个ROP小工具来调用
system('/bin/sh') - https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html
- 32位,ARM,无relro,金丝雀,nx,无pie。通过调用puts来溢出以泄漏金丝雀 + ret2lib调用
system,使用ROP链弹出r0(参数/bin/sh)和pc(system的地址)
任意读取
通过任意读取,例如格式字符串提供的,可能泄漏金丝雀。查看这个例子:https://ir0nstone.gitbook.io/notes/types/stack/canaries,你可以阅读关于滥用格式字符串以读取任意内存地址的内容:
{{#ref}} ../../format-strings/ {{#endref}}
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- 这个挑战以非常简单的方式滥用格式字符串从栈中读取金丝雀
{{#include ../../../banners/hacktricks-training.md}}