Angr无法求解GoogleCTF入门逆向题,运行脚本无输出求故障原因
代码无法正常运行的常见原因及解决方案
1. 地址配置错误
你设置的find_addr和avoid_addr需要和二进制实际加载后的地址完全匹配:
- 确认Ghidra加载二进制时是否正确开启了基址偏移匹配,是否将PIC二进制的基址手动设置为了
0x100000,如果Ghidra默认的基址不是该值,你找到的成功/失败地址会存在偏移,导致angr无法命中目标地址。 - 确认
find_addr指向的是成功输出flag/提示成功的指令位置,而不是该函数的返回地址或者其他相邻位置。
2. 搜索空间过大未添加前置约束
该题的flag符合标准CTF格式,固定前缀为CTF{,后缀为},你当前只添加了可打印字符约束,15位可打印字符的搜索空间极大,符号执行短时间内无法找到合法路径:
可以在字符约束部分增加固定前缀的约束,示例:
# 增加固定前缀约束 CTF{ state.solver.add(flag_chars[0] == ord('C')) state.solver.add(flag_chars[1] == ord('T')) state.solver.add(flag_chars[2] == ord('F')) state.solver.add(flag_chars[3] == ord('{')) # 增加固定后缀约束 state.solver.add(flag_chars[-1] == ord('}'))
3. Unicorn引擎兼容问题
WSL2环境下Unicorn模拟经常出现兼容性问题,容易导致执行卡住或者路径探索异常,你可以先移除Unicorn加速选项,修改state初始化代码:
state = proj.factory.full_init_state( args=['./a.out'], stdin=flag, )
4. FLAG长度配置错误
确认你设置的FLAG_LEN = 15和题目的实际flag长度匹配,如果长度设置错误,会导致符号执行无法匹配正确的输入校验逻辑,找不到合法路径。
5. 其他排查方向
- 确认你下载的题目二进制正确,且
./a.out有可执行权限,架构为x86_64,angr可以正常识别。 - 执行时增加
verbosity=1参数查看探索进度,确认代码是在运行中还是已经终止没有找到符合条件的路径:
simgr.explore(find=find_addr, avoid=avoid_addr, verbosity=1)
内容的提问来源于stack exchange,提问作者Woo Byeong Su
相关产品推荐
相关产品推荐

