如何 运行 在加载 elfcore 后端后使用 angr 编程?
How to run program using angr after loading with the elfcore backend?
我正在尝试使用传递给项目构造函数的 angr 二进制分析库 (http://angr.io/). I have written code that successfully loads a core dump of the process I want to play with by using the ElfCore back end (http://angr.io/api-doc/cle.html#cle.backends.elf.elfcore.ELFCore) 编写 python 脚本,执行如下操作:
ap = angr.Project("corefile", main_opts={'backend': 'elfcore'})
我想知道的是,我现在如何"run"程序从核心转储定义的状态(寄存器和内存)向前推进? 例如,当我尝试使用上述项目创建 SimState
时:
ss = angr.sim_state.SimState(project=ap)
ss.regs.rip
我回来说 rip 是未初始化的(它肯定是在核心 dump/at 核心转储生成时初始化的)。
在此先感谢您的帮助!
好的!我想通了。作为一个完全愤怒的 n00b®,这可能不是最好的方法,但由于没有人提供更好的方法,这就是我想出的方法。
首先...
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
我正在尝试使用传递给项目构造函数的 angr 二进制分析库 (http://angr.io/). I have written code that successfully loads a core dump of the process I want to play with by using the ElfCore back end (http://angr.io/api-doc/cle.html#cle.backends.elf.elfcore.ELFCore) 编写 python 脚本,执行如下操作:
ap = angr.Project("corefile", main_opts={'backend': 'elfcore'})
我想知道的是,我现在如何"run"程序从核心转储定义的状态(寄存器和内存)向前推进? 例如,当我尝试使用上述项目创建 SimState
时:
ss = angr.sim_state.SimState(project=ap)
ss.regs.rip
我回来说 rip 是未初始化的(它肯定是在核心 dump/at 核心转储生成时初始化的)。
在此先感谢您的帮助!
好的!我想通了。作为一个完全愤怒的 n00b®,这可能不是最好的方法,但由于没有人提供更好的方法,这就是我想出的方法。
首先...
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