2016-11-10 58 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