理解angr内存映射
understanding the angr memory map
我正在处理一项 angr-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)
但是没用
此外,我尝试为每个指针设置一个 BitVector 值 (BVV),但它也没有用。
我做错了什么?
我找到了解决办法。我对内存布局有误解。我虽然所有的内存都是象征性的,但我期待对倍数 ptr 的访问是解析 "autmagicaly"。我解决了创建 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)
现在,我想弄明白如何将所有内存设置为符号
我正在处理一项 angr-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)
但是没用 此外,我尝试为每个指针设置一个 BitVector 值 (BVV),但它也没有用。
我做错了什么?
我找到了解决办法。我对内存布局有误解。我虽然所有的内存都是象征性的,但我期待对倍数 ptr 的访问是解析 "autmagicaly"。我解决了创建 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)
现在,我想弄明白如何将所有内存设置为符号