angr学习笔记(5)(栈符号化)
生活随笔
收集整理的這篇文章主要介紹了
angr学习笔记(5)(栈符号化)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
angr系列
00_angr_find
01_angr_avoid
02_angr_find_condition
03_angr_symbolic_registers
04_angr_symbolic_stack
05_angr_symbolic_memory
06_angr_symbolic_dynamic_memory
07_angr_symbolic_file
08_angr_constraints
09_angr_hooks
10_angr_simprocedures
13_angr_static_binary
文章目錄
- angr系列
- 00_angr_find
- 01_angr_avoid
- 02_angr_find_condition
- 03_angr_symbolic_registers
- 04_angr_symbolic_stack
- 05_angr_symbolic_memory
- 06_angr_symbolic_dynamic_memory
- 07_angr_symbolic_file
- 08_angr_constraints
- 09_angr_hooks
- 10_angr_simprocedures
- 13_angr_static_binary
- 偽代碼分析
- 疑問點(diǎn)
- 腳本:
- 驗(yàn)證
偽代碼分析
這個是直接把參數(shù)放在棧中處理,所以我們需要利用代碼在函數(shù)執(zhí)行起始處構(gòu)造棧空間(棧符號化)
符號化棧需要觀察棧幀:
構(gòu)建出start_address處的棧后,再來進(jìn)行下一步的操作:
這里符號化棧可以對照這符號化內(nèi)存地址單元和寄存器來進(jìn)行觀察
疑問點(diǎn)
這里為什么是8?
看了一下esp棧幀,除去填入的ebp,感覺padding_size應(yīng)該是0x18呀,這樣的話,才符合呀
動調(diào)后:
看了一下此時eax的值和ebp的值,直接發(fā)現(xiàn)
ebp+var_10就等于ebp-10(我一直以為是+10.誤認(rèn)為是上一個函數(shù)的內(nèi)存單元格。)
其實(shí)這里也寫了:
那對于-8就沒有任何問題了。解釋一下為什么是-8.
這里的輸入?yún)?shù)是ebp-0x10和ebp-0x0C,ebp是高地址(棧都是由高地址向低地址拓展)
因?yàn)閰?shù)1占四個字節(jié),所以0xC~0x8就是這個參數(shù)所占內(nèi)存,因此此時所需填充的就是8個字節(jié)(即抬高棧頂8個字節(jié))
最后進(jìn)行求解:
password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)腳本:
import angr import sys def main(argv):bin_path=argv[1]p=angr.Project(bin_path)start_addr=0x08048697init_state=p.factory.blank_state(addr=start_addr)padding_size=8init_state.stack_push(init_state.regs.ebp)init_state.regs.ebp=init_state.regs.espinit_state.regs.esp-=padding_sizepass1=init_state.solver.BVS("pass1",32)pass2=init_state.solver.BVS("pass2",32)init_state.stack_push(pass1)init_state.stack_push(pass2)sm=p.factory.simgr(init_state)def is_good(state):return b'Good Job.' in state.posix.dumps(1)def is_bad(state):return b'Try again.' in state.posix.dumps(1)sm.explore(find=is_good,avoid=is_bad)if sm.found:found_state=sm.found[0]password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)print("Solution:{} {}".format(password1,password2))else:raise Exception("Solution not found")if __name__=='__main__':main(sys.argv) Solution:1704280884 2382341151驗(yàn)證
總結(jié)
以上是生活随笔為你收集整理的angr学习笔记(5)(栈符号化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: angr学习笔记(4) (寄存器符号化
- 下一篇: angr学习笔记(6)(内存地址单元符号