在使用elfcore后端加载后如何使用angr运行程序?

问题描述 投票:1回答:1

我正在尝试使用angr二进制分析库(http://angr.io/)编写python脚本。我已经编写了代码,该代码使用传递给项目构造函数的ElfCore后端(http://angr.io/api-doc/cle.html#cle.backends.elf.elfcore.ELFCore)成功加载了要处理的进程的核心转储,执行以下操作:

ap = angr.Project("corefile", main_opts={'backend': 'elfcore'})

[我想知道的是,我现在如何从核心转储定义的状态(寄存器和内存)开始“运行”程序?例如,当我尝试创建使用上述项目的SimState

ss = angr.sim_state.SimState(project=ap)
ss.regs.rip

我回来了,该rip未初始化(它肯定在核心转储中/在生成核心转储时被初始化)。

提前感谢您的帮助!

python-3.x x86-64 reverse-engineering elf angr
1个回答
1
投票

好吧!我想通了。总的来说,这可能不是最好的方法,但是由于没有人提供更好的方法,这就是我想出的。

第一...

ap = angr.Project("corefile", main_opts={'backend': 'elfcore'}, rebase_granularity=0x1000)
ss = angr.factory.AngrObjectFactory(ap).blank_state()

rebase_granularity是必需的,因为我的核心文件在地址范围内的堆栈映射得很高,并且angr拒绝将内容映射到您的主要二进制文件(在本例中为我的核心文件)之上。

通过检查angr的源代码(并在Python终端上播放),我发现此时,以上状态将按照核心文件将其定义为的方式映射所有内存,但是尚未正确定义寄存器。因此,我需要继续:

# Get the elfcore_object
elfcore_object = None
for o in ap.loader.all_objects:
    if type(o) == cle.backends.elf.elfcore.ELFCore:
        elfcore_object = o
        break
if elfcore_object is None:
    error

# Set the reg values from the elfcore_object to the sim state, realizing that not all
# of the registers will be supported (particularly some segment registers)
for regval in elfcore_object.initial_register_values():
    try:
        setattr(ss.regs, regval[0], regval[1])
    except Exception:
        warn

# get a simgr
simgr = ap.factory.simgr(ss)

现在,我可以使用核心转储定义的状态从这里开始向前运行...

for ins in ap.factory.block(simgr.active[0].addr).capstone.insns:
    print(ins)

simgr.step()

...repeat
© www.soinside.com 2019 - 2024. All rights reserved.