angr学习笔记(9)(添加约束)

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

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

验证

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

03-27
<think>嗯,用户想了解Angr的相关信息或使用方法,特别是使用文档或者具体用法。首先,我需要回忆一下Angr的基本概念和用途。Angr是一个用于二进制程序分析的框架,支持符号执行、漏洞分析、自动化逆向工程等。我应该先介绍Angr是什么,然后说明它的主要功能,比如符号执行、控制流恢复、漏洞挖掘等。接下来,可能需要分步骤讲解如何安装和使用,给出一些基本的代码示例,比如加载二进制文件、执行符号执行、解决路径约束等。同时,用户可能对实际应用场景感兴趣,比如CTF比赛中的使用,或者漏洞分析案例。另外,用户可能需要知道官方文档的位置和一些学习资源,比如GitHub仓库和教程链接。还要注意用户提到的格式要求,确保数学表达式正确使用$...$,独立公式用$$...$$,中文回答,生成相关问题。最后,检查是否有引用需要添加,但根据参考信息,用户没有提供具体的引用来源,所以可能不需要添加引用标识。要确保回答结构清晰,分步骤说明,代码示例正确,并且生成的相关问题与Angr相关,比如安装问题、符号执行原理、应用案例等。</think># Angr二进制分析框架使用指南 Angr是一个开源的二进制程序分析框架,支持符号执行、控制流恢复、漏洞挖掘等多种二进制分析技术。其核心功能通过Python API实现,主要应用于逆向工程、漏洞分析和自动化程序验证等领域。 ### 一、基础使用方法 1. **安装环境**(需要Python 3.6+) ```bash pip install angr ``` 2. **加载二进制文件** ```python import angr proj = angr.Project("/path/to/binary", auto_load_libs=False) # 禁用外部库加载 ``` 3. **符号执行基础** ```python state = proj.factory.entry_state() # 创建初始状态 simgr = proj.factory.simulation_manager(state) # 创建执行管理器 simgr.explore(find=0x4007a3) # 探索执行路径直到目标地址 if simgr.found: found_state = simgr.found[0] print(found_state.posix.dumps(0)) # 输出符号输入解 ``` ### 二、核心功能模块 1. **符号变量创建** $$ \text{Solver} \vdash x = \text{BVS}(&#39;x&#39;, 32) $$ ```python x = state.solver.BVS(&#39;input&#39;, 32) # 创建32位符号变量 ``` 2. **路径约束求解** ```python state.add_constraints(x > 0x1000, x < 0x2000) # 添加约束条件 solution = state.solver.eval(x) # 求解具体值 ``` 3. **控制流图生成 ```python cfg = proj.analyses.CFGFast() # 快速生成CFG node = cfg.get_any_node(0x400650) # 获取指定地址节点 ``` ### 三、实际应用案例 1. **CTF逆向挑战**:通过符号执行自动化解题 2. **漏洞模式识别**:检测缓冲区溢出等漏洞模式 3. **恶意代码分析**:自动化分析可疑代码行为 官方文档:https://docs.angr.io/[^2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值