本文共 1760 字,大约阅读时间需要 5 分钟。
需要在下方添加一个约束,防止路径爆炸if ( check_equals_AUPDNNPROEZRJWKB((int)&buffer, 0x10u) )
,因为这种compare
是属于一个字符一个字符进行比较,所以路径太多,需要添加约束。
先找到起始地址:
start_addr=0x08048625 init_state=p.factory.blank_state(addr=start_addr)
符号化输入:
buffer_addr=0x0804A050 password=init_state.solver.BVS("password",16*8) init_state.memory.store(buffer_addr,password) sm=p.factory.simgr(init_state)
目标地址是if ( check_equals_AUPDNNPROEZRJWKB((int)&buffer, 0x10u) )
,当寻到这里时,需要停下,自行进行约束判断:
check_addr=0x08048565 sm.explore(find=check_addr)
首先给函数进行参数初始化:
check_param1=buffer_addr check_param2=0x10 check_bvs=check_state.memory.load(check_param1,check_param2)
进行约束添加:
check_constraint=desired_string==check_bvs check_state.add_constraints(check_constraint)
最后进行求解即可:
password1=check_state.solver.eval(password,cast_to=bytes)
import sysimport angrdef main(argv): bin_path=argv[1] p=angr.Project(bin_path) start_addr=0x08048625 init_state=p.factory.blank_state(addr=start_addr) buffer_addr=0x0804A050 password=init_state.solver.BVS("password",16*8) init_state.memory.store(buffer_addr,password) sm=p.factory.simgr(init_state) check_addr=0x08048565 sm.explore(find=check_addr) if sm.found: check_state=sm.found[0] desired_string='AUPDNNPROEZRJWKB' check_param1=buffer_addr check_param2=0x10 check_bvs=check_state.memory.load(check_param1,check_param2) check_constraint=desired_string==check_bvs check_state.add_constraints(check_constraint) password1=check_state.solver.eval(password,cast_to=bytes) print("Solution:{}".format(password1.decode('utf-8'))) if __name__=='__main__': main(sys.argv)
LGCRCDGJHYUNGUJB
转载地址:http://atve.baihongyu.com/