Print Stack Canary
放大打印的栈
想象一种情况,一个容易受到栈溢出攻击的程序可以执行一个指向栈溢出部分的puts函数。攻击者知道canary的第一个字节是空字节(\x00
),其余的canary是随机字节。然后,攻击者可以创建一个溢出,覆盖栈直到canary的第一个字节。
然后,攻击者在有效负载的中间调用puts功能,这将打印所有canary(除了第一个空字节)。
有了这些信息,攻击者可以构造并发送一个新的攻击,知道canary(在同一个程序会话中)。
显然,这种策略非常受限,因为攻击者需要能够打印他的有效负载的内容,以外泄canary,然后能够创建一个新的有效负载(在同一个程序会话中)并发送****真正的缓冲区溢出。
CTF示例:
64位,启用ASLR但没有PIE,第一步是填充溢出直到canary的字节0x00,然后调用puts泄漏它。使用canary创建ROP小工具来调用puts以泄漏GOT中puts的地址,然后使用ROP小工具调用
system('/bin/sh')
32位,ARM,无relro,canary,nx,无pie。溢出并调用puts以泄漏canary + ret2lib调用
system
,使用ROP链来弹出r0(参数/bin/sh
)和pc(system的地址)
任意读取
通过类似格式字符串提供的任意读取,可能可以泄漏canary。查看此示例:https://ir0nstone.gitbook.io/notes/types/stack/canaries,您可以阅读有关滥用格式字符串以读取任意内存地址的内容:
Format Strings这个挑战以一种非常简单的方式滥用格式字符串来从栈中读取canary。
最后更新于