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

问题背景

检测二进制文件是否开启了栈保护(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)"

结果判断:

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

file target_program

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

核心结论

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