在 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 发现函数的顺序进行反汇编。