AEG
AEG的全称是**自动利用⽣成 Automatic Exploit Generation**
他的起源是2016年DARPA举办的CGC比赛
那CGC比赛是个啥?
CGC 网络超级挑战赛是全球首次机器网络攻防比赛,比赛过程全自动,无任何人工干预。考验机器自动漏洞挖掘、自动软件加固、自动漏洞利用和自动网络防护水平。使用简化的 Linux 操作系统 ------DECREE,类似 Snort 的规则过滤防火墙。对 Linux 二进制程序进行漏洞挖掘。所有参赛队都没有程序源码。
这个是来自ctfwiki
后来关于漏洞自动利用工作的研究也就多了起来。能发展起来是因为随着软件越来越复杂,模糊测试技术越来越成熟,被挖到的漏洞越来越多,修补漏洞耗时耗力,且我们需要判断漏洞的危害性,来判断首先修补什么漏洞。所以就推动了AEG的发展。
我们现在聚焦于CTF中的AEG,应用的场景是我们链接目标服务器后,服务器会发给我们一个带有漏洞的二进制程序,每次这个二进制程序是不同的,我们需要快速的写好exp发送过去。
那么首先我们还是来补充一点做aeg需要的基础知识。
符号执行
首先要说一下具体执行
具体执行顾名思义就是每次程序在执行的时候我们能够确定其内存跟寄存器等等的状态,且每次到达某个分支的条件不会发生变化,整个程序在整体上是固定的。
而符号执行不同,符号执行的关键思想就是,把输入变为符号值,那么程序计算的输出值就是一个符号输入值的函数。
符号执行又分为静态符号执行和动态符号执行。我们一般说的或者说我们一般印象中的更多的是静态符号执行,那他们有啥区别?
静态符号执行
程序的所有执行路径可以表示为树,叫做执行树。我们的目的就是要找到我们所需要的路径,那么为了找到我们需要的路径,我们就需要把所有的路径都遍历一遍。为了方便我们拿到路径,方便我们写程序,我们需要对输入输出以及整个路径的条件符号化。
然后整个的原理是:符号执行会在全局维护两个变量。第一个变量是符号状态,它表示的是一个从变量到符号表达式的映射。其二是符号化路径约束,用来表示路径条件。开始时,符号状态会先初始化为一个空的映射,而符号化路径约束初始化为true。路径约束和符号状态会在符号执行的过程中会不断更新。在符号执行结束时,用约束求解器对路径约束进行求解,以生成实际的输入值。这个实际的输入值如果用程序执行,就会走符号执行过程中探索的那条路径,然后就拿到了我们想要的路径。
但是有问题,静态符号执行会有两个解决不了的问题。
第一个问题是循环或递归的终止条件是符号化的,包含循环和递归的符号执行会导致无限数量的路径。
第二个问题是符号路径约束包含不能由求解器高效求解的公式。
那么在这种情况下应该咋整?这就引出了我们的动态符号执行
动态符号执行
动态符号执行其实是将实际执行与符号执行结合在了一起
动态符号执行有一个重要的结构叫Concolic。Concolic执行的时候会维护一个实际状态和一个符号化状态,他们用处各不相同,实际状态将所有变量映射到实际值,符号状态只映射那些有非实际值的变量。Concolic执行的时候首先用一些给定的或者随机的输入来执行程序,执行的时候会手机条件语句对执行结果的影响,或者说对输入的符号化约束,然后用约束求解器去推理输入的变化,推理出另一条路径的约束,下一次输入就按照另一条路径来输入,不断重复这个过程,再加上一定的算法,直到所有的路径都被探索。
Angr
首先!!给出angr的官方文档
再给一个angr基础学习的网站
我们再做一个比较简单的总结
angr是一个多架构的二进制分析平台,具备对二进制文件的动态符号执行能力和多种静态分析能力。所以同时angr 是一个符号执行工具,它通过符号表达式来模拟程序的执行,将程序的输出表示成包含这些符号的逻辑或数学表达式,然后利用约束求解器进行求解。
我们从几个方面来看一下angr的构成
从代码角度或者说从最底层的组成来说可以分成四个部分
CLE 二进制文件加载器 主类为 cle.loader.Loader
,它导入所有的对象文件并导出一个进程内存的抽象。
Pyvex angr 使用了 VEX 作为二进制分析的中间表示。VEX IR 是由 Valgrind 项目开发和使用的中间表示,后来这一部分被分离出去作为 libVEX,libVEX 用于将机器码转换成 VEX IR。在 angr 项目中,开发了模块 PyVEX 作为 libVEX 的 Python 包装。
Claripy 求解器引擎 angr 是一个符号执行工具,它通过符号表达式来模拟程序的执行,将程序的输出表示成包含这些符号的逻辑或数学表达式,然后利用约束求解器进行求解。
Angr 这个就是angr自己的部分
从安装来说可以分成五个部分
claripy
archinfo 显然多出来的只有这个,这个是架构信息,如果自己安装angr需要用到
pyvex
cle
angr
从angr官方给的核心概念又可以分成很多部分
Top Level Interfaces 顶级接口 就是我们在使用angr时要用到的各种接口
Loading a Binary 加载二进制文件
Solver Engine 求解器引擎
Program State 程序状态 程序状态 state 是一个 SimState 类型的对象
Simulation Managers 模拟管理器 模拟管理器是 angr 最重要的控制接口,它允许同时对各组状态的符号执行进行控制,同时应用搜索策略来探索程序的状态空间。states 会被整理到 stashes 里,从而进行各种操作。
Execution Engines 执行引擎 angr 使用一系列引擎(SimEngine 类的子类)来模拟给定代码段对输入状态的影响。 angr 的执行核心只是按顺序尝试所有可用的引擎,选择第一个能够处理该步骤的引擎。
Analyses 内置分析 就是对二进制程序进行分析的部分
Angr与CTF
angr在CTF逆向中有很大的用途,例如可以通过约束求解找到复杂计算的正确解,从而拿到flag;但是angr的用途远不止于此,在CGC挑战赛中,获得第一名的团队就是用angr来完成aeg的。
我们上面说过了ctf中的aeg的具体形式。我们上面也说过处理符号处理。
在现在ctf的aeg处理过程中,首先要知道用到的基本都是动态符号处理,用的工具主流还是angr,就是用angr来做符号执行的分析过程,用符号执行,遍历所有路径,在规定时间内,通过一定的算法,找到有漏洞的路径,从而加以利用。