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。查看此示例:,您可以阅读有关滥用格式字符串以读取任意内存地址的内容:
这个挑战以一种非常简单的方式滥用格式字符串来从栈中读取canary。
如果您想看到您的公司在HackTricks中做广告或下载PDF格式的HackTricks,请查看!
获取
探索,我们的独家
加入 💬 或 或在Twitter上关注我们 🐦 。
通过向和 github仓库提交PR来分享您的黑客技巧。