符号执行-Angr

article/2025/11/8 7:23:19

目录

  • 预备知识
    • 1.关于Angr
  • 实验目的
  • 实验环境
  • 实验步骤一
  • 实验步骤二
  • 实验步骤三

预备知识

1.关于Angr

Angr是一个利用python开发的二进制程序分析框架,我们可以利用这个工具尝试对一些CTF题目进行符号执行来找到正确的解答,即flag。当然,要注意的是符号执行的路径选择问题到现在依旧是一个很大的问题,换句话说也就是当我们的程序存在循环时,因为符号执行会尽量遍历所有的路径,所以每次循环之后会形成至少两个分支,当循环的次数足够多时,就会造成路径爆炸,整个机器的内存会被耗尽(我们这次分析的程序只有两个分支,不会存在这个问题)。

实验目的

通过该实验了解符号执行的思维和方法,学会使用Angr,进一步掌握IDA的常见用法。

实验环境

服务器:Windows 8
kali IP地址:随机分配
辅助工具:win8装IDA,kali下安装在下文
实验文件请在实验机内下载使用:http://tools.hetianlab.com/tools/T034.zip

实验步骤一

kali上安装angr方法(已装)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
官方建议使用python虚拟环境来安装和使用angr。几个angr的依赖项(z3,pyvex)需要从原始代码分叉的本机代码库,如果已经安装了libz3或libVEX,绝对不应该用angr的代码覆盖官方共享对象。为了避免覆盖等问题,一般建议在虚拟环境中使用,由于使用虚拟机演示,所以可以忽略这个问题,使用完毕后如果出现问题恢复镜像即可,如果采用物理机演示,建议在python环境中操作。
要分析文件的文件为下载的fauxware,首先在同目录创建一个project:
在这里插入图片描述
类似于上面的流程,可以查看CPU架构(arch)、文件路径(filename)、入口地址(entry)。
在这里插入图片描述
angr的CLE模块用于加载二进制程序到虚拟地址空间。加载器(loader)作为项目的一个属性可用于查看与二进制程序一起加载的共享库,并且可在加载地址空间进行查询操作。
查看内存空间中的共享库:
在这里插入图片描述
查看加载到内存空间的主要二进制文件、查询栈是否可执行、查询是否为位置无关代码:
在这里插入图片描述
angr中有很多类,其中大部分需要在项目中进行实例化。通过project.factory可以方便地使用一些常用的对象。
使用project.factory.block可从给定的地址提取代码块。
在这里插入图片描述
还可将block转化为VEX中间语言形式。
在这里插入图片描述
Project中保存的是程序的初始内存映像,二进制程序执行后的状态由SimState(simulated program state)表示。
SimState包含程序执行时的状态数据,比如进程内存、寄存器和文件数据等。下图演示的是分别获取寄存器的值、获取程序入口地址处内存(以int类型解析)。
在这里插入图片描述
simulation managers是angr中用于执行和模拟程序的接口,可以管理多个程序state。stash为包含多个同类状态的列表,默认执行的stash为active。模拟管理器中使用.step()以基本block为单位运行。
在这里插入图片描述
和分析/bin/true一样,同样可以生成程序的控制流图:
在这里插入图片描述
同样是不加载共享库,打印出节点数0x5c,即十进制的92个。
在这里插入图片描述
对fauxware的黑盒分析到此告一段落,接下来去看看源码。

实验步骤二

关注authenticate函数。
由注释的提示可知,存在后门,只要密码输入为SOSNEAKY,就可以验证成功。
在这里插入图片描述
根据authenticate的判断逻辑结合angr的工作原理,我们可以知道:
当程序运行到if(strcmp(password, sneaky) == 0)分支时会产生两个状态,其中一个状态将会包含用户输入正确后门密码的约束条件。
使用IDA分析:
先判断文件格式:
IDA载入:
在这里插入图片描述
找到main函数:
在这里插入图片描述
F5反编译:
在这里插入图片描述
双击authenticate函数:
在这里插入图片描述
可以看到在if判断中是跟着sneaky。
双击查看:
在这里插入图片描述
可以看到sneaky的数据就是后门密码。
至于判断之后分叉的两个状态可以切换到view-A,然后空格键切换到graph overview。
在这里插入图片描述
找到authenticate之后双击查看执行流图:
在这里插入图片描述
上图显示的就是authenticate执行后的两个分支,也即angr分析时的state1和state2。

实验步骤三

使用angr分析时可以清楚地看到两个状态:
在这里插入图片描述
一直执行直到出现两个分支时停下:
在这里插入图片描述
获取进入特定分支,需要往stdin输入数据。
可以看到这里如果要进入返回1的分支(state1),只要往stdin输入SOSNEAKY,从而认证通过,这就是前面分析源码时判断的后门密码。
angr重写了一些libc的函数,比如获取stdin数据,会返回符号量,用于符号执行,在某个状态下可以使用state1.posix.dumps(0)获取进入该状态时stdin需要输入的数据(0表示的就是stdin,1则是stdout),所以上面我们使用state.posix.dumps来获取。
以上是我们为了便于理解angr的使用才一步步来分析,如果熟练掌握的话可以直接写脚本获取后门密码。
代码:
在这里插入图片描述
前面提到1表示stdout,脚本首先判断分支后的哪个状态会打印出welcome,然后打印出进入该状态需要输入的数据。
运行:
在这里插入图片描述
运行:
在这里插入图片描述
随意输入会报错:
在这里插入图片描述
输入后门密码即可通过判断。


http://chatgpt.dhexx.cn/article/4wA8ZjwP.shtml

相关文章

Angr 03_angr_symbolic_registers 多个输入的寄存器符号化

直接打开程序,发现要输入三个字符串。 用IDA打开程序,get_user_input把三个输入分别放入寄存器eax、ebx、edx。我们需要跳过输入这一步,直接让Angr把用符号向量来代替输入字符串。因此,我们需要改变程序入口,直接跳转…

angr 9二进制分析的常见问题集锦

问题: 用angr的库函数识别api去分析blob的二进制文件,报错。 AttributeError: ‘SimOS’ object has no attribute ‘syscall_library’ 原因: angr库函数识别不支持非CGC的二进制文件。 参考链接: https://github.com/angr/ang…

CTF 逆向工具angr的学习笔记

angr 概述如何学习题目列表00_angr_find01_angr_avoid02_angr_find_condition03_angr_symbolic_registers04_angr_symbolic_stack05_angr_symbolic_memory06_angr_symbolic_dynamic_memory07_angr_symbolic_file08_angr_constraints09_angr_hooks10_angr_simprocedures11_angr_…

angr初探

angr 安装与简单使用 介绍 angr 总结来说,angr用于逆向工程中进行二进制分析的一个python框架 具体介绍见其github主页angr 符号执行 符号执行 (Symbolic Execution)是一种程序分析技术。其可以通过分析程序来得到让特定代码区域执行的输…

Angr_ctf

Angr_ctf:1~13练习 文章目录 Angr_ctf:1~13练习#、angr 入门00_angr_find(1)总结(2)练习 01_angr_avoid(1)总结(2)练习 02_angr_condition(1&…

Angr CTF 从入门到入门(1)

angr是一个很厉害的二进制分析工具,能够实现很多自动化的逆向工作。最近正在学习,在看文档的时候发现了有个angrCTF的实战可以练习angr。 angrCTF:http://angr.oregonctf.org/ angr文档:https://docs.angr.io/ 这篇文章会是这个系列的第一篇文…

angr的windows安装——萌新

window10中符号执行(angr)的安装——小白篇 最近做题的时候遇到了一些需要使用angr来完成的题目,之后在网上搜了好久发现大多是Linux以及其它系统的angr安装教程。windows系统的安装方法几乎没有。身为一个萌新,猜测同类们应该也会…

Angr 安装

1、安装必要的软件环境 sudo apt-get install python3-dev libffi-dev build-essential virtualenvwrapper 2、开始正式安装angr mkvirtualenv --python$(which python3) angr && pip install angr 3、遇到 mkvirtualenv: command not found 问题 在终端执行以下命…

Angr 01 avoid 忽略的条件

01_angr_avoid无法反编译主函数,模块比较多,加上avoid过滤条件之后,就没那么慢了。 import angr …

图解angr中两种CFG的区别

angr里提供两种CFG的生成,一种是CFGFast,一种是CFGEmulated。这两种究竟有什么不同呢? 本文主要是用图来说明下这个问题。可能回答的不是很完整。 CFGFast这种CFG生成的比较快,但是没有考虑上下文关系。比如函数A调用了printf函…

Angr 02_angr_find_condition 根据输出状态条件搜索正确输入

explore的find和avoid支持函数作为参数,根据函数返回值来判断是否成功。Angr把状态传入了函数,从而判断成功与否。 import angr import sysdef main(argv):path_to_binary argv[1]project angr.Project(path_to_binary)initial_state project.factor…

angr的安装

ubuntu要先安装pip,ANGR官方给出的为pip命令pip install angr; 就算将pip改为apt-get 也不行。 借鉴Ubuntu安装pip的安装方式,安装pip,然后运行pip install angr,结束。 angr安装完后,要安装图形生成插件…

angr 学习笔记

附件,参考1,参考2 符号执行原理 基本概念 即初始参数用变量代替,模拟程序执行过程,维护执行到各个位置时的状态(用各个变量之间的代数关系表示)。 符号状态(Symbolic State) 当前…

利用angr获取CFG

静态二进制分析中,对于程序控制流图CFG的计算是很基础且重要的一步,很多的分析是要建立在CFG的基础上。angr作为二进制分析工具,当然提供了CFG功能,下面我们就来探索下要如何使用angr计算CFG,以及其中的坑。 angr中的…

Angr 内存符号化 05_angr_symbolic_memory

说明 通过查看下面的源码或IDA汇编&#xff0c;可知此例需要输入4个输入字符串&#xff0c;给每个输入字符串赋值给了user_input数组这块已经开辟的内存空间&#xff0c;我们可以监测user_input在内存中的值来获取最终的答案。 随机生成的源码 #include <stdio.h> #in…

Angr学习笔记

Angr学习笔记 前言 本文记录一下Angr的基本使用方法&#xff0c;主要是基于Github上的开源项目以及笔记AngrCTF_FITM整理&#xff0c;Angr在逆向方面确实用处比较大&#xff0c;特此记录一下。 什么是Angr angr是一个用于分析二进制文件的python框架。它专注于静态和符号分…

angr纠错和易错点

现在环境已经没有问题了。我运行了几个代码&#xff08;使用python3&#xff09;&#xff0c;都会出现不同的问题。 运行报错 解决方法&#xff1a; 添加b 运行报错&#xff1a; 解决方法&#xff1a; 删掉cast_to; 因为python2中str就是字节流 python3中不一样&#xff0c…

git本地分支管理

文章目录 一、master分支没有改变&#xff0c;合并其他分支二、master分支有改变&#xff0c;合并其他分支 作为开发人员&#xff0c;我们应该尽可能多地建立分支&#xff0c;在分支上进行开发&#xff0c;功能测试稳定后&#xff0c;再将分支上地代码合并到指定的分支 git bra…

Git 分支管理

Git 分支管理 一、主分支Master 首先&#xff0c;代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本&#xff0c;都在这个主分支上发布。 Git主分支的名字&#xff0c;默认叫做Master。它是自动建立的&#xff0c;版本库初始化以后&#xff0c;默认就是在主分…

git分支管理策略

git分支管理策略 1 总览 git 的分支整体预览图如下&#xff1a; 从上图可以看到主要包含下面几个分支&#xff1a; master&#xff1a;git默认主分支&#xff08;这里不作操作&#xff09;。 stable&#xff1a;稳定分支&#xff0c;替代master&#xff0c;主要用来版本发布。…