Print Stack Canary
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
想象一个情况,一个 易受攻击的程序 可以执行一个 puts 函数 指向 栈溢出 的 部分。攻击者知道 金丝雀的第一个字节是一个空字节 (\x00
),其余的金丝雀是 随机 字节。然后,攻击者可以创建一个溢出,覆盖栈直到金丝雀的第一个字节。
然后,攻击者 在有效负载的中间调用 puts 功能,这将 打印所有金丝雀(除了第一个空字节)。
有了这些信息,攻击者可以 构造并发送一个新攻击,知道金丝雀(在同一程序会话中)。
显然,这种策略是非常 受限 的,因为攻击者需要能够 打印 他的 有效负载 的 内容 来 提取 金丝雀,然后能够创建一个新的有效负载(在 同一程序会话 中)并 发送 真正的缓冲区溢出。
CTF 示例:
64 位,启用 ASLR 但没有 PIE,第一步是填充溢出直到金丝雀的字节 0x00,然后调用 puts 并泄露它。利用金丝雀创建一个 ROP gadget 来调用 puts 泄露 GOT 中 puts 的地址,然后是一个 ROP gadget 来调用 system('/bin/sh')
32 位,ARM,无 relro,金丝雀,nx,无 pie。通过对其调用 puts 来溢出以泄露金丝雀 + ret2lib 调用 system
,使用 ROP 链弹出 r0(参数 /bin/sh
)和 pc(system 的地址)
通过 任意读取,如格式 字符串 提供的,可能泄露金丝雀。查看这个例子:https://ir0nstone.gitbook.io/notes/types/stack/canaries,你可以阅读关于滥用格式字符串以读取任意内存地址的内容:
Format Strings这个挑战以非常简单的方式滥用格式字符串从栈中读取金丝雀
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)