使用 angr/radare2 估计给定组装块的值

逆向工程 雷达2 Python 愤怒
2021-06-11 19:45:55

我目前正在使用radare2来构建一个简单的CFG,该图中的每个块/节点都由一个或多个汇编指令组成,我希望尽可能估计特定寄存器或堆栈位置的值。

几个例子:

示例 1:

xor rax, rax
inc rax
; Given these instructions, solve(rax) => 1

示例 2:

mov rcx, 3
mov rbx, rcx
mov rax, rbx
; Given the instructions above, solve(rax) => 3

示例 3:

mov rbx, rcx
mov rax, rbx
; Given the instructions above, solve(rax) => Unknown

示例 4:

mov rdx, 1
shl rdx, 2
add rdx, 3
mov [rsp], rdx
; Given the instructions above, solve([rsp]) => 7

我正在寻找一个简单的 Python 示例作为开始,它要么直接获取操作码,要么寻址并评估/解决特定的寄存器/堆栈位置。

我已经研究了一些符号执行示例,它们看起来像我所需要的,但我对此很陌生,因此一个简单的工作示例确实会有所帮助。

1个回答

这是一个可以执行此操作的小 angr 脚本:

proj = angr.Project('...path...')
state = proj.factory.blank_state(addr=0x0804EA9E)
simulation = proj.factory.simgr(state)
ret = simulation.explore(find=0x0804EAA3)
print(ret.found[0].regs.ecx)

地址之间0x0804EA9E0x0804EAA3我有mov ecx, 0Ah,所以我得到:<BV32 0xa>从打印。

我知道它并不多,但正如我所说,我是新来的。希望这个简单的脚本能帮助其他人。

非常好的资源开始: