问题背景
检测二进制文件是否开启了栈保护(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
ort26h