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

需要在下方添加一个约束,防止路径爆炸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 sys
import angr
def 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
验证

该博客详细介绍了如何利用angr库进行符号执行,从设置初始状态、符号化输入到约束添加,最终找到满足条件的密码。通过示例脚本展示了在遇到字符串比较时如何避免路径爆炸并求解密码。
518

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



