欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

运用Angr达到简单的CTF逆向分析符号执行

来源:本站整理 作者:佚名 时间:2017-10-19 TAG: 我要投稿

1. 标记履行归纳综合

简略的来讲,标记履行便是在运转法式时,用标记来代替实在值。标记履行相较于实在值履行的长处在于,当应用实在值履行法式时,咱们可以或许遍历的法式门路只要一条,而应用标记停止履行时,因为标记是可变的,咱们就能够或许应用这一特征,尽量的将法式的每一条门路遍历,如许的话,一定存在至多一条可以或许输入准确成果的分支,每一条分支的成果都可以或许表现为一个团圆干系式,应用束缚求解引擎即可阐发出准确成果,这便是标记履行的简略论述。
Angr是一个应用python开辟的二进制法式阐发框架,咱们可以或许应用这个对象测验考试对一些CTF标题停止标记履行来找到准确的解答,即flag。固然,要留意的是标记履行的门路抉择成绩到如今依旧是一个很大的成绩,换句话说也便是当咱们的法式存在轮回时,因为标记履行会只管即便遍历所有的门路,以是每次轮回以后会构成至多两个分支,当轮回的次数充足多时,就会形成门路爆炸,全部机械的内存会被耗尽。

2. Angr应用

小我感到Angr在求解REVERSE标题时很有效,但在处置PWN标题时,多用在一些帮助的地位,好比探求 strcmp 等敏感的函数等,此次咱们简略的讲授一下若何应用Angr停止REVERSE标题的阐发求解。我起首讲授一下Angr在理论中的几步症结操纵,以后会应用一个简略的CTF标题停止理论。保举人人应用ipython停止简略的理论,ipython的tab补全可以或许让你看到Angr中许多奥妙的函数。

2.1运转法式

咱们在得到一个法式时,起首必要对此法式创立一个Angr工程。

p = angr.Project(‘program’)
咱们可以或许通过这个工程得到法式的一些信息,好比法式名p.filename等等。

而后必要将这个法式运转起来,而且处置法式的一些输入,后面曾经说过,在标记履行时,咱们应用的并非实在值,而是一个个标记,可以或许简略的懂得为变量,以是咱们必要结构一个Angr中的标记来当成法式的输入。

命令行参数

当法式请求命令行参数时,咱们起首必要应用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节讲授)。

尺度输入

当法式必要从尺度输入处读取数据时,必要应用read_from()函数,要留意,这个函数位于状况中,而且咱们可以或许对输入停止一些束缚以削减标记履行遍历的门路。


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

这表现咱们从尺度输入读入了5个字节,而且每一个字节都不为换行符。

2.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状况,表现摸索的成果等等

2.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:

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载