在 GDB 中使用 angr。根据当前调试器状态创建 angr 状态。
pip install angrgdb
echo "python import angrgdb.commands" >> ~/.gdbinit
angrgdb 在 GDB 中实现了 angrdbg API。
你可以在脚本中这样使用:
from angrgdb import *
gdb.execute("b *0x004005f9")
gdb.execute("r aaaaaaaa")
sm = StateManager()
sm.sim(sm["rax"], 100)
m = sm.simulation_manager()
m.explore(find=0x00400607, avoid=0x00400613)
sm.to_dbg(m.found[0]) #write input to GDB
gdb.execute("x/s $rax")
#0x7fffffffe768: "ais3{I_tak3_g00d_n0t3s}"
gdb.execute("c")
#Correct! that is the secret key!
你也可以在 GDB 中直接使用 angrgdb 命令来处理简单任务:
angrgdb sim <寄存器名称> [大小] 符号化一个寄存器angrgdb sim <地址> [大小] 符号化一个内存区域angrgdb list 列出所有已设置为符号化的项angrgdb find <地址0> <地址1> ... <地址N> 设置查找目标列表angrgdb avoid <地址0> <地址1> ... <地址N> 设置避免目标列表angrgdb reset 重置上下文(符号化值和目标)angrgdb run 从调试器状态生成状态并运行探索angrgdb shell 打开一个 shell,其中包含从当前 GDB 状态创建的 StateManager 实例angrgdb interactive 从调试器状态生成状态,并使用修改版的 angr-cli 手动探索以下是一个使用 angrgdb+GEF+idb2gdb 解决 crackme 的示例:
如果你不想在命令行中使用 angrgdb,而想使用 Python 脚本,可以参考以下提示。
在 GDB 中使用 source script.py 加载脚本。
论文 PDF.
Bibtex:
@misc{fioraldi2020symbolic,
title={Symbolic Execution and Debugging Synchronization},
author={Andrea Fioraldi},
year={2020},
eprint={2006.16601},
archivePrefix={arXiv},
primaryClass={cs.CR}
}