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
文章目录
伪代码分析

首先记得找出起始地址的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 angr
import sys
def 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

验证

博客围绕angr系列展开,包含00_angr_find到13_angr_static_binary等内容。还进行了伪代码分析,如找出起始地址的esp,符号化所需输入变量等。最后提及脚本及验证相关,如改变编码等操作。
314

被折叠的 条评论
为什么被折叠?



