2016-11-10 63 views
0

我工作的动物遗传资源-doc的挑战之一(https://github.com/angr/angr-doc/blob/2d45c9e6d9f91e83988719aa19940aec2cfd8747/examples/ekopartyctf2015_rev100/solve.py),但在我的方法,我有这种情况:了解动物遗传资源的内存映射

mov  rdx, [rbp+var_150]; 
mov  rdx, [rdx]; 
mov  rdx, [rdx+8]; 
movsx esi, byte ptr [rdx] 

,我需要设置ESI作为象征性的(ESI会包含值)。

我已经试过这样的事情:

#mov  rdx, [rbp+var_150] 
p1 = init_state.memory.load(init_state.regs.rbp-0x150, 8, endness=p.arch.memory_endness) 
#mov  rdx, [rdx] 
p2 = init_state.memory.load(p1, 8, endness=p.arch.memory_endness) 
#mov  rdx, [rdx+8] 
p3 = init_state.memory.load(p2+8, 8, endness=p.arch.memory_endness) 
#movsx esi, byte ptr [rdx] 
r1 = init_state.memory.load(p3, 8, endness=p.arch.memory_endness) 

,但它不工作 另外,我试图设置一个位向量值(BVV)每个指针,但没有奏效无论是。

我做错了什么?

+0

究竟你是“不工作”是什么意思? – Robert

回答

0

我找到了解决方案。我对存储器布局存在误解。我认为所有的记忆都是象征性的,那么我期望能够通过“autmagicaly”来解决对倍数ptr的访问。我修复了创建BitVector值并将其存储在rpb-0x150和指针中的问题。这里是例子:

#mov  rdx, [rbp+var_150] 
ptr_v_2 = claripy.BVV(0xe000000000, 64) 
init_state.memory.store(init_state.regs.rbp-0x150, ptr_v_2) 
p3 = init_state.memory.load(init_state.regs.rbp-0x150, 8, endness=p.arch.memory_endness) 

#mov  rdx, [rdx] 
ptr_v_1 = claripy.BVV(0xd000000000, 64) 
init_state.memory.store(p3, ptr_v_1) 
p2 = init_state.memory.load(p3, 8, endness=p.arch.memory_endness) 

#mov  rdx, [rdx+8] 
ptr_v = claripy.BVV(0xc000000000, 64) 
init_state.memory.store(p2+8, ptr_v) 
p1 = init_state.memory.load(p2+8, 8, endness=p.arch.memory_endness) 

现在,我想如何已了解将所有内存sybolic