strings 找不到 __stack_chk_fail,如何检测二进制保护?

未分类 4 浏览 1 分钟阅读

问题背景

检测二进制文件是否开启了栈保护(Canary),通常使用 strings | grep __stack_chk_fail。但如果二进制文件被 strip(剥离了符号表),这个方法就会失效,返回空结果。

解决方案

方法一:动态测试法(最可靠)

通过构造栈溢出,观察程序崩溃时的行为来判断。

dd if=/dev/zero bs=5000 count=1 2>/dev/null | tr "\0" "A" > payload.txt
./target_program "$(cat payload.txt)"

结果判断:

  • 输出 *** stack smashing detected *** → ✅ 有 Canary 保护
  • 输出 Segmentation fault → ❌ 无 Canary 保护

方法二:检查文件是否被 strip

file target_program

输出包含 stripped → 符号表已被删除

核心结论

静态检测失败 → 用动态测试。strings 无结果 ≠ 无保护(可能被 strip)。动态测试是金标准:触发溢出看是否报 stack smashing。

1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注