参考
jakespringer/angr_ctf
ZERO-A-ONE/AngrCTF_FITM: Angr CTF From introduction to mastery
概念
1 2 3 4 5 6 7 8 9 10 11
| 一个具有动态符号执行和静态分析的二进制分析工具,帮助我们自动化地分析和探索二进制文件中的执行路径。
原理: 符号:符号是代表一组可能值的抽象。例如,一个符号 x 可能代表任意整数。 路径约束:在执行过程中,程序的控制流会根据条件分支创建不同的执行路径。符号执行会收集这些条件分支的约束,形成路径约束。
执行过程: 初始化:符号执行开始时,程序输入(如函数参数、全局变量等)被赋予符号值。 执行:程序按照正常流程执行,但所有操作都是对符号值进行的。 路径探索:在遇到条件分支时,符号执行会探索所有可能的路径。对于每个分支,它都会假设条件为真和假,并分别记录下相应的路径约束。 约束求解:符号执行完成后,分析人员可以对这些路径约束进行求解,以找到满足特定路径的具体输入值。
|
使用 Angr 的步骤可以分为:
- 创建 project
- 设置 state
- 新建符号量 : BVS (bitvector symbolic ) 或 BVV (bitvector value)
- 把符号量设置到内存或者其他地方
- 设置 Simulation Managers , 进行路径探索的对象
- 运行,探索满足路径需要的值
- 约束求解,获取执行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| project = angr.Project(path_to_binary)
initial_state = project.factory.entry_state() initial_state = project.factory.blank_state(addr=0x400560)
argv1 = claripy.BVS("argv1", 100 * 8) passwd_size_in_bits = 32 passwd0 = claripy.BVS('passwd0', passwd_size_in_bits)
initial_state.regs.eax = passwd0
simulation = project.factory.simgr(initial_state)
simulation.explore(find=find_condition, avoid=avoid_condition)
if simulation.found: solution_state = simulation.found[0] solution = solution_state.posix.dumps(0) if simulation.found: solution_state = simulation.found[0] passwodr1 = solution_state.solver.eval(argv1)
|
例题(网鼎 vm)
1 2 3 4 5 6 7
| 起始找寻位置,我们可以选main, 也可以选特定验证函数, 但是需要注意的是, 数据的找寻 需要到达的路径为: success, flag这种成功的路径 避免走的路径便为失败路径 所以我们需要在ida找着三条路. 起初我选了vm_operate这个函数作为起始找寻位置,但是没有成功, 后面我选了main函数 需要到达的路径便为输出flag处 避免走的路径则是exit这种
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import angr
p = angr.Project('./signal.exe')
state = p.factory.entry_state()
simgr = p.factory.simgr(state)
simgr.explore(find=0x004017A5, avoid=0x004016E6)
flag = simgr.found[0].posix.dumps(0)[:15]
print(flag)
|
state:直接创建一个程序的入口状态为起点
avoid:选择 what a shamme 所在地址就是不要走这条路

find:就是希望走到的路
