千家信息网

如何利用Angr进行简单CTF逆向分析

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,如何利用Angr进行简单CTF逆向分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、符号执行概括简单的来说,符号执行就是在运行程
千家信息网最后更新 2026年10月31日如何利用Angr进行简单CTF逆向分析

如何利用Angr进行简单CTF逆向分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一、符号执行概括

简单的来说,符号执行就是在运行程序时,用符号来替代真实值。符号执行相较于真实值执行的优点在于,当使用真实值执行程序时,我们能够遍历的程序路径只有一条,而使用符号进行执行时,由于符号是可变的,我们就可以利用这一特性,尽可能的将程序的每一条路径遍历,这样的话,必定存在至少一条能够输出正确结果的分支,每一条分支的结果都可以表示为一个离散关系式,使用约束求解引擎即可分析出正确结果,这就是符号执行的简单阐述。

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

二、Angr使用

个人感觉Angr在求解REVERSE题目时很有用,但在处理PWN题目时,多用在一些辅助的位置,比如寻找 strcmp 等敏感的函数等,这次我们简单的讲解一下如何使用Angr进行REVERSE题目的分析求解。我首先讲解一下Angr在实践中的几步关键操作,之后会使用一个简单的CTF题目进行实践。推荐大家使用ipython进行简单的实践,ipython的tab补全可以让你看到Angr中很多奇妙的函数。

1. 运行程序

我们在得到一个程序时,首先需要对此程序创建一个Angr工程。

p = angr.Project(‘program’)

我们可以通过这个工程得到程序的一些信息,比如程序名p.filename等等。

然后需要将这个程序运行起来,并且处理程序的一些输入,前面已经说过,在符号执行时,我们使用的并不是真实值,而是一个个符号,可以简单的理解为变量,所以我们需要构造一个Angr中的符号来当做程序的输入。

(1) 命令行参数

当程序要求命令行参数时,我们首先需要使用claripy这个模块来定义抽象的数据。

import claripy

claripy的BVS函数可以创建一个指定长度的抽象数据,BVS函数要求两个参数,***个参数为变量名,第二个参数为变量长度。

argv = [p.filename,]  arg = claripy.BVS(‘arg1′, 8)argv.append(arg1)

这样,我们就创建好了一个命令行参数,我们现在可以将程序运行到程序入口处,并获得当前的一个状态。

state = p.factory.entry_state(args=argv)

P.factory是工厂函数的一个集合,在这里面可以调用各种各样的函数来进行符号执行,其中entry_state()函数接收一个list作为程序的命令行参数并且返回程序入口的状态(这个状态将在2.2节讲解)。

(2) 标准输入

当程序需要从标准输入处读取数据时,需要使用read_from()函数,要注意,这个函数位于状态中,并且我们可以对输入进行一些约束以减少符号执行遍历的路径。

for _ in xrange(5):       k = state.posix.files[0].read_from(1)     state.se.add(k!=10)

这表示我们从标准输入读入了5个字节,并且每个字节都不为换行符。

2. Angr中程序的几种状态

我们在之前提到了获取程序入口点的状态,状态在Angr中表示着程序符号执行后的几种结果,在Angr中,当获取到程序入口点的状态后,我们需要使用Angr的Simgr模拟器来进行符号执行

sm = p.factory.simgr(state)

表示从入口点出创建一个模拟器来进行符号执行。

在 Angr 寻找路径时,程序的当前状态有多种表示。

  • step()表示向下执行一个block(42bytes),step()函数产生active状态,表示该分支在执行中;

  • run()表示运行到结束,run()函数产生deadended状态,表示分支结束;

  • explore()可以对地址进行限制以减少符号执行遍历的路径。例如

  • sm.explore(find=0x400676,avoid=[0x40073d])

  • explore()产生found状态,表示探索的结果等等

3. 获取输出

当符号执行遍历玩路径后,会产生大量的状态,我们则需要从这些状态中找出我们所需要的一条路径。

我们可以获取当前状态程序的输出

print sm.found.posix.dumps(1)

命令行参数

print sm.found.solver.eval(arg1,cast_to = str)

标准输入

inp = sm.found.posix.files[0].all_bytes()   print sm.found.solver.eval(inp,cast_to = str)z

在求解命令行参数和标准输入的值时,我们使用了约束求解引擎来进行求解

3. Angr实践

bin(re50)下载:

http://oj.xctf.org.cn/web/practice/defensetrain/465f6bb8f4ad4d65a70cce2bd69dfacf/

脚本编写

import angr import sys print "[*]start------------------------------------" p = angr.Project(sys.argv[1])  # 建立工程初始化二进制文件 state = p.factory.entry_state() # 获取入口点处状态   ''' state.posix.files[0].read_from(1)表示从标准输入读取一个字节 '''   for _ in xrange(int(sys.argv[2])):  # 对输入进行简单约束(不为回车)     k = state.posix.files[0].read_from(1)     state.se.add(k!=10)   k = state.posix.files[0].read_from(1) state.se.add(k==10)  # 回车为结束符   state.posix.files[0].seek(0) state.posix.files[0].length = int(sys.argv[2])+1 # 约束输入长度(大于实际长度也可)   print "[*]simgr start-------------------------------"   sm = p.factory.simgr(state)   # 初始化进程模拟器 sm.explore(find=lambda s:"correct!" in s.posix.dumps(1)) # 寻找运行过程中存在 "correct!"的路径,并丢弃其他路径 print "[*]program excuted---------------------------"   for pp in sm.found:     out = pp.posix.dumps(1)   # 表示程序的输出     print out     inp = pp.posix.files[0].all_bytes()  # 取输入的变量     print pp.solver.eval(inp,cast_to = str)  # 利用约束求解引擎求解输入

运行

root@kali:~# python re50.py ppp 4 [*]start------------------------------------ /usr/local/lib/python2.7/dist-packages/cle/loader.py:729: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal   if ilibname.strip('.0123456789') == spec.strip('.0123456789'): [*]simgr start------------------------------- [*]program excuted--------------------------- please input the key:correct!   9563   root@kali:~#

我们就得到了正确的key值 9563

关于如何利用Angr进行简单CTF逆向分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

程序 符号 状态 输入 路径 函数 参数 运行 分析 入口 命令 标准 分支 结果 问题 题目 变量 长度 实践 输出 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 美国互联网保险保险科技 互联网是不是新科技 互联网与科技金融数据 齐家互联网科技 致聘互联网科技 亿账通互联网科技 互联网金融 科技创新 海南科技产业互联网平台 宁波青枫互联网科技有限公司 互联网科技公司有风险吗 青海科技产业互联网发展 中国互联网十大科技股排名 想开互联网科技公司怎么样 智帮互联网科技公司最近动向 互联网科技包装股 新氧科技和美国互联网有关系吗 吉林省码上互联网科技电话 上海互联网科技园景观 瑞安市蟠桃会互联网科技有限公司 广州全民伙伴互联网科技有限公司 国智互联网科技 互联网科技公司华为 奔汉互联网科技 互联网金融和金融科技 丰台科技园 互联网公司 老年人脱离互联网科技的作文 深圳育鹏互联网科技有限公司招聘 中国科技创新与世界互联网大会 华夏恒生互联网科技013171 互联网科技和法律行业
0