CTF中的AEG(一) 基础知识

本文介绍了AEG(Automatic Exploit Generation)的起源,特别是DARPA的CGC比赛,这是一个全自动的机器网络攻防比赛。AEG的发展源于软件复杂性和模糊测试的进步,它涉及符号执行技术,包括静态和动态符号执行。动态符号执行如Concolic执行结合了实际执行和符号执行,用于解决静态执行中的路径爆炸问题。Angr是一个多架构的二进制分析平台,常用于CTF中的动态符号执行,帮助找到程序的漏洞路径。在CTF比赛中,Angr等工具用于快速分析和利用带有漏洞的二进制程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AEG

AEG的全称是**自动利用⽣成 Automatic Exploit Generation**

他的起源是2016年DARPA举办的CGC比赛
那CGC比赛是个啥?

CGC 网络超级挑战赛是全球首次机器网络攻防比赛,比赛过程全自动,无任何人工干预。考验机器自动漏洞挖掘、自动软件加固、自动漏洞利用和自动网络防护水平。使用简化的 Linux 操作系统 ------DECREE,类似 Snort 的规则过滤防火墙。对 Linux 二进制程序进行漏洞挖掘。所有参赛队都没有程序源码。

这个是来自ctfwiki

CGC超级挑战赛

后来关于漏洞自动利用工作的研究也就多了起来。能发展起来是因为随着软件越来越复杂,模糊测试技术越来越成熟,被挖到的漏洞越来越多,修补漏洞耗时耗力,且我们需要判断漏洞的危害性,来判断首先修补什么漏洞。所以就推动了AEG的发展。

我们现在聚焦于CTF中的AEG,应用的场景是我们链接目标服务器后,服务器会发给我们一个带有漏洞的二进制程序,每次这个二进制程序是不同的,我们需要快速的写好exp发送过去。

那么首先我们还是来补充一点做aeg需要的基础知识。


符号执行

首先要说一下具体执行

具体执行顾名思义就是每次程序在执行的时候我们能够确定其内存跟寄存器等等的状态,且每次到达某个分支的条件不会发生变化,整个程序在整体上是固定的。

而符号执行不同,符号执行的关键思想就是,把输入变为符号值,那么程序计算的输出值就是一个符号输入值的函数。

符号执行又分为静态符号执行和动态符号执行。我们一般说的或者说我们一般印象中的更多的是静态符号执行,那他们有啥区别?

静态符号执行

程序的所有执行路径可以表示为树,叫做执行树。我们的目的就是要找到我们所需要的路径,那么为了找到我们需要的路径,我们就需要把所有的路径都遍历一遍。为了方便我们拿到路径,方便我们写程序,我们需要对输入输出以及整个路径的条件符号化。

然后整个的原理是:符号执行会在全局维护两个变量。第一个变量是符号状态,它表示的是一个从变量到符号表达式的映射。其二是符号化路径约束,用来表示路径条件。开始时,符号状态会先初始化为一个空的映射,而符号化路径约束初始化为true。路径约束和符号状态会在符号执行的过程中会不断更新。在符号执行结束时,用约束求解器对路径约束进行求解,以生成实际的输入值。这个实际的输入值如果用程序执行,就会走符号执行过程中探索的那条路径,然后就拿到了我们想要的路径。

但是有问题,静态符号执行会有两个解决不了的问题。

第一个问题是循环或递归的终止条件是符号化的,包含循环和递归的符号执行会导致无限数量的路径。

第二个问题是符号路径约束包含不能由求解器高效求解的公式。

那么在这种情况下应该咋整?这就引出了我们的动态符号执行

动态符号执行

动态符号执行其实是将实际执行与符号执行结合在了一起

动态符号执行有一个重要的结构叫Concolic。Concolic执行的时候会维护一个实际状态和一个符号化状态,他们用处各不相同,实际状态将所有变量映射到实际值,符号状态只映射那些有非实际值的变量。Concolic执行的时候首先用一些给定的或者随机的输入来执行程序,执行的时候会手机条件语句对执行结果的影响,或者说对输入的符号化约束,然后用约束求解器去推理输入的变化,推理出另一条路径的约束,下一次输入就按照另一条路径来输入,不断重复这个过程,再加上一定的算法,直到所有的路径都被探索。

Angr

首先!!给出angr的官方文档

官方文档

再给一个angr基础学习的网站

CTF All in One

我们再做一个比较简单的总结

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来做符号执行的分析过程,用符号执行,遍历所有路径,在规定时间内,通过一定的算法,找到有漏洞的路径,从而加以利用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值