如何使用angr导出反汇编

逆向工程 愤怒
2021-06-23 09:08:35

我想知道如何在say txt文件中导出angr的反汇编。

我查看了 angr 文档 - https://angr.io/api-doc/angr.html#module-angr.analysis

我发现在 proj.analysis 下有一些端点,如 - 反汇编、cfgfast。我想获得像反汇编输入一样的 objdump。这篇论文说他们使用 cfgfast 进行分析。所以,我检查了那个类,但找不到打印程序集的特定方法。例如在radare2中,我可以这样做-

r2.cmd('aaa')
r2.cmd(f'pd $s > {filename+"_radare.txt"}')

分析后得到反汇编。

1个回答

在 angr 中,有多种方法可以打印出您想要的内容。您可以引用函数或基本块。所有你需要打印出反汇编是一个地址:

import angr
p = angr.Project("/bin/true",auto_load_libs=False)
block = p.factory.block(p.entry)
block.pp()

在这种情况下,我加载true二进制文件,不包括其动态库,并要求它在二进制文件的入口地址处进行反汇编。pp功能代表漂亮的打印,它将允许您以漂亮的格式打印组件。

现在以线性格式获取每个反汇编的地址,如 objdump,在 angr 中更加困难。使用angr-management并从 GUI 复制线性反汇编会更可取,但是为了这个问题,这里有一个 hacky 脚本来获取每个基本块的反汇编:

import angr
p = angr.Project("/bin/true",auto_load_libs=False)
cfg = p.analyses.CFGFast()
cfg.normalize()
for func_node in cfg.functions.values():
    if func_node.name.startswith("__"):
        continue
    else:
        for block in func_node.blocks:             
            block.pp() 

重要的是要注意反汇编可能不是按顺序进行的,尽管它会指定它的地址——这是因为我们按照 angr 发现函数的顺序进行反汇编。