一、符号执行概括

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

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

二、Angr使用

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

1. 运行程序

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

  1. p = angr.Project(‘program’)

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

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

(1) 命令行参数

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

  1. import claripy

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

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

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

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

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

(2) 标准输入

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

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

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

2. Angr中程序的几种状态

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

  1. sm = p.factory.simgr(state)

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

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

  • step()表示向下执行一个block(42bytes),step()函数产生active状态,表示该分支在执行中;
  • run()表示运行到结束,run()函数产生deadended状态,表示分支结束;
  • explore()可以对地址进行限制以减少符号执行遍历的路径。例如
  • sm.explore(find=0x400676,avoid=[0x40073d])
  • explore()产生found状态,表示探索的结果等等

3. 获取输出

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

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

  1. print sm.found.posix.dumps(1)

命令行参数

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

标准输入

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

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

3. Angr实践

bin(re50)下载:

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

脚本编写

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

运行

  1. root@kali:~# python re50.py ppp 4
  2. [*]start------------------------------------
  3. /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
  4. if ilibname.strip('.0123456789') == spec.strip('.0123456789'):
  5. [*]simgr start-------------------------------
  6. [*]program excuted---------------------------
  7. please input the key:correct!
  8. 9563
  9. root@kali:~#

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

原文发布时间为:2017-10-21

本文作者:hellowuzekai

本文来自云栖社区合作伙伴51CTO,了解相关信息可以关注51CTO。

符号执行:利用Angr进行简单CTF逆向分析相关推荐

  1. 利用Python进行简单杜邦分析

    利用Python进行简单杜邦分析 "巧妇难为无米之炊",找不到数据,量化分析.财务报表分析也就无从谈起.对于分析者来说,获取数据是量化分析的第一步.Python的一个强大功能之一就 ...

  2. 实战操作——一次简单的逆向分析破解锁机软件

    事情的起因是这样的,群里有位小朋友的手机被锁了,问及原因,原来是下载了一个名叫"cf外挂助手激活版"的这么一个软件,我收到了这份软件之后看到他是这样的... emmm....才二百 ...

  3. 逆向分析中的密码学---tea

    0x01 简介 TEA全称Tiny Encrypt Algorithm.在CTF逆向分析中经常会出现Tea或者魔改了DELTA的TEA算法. 0x02 算法原理 明文长度分组为64位(8字节),密钥长 ...

  4. 基于Inspeckage的安卓APP抓包逆向分析——以步道乐跑APP为例

    引言:本人最近稍微弄懂了inspeckage的用法,特在此以步道乐跑APP为例,较详细记录地记录APP抓包与简单的逆向分析过程,用于备忘与共同学习!另外,温馨提醒,本文图片较多,建议连接WiFi阅读! ...

  5. Windows逆向分析实战:使用CE+OD获取用户信息

    序: 很多想学软件逆向分析的朋友们,初学者往往看到一大堆的技术资料,直接就懵了.本文以一个简单的例子,演示一下使用CE+OD进行内存的获取,然后使用Qt进行界面显示,让初学者简单了解逆向分析的流程,并 ...

  6. CTF dotNet逆向分析

    题目来源http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=36 .NET逆向第一题  嗯,看名字就应该明白了,快去 ...

  7. 利用PHP制作简单的内容采集器的原理分析

    利用PHP制作简单的内容采集器的原理分析 2008-12-12 11:24 前几天做了个小说连载的程序,因为怕更新麻烦,顺带就写了个采集器,采集八路中文网的,功能比较简单,不能自定义规则,不过大概思路 ...

  8. 二进制逆向工程师_利用Ghidra逆向分析Go二进制程序(下篇)

    (接上文) 动态分配字符串结构 在第一种情况下,字符串结构是在运行时创建的,为此,需要使用一系列汇编指令在字符串操作之前设置相应的结构.由于指令集的不同,不同的架构之间的结构也是不同的.让我们通过几个 ...

  9. 动若脱兔:深入浅出angr--初步理解符号执行以及angr架构

    一:概论 angr作为符号执行的工具,集成了过去的许多分析方式,它不仅能进行动态符号执行,而且还能进行很多静态分析,他在分析二进制程序中能发挥很大的作用,下面为一些应用: 1:利用符号执行探究执行路径 ...

最新文章

  1. 李沐:五年工作反思!
  2. HDU 6170-正则表达式
  3. [YTU]_2432( C++习题 对象数组输入与输出)
  4. QT学习:网络应用开发练习(文件下载)
  5. .git文件夹_将Git存储库中的文件夹转换为全新的存储库
  6. 数据结构——用栈解决回文字符问题
  7. 数据结构---前序和中序遍历的二叉树序列还原二叉树
  8. React开发(170):ant design datapicker限制选择时间
  9. 吐血解决python中文写入文件问题
  10. 大数据学习笔记54:HBase概述
  11. php私章制作,PS制作一枚私人的古典型印章教程
  12. 超声波传感器测距报警器
  13. 黑白双色背景图java_黄色背景黑白双色简洁ppt图表
  14. 小白网卡带宽限速神器:wondershaper
  15. android开发艺术探索3:IPC--AIDL(跨进程)的使用
  16. Matlab小课堂3
  17. 无法下载图片 App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insec
  18. html 的(热点区域的建立、框架的建立)
  19. 网络入侵检测--Snort软件配置文件snort.conf详解
  20. Shell和Jenkins讲解

热门文章

  1. 申工智能有没有作弊?
  2. 里程碑!SpaceX 载人首飞发射成功,马斯克填补美国载人飞行近十年空白
  3. 研究揭示大脑在工作记忆中存储信息的神经机制
  4. 指挥控制系统中的自然智能和人工智能
  5. 中国信通院《新型智慧城市发展研究报告》
  6. 全球及美国首张无人机配送商业化“驾照”先后落地,国内还要多久?
  7. Yann LeCun专访:我不觉得自己有天分,但是我一直往聪明人堆里钻
  8. DeepMind-深度学习: AI革命及其前沿进展 (54页ppt报告)
  9. Yoshua Bengio团队通过在网络「隐藏空间」中使用降噪器以提高深度神经网络的「鲁棒性」
  10. 深度|2030年8亿人会失业!图解机器人如何取代你的工作