本文共 2166 字,大约阅读时间需要 7 分钟。
首先记得找出起始地址的esp:
start_addr=0x08048699 init_state=p.factory.blank_state(addr=start_addr) print("ESP:",init_state.regs.esp)
输出如下:
malloc
的地址具有随机性,所以我们直接指定即可。
angr
默认写入int
数据,是大端写入,所以我们在这里不能缺少:
buffer0=0x7fff0000-0x100 buffer1=0x7fff0000-0x200 buffer0_addr=0x0ABCC8A4 buffer1_addr=0x0ABCC8AC init_state.memory.store(buffer0_addr,buffer0,endness=p.arch.memory_endness) init_state.memory.store(buffer1_addr,buffer1,endness=p.arch.memory_endness)
这一参数endness=p.arch.memory_endness
来指定参数。
接着符号化所需输入的变量:
p1=init_state.solver.BVS("p1",8*8) p2=init_state.solver.BVS("p2",8*8) init_state.memory.store(buffer0,p1) init_state.memory.store(buffer1,p2)
把栈的内存单元地址放在这个buffer0的内存单元
里面,然后再去把栈的内存单元去符号化
buffer0=0x7fff0000-0x100
也就是需要符号化的内存单元(也是把原来malloc
开辟的空间,返回开辟空间的地址,把这个给丢弃,紧接着把栈中空间地址赋给buffer0
)
import angrimport sysdef main(argv): bin_path=argv[1] p=angr.Project(bin_path) start_addr=0x08048699 init_state=p.factory.blank_state(addr=start_addr) print("ESP:",init_state.regs.esp) buffer0=0x7fff0000-0x100 buffer1=0x7fff0000-0x200 buffer0_addr=0x0ABCC8A4 buffer1_addr=0x0ABCC8AC init_state.memory.store(buffer0_addr,buffer0,endness=p.arch.memory_endness) init_state.memory.store(buffer1_addr,buffer1,endness=p.arch.memory_endness) p1=init_state.solver.BVS("p1",8*8) p2=init_state.solver.BVS("p2",8*8) init_state.memory.store(buffer0,p1) init_state.memory.store(buffer1,p2) 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] pass1=found_state.solver.eval(p1) pass2=found_state.solver.eval(p2) print("Solution: {} {}".format(pass1,pass2)) else: raise Exception("Solution nou found")if __name__=='__main__': main(sys.argv)
6143547931880145494 6146937700559509843
改变编码后
pass1=found_state.solver.eval(p1,cast_to=bytes).decode("utf-8") pass2=found_state.solver.eval(p2,cast_to=bytes).decode("utf-8")
记得加cast_to=bytes
转载地址:http://ttve.baihongyu.com/