Print Stack Canary
放大打印的栈
想象一种情况,一个容易受到栈溢出攻击的程序可以执行一个指向栈溢出部分的puts函数。攻击者知道canary的第一个字节是空字节(\x00
),其余的canary是随机字节。然后,攻击者可以创建一个溢出,覆盖栈直到canary的第一个字节。
然后,攻击者在有效负载的中间调用 puts 功能,这将打印所有的canary(除了第一个空字节)。
有了这些信息,攻击者可以构造并发送一个新的攻击,知道了canary(在同一个程序会话中)。
显然,这种策略非常受限,因为攻击者需要能够打印他的有效负载的内容以外泄canary,然后能够创建一个新的有效负载(在同一个程序会话中)并发送真正的缓冲区溢出。
CTF 示例:
64 位,启用 ASLR 但没有 PIE,第一步是填充溢出直到 canary 的字节 0x00,然后调用 puts 泄露它。使用 canary 创建 ROP gadget 来调用 puts 以泄露 GOT 中 puts 的地址,然后使用 ROP gadget 调用
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 ,您可以阅读关于滥用格式字符串以读取任意内存地址的内容。
这个挑战以一种非常简单的方式滥用格式字符串来从栈中读取 canary。
Last updated