angr符号执行用例解析——csaw_wyvern

6人阅读 评论(0) 收藏 举报
分类:

用例源码以及二进制文件链接:https://github.com/angr/angr-doc/tree/master/examples/csaw_wyvern

这是一个恐怖的世界,一条恶龙在这片领域盘旋。当然,这也是属于勇士的世界,力量和坚持是我们唯一的希望!

为了打败这条恶龙,我们要了解它的弱点,所以把它拖进IDA里分析一下。

这是一个C++的二进制文件,用到了较多的C++库函数。

执行二进制文件后,发现是需要我们输入一个字符串,直接去IDA里找,success or win等字符串。并找到它们调用的地点。

嗯 ,找到了 :[+] A great success! Here is a flag{

调用的地址是0x40E02C

那么find_addr=0x40E02C。

然而,用例并不是按照常规套路来找start地址和find地址的,而是基于unicorn引擎采用的动态符号执行分析的二进制文件。

 st = p.factory.full_init_state(args=['./wyvern'], add_options=angr.options.unicorn)

原因:该块构建了用于分析的初始程序状态。 因为我们必须深入到C ++标准库中才能正常工作,所以我们需要运行每个初始化工具。 full_init_state会做到这一点。 为了达到这个目的,我们将使用unicorn引擎!

看来还是由于库函数的原因,angr不能完全模拟执行,hook又很麻烦,所以干脆动态分析了。

判断输入字符串的长度代码:

 v6 = std::string::length(input) - 1LL != legend >> 2;

其中legend=0x73 右移2位 为0x1c=28,只有当v6为1时才能进入success的逻辑,所以输入应为29。

因此,我们可以将输入的长度约束为29,前28个为可打印字符,最后一个字符是换行符。

开始执行这个二进制文件,直到没有active路径,即执行至结束状态。

打印程序输出数据:

out = pp.posix.dumps(1)

过滤出包含flag的输出:

if 'flag{' in out:

            return filter(lambda s: 'flag{' in s, out.split())[0]

用例源码:

#!/usr/bin/env python
# coding: utf-8
import angr
import time

def main():
    # Load the binary. This is a 64-bit C++ binary, pretty heavily obfuscated.
    p = angr.Project('wyvern')

    # This block constructs the initial program state for analysis.
    # Because we're going to have to step deep into the C++ standard libraries
    # for this to work, we need to run everyone's initializers. The full_init_state
    # will do that. In order to do this peformantly, we will use the unicorn engine!
    st = p.factory.full_init_state(args=['./wyvern'], add_options=angr.options.unicorn)

    # It's reasonably easy to tell from looking at the program in IDA that the key will
    # be 29 bytes long, and the last byte is a newline.

    # Constrain the first 28 bytes to be non-null and non-newline:
    for _ in xrange(28):
        k = st.posix.files[0].read_from(1)
        st.solver.add(k != 0)
        st.solver.add(k != 10)

    # Constrain the last byte to be a newline
    k = st.posix.files[0].read_from(1)
    st.solver.add(k == 10)

    # Reset the symbolic stdin's properties and set its length.
    st.posix.files[0].seek(0)
    st.posix.files[0].length = 29

    # Construct a SimulationManager to perform symbolic execution.
    # Step until there is nothing left to be stepped.
    sm = p.factory.simulation_manager(st)
    sm.run()

    # Get the stdout of every path that reached an exit syscall. The flag should be in one of these!
    out = ''
    for pp in sm.deadended:
        out = pp.posix.dumps(1)
        if 'flag{' in out:
            return filter(lambda s: 'flag{' in s, out.split())[0]

    # Runs in about 15 minutes!

def test():
    assert main() == 'flag{dr4g0n_or_p4tric1an_it5_LLVM}'

if __name__ == "__main__":
    before = time.time()
    print main()
    after = time.time()
    print "Time elapsed: {}".format(after - before)




查看评论

用符号执行技术搞定crackme

Kao的toy project是一个非常棒的crackme,非常适合展示符号执行的力量。运行crackme提供了一个安装ID,我们需要输入一个解锁代码。 这里的安装ID本来应该是XXXXXXXX...
  • qq_32400847
  • qq_32400847
  • 2017-06-11 13:46:04
  • 1186

符号执行工具angr安装教程

符号执行工具angr的安装教程
  • xiaosatianyu
  • xiaosatianyu
  • 2016-06-04 22:19:55
  • 5727

angr符号执行用例解析——0ctf_trace

在这个用例中,给出了一个带有程序执行的trace的text文件。这个文件有两列,地址和执行指令。所以我们知道所有的执行的指令和分支,但是我们不知道初始数据。通过逆向,我们发现在栈上有一段缓冲区最先由已...
  • doudoudouzoule
  • doudoudouzoule
  • 2018-03-14 10:29:45
  • 127

符号执行

https://www.zhihu.com/question/38727250 https://github.com/saswatanand/symexbib 首先随便找个开源...
  • cnbird2008
  • cnbird2008
  • 2017-02-20 20:10:59
  • 1889

angr符号执行用例解析——CADET_00001

源码及二进制文件链接:https://github.com/angr/angr-doc/tree/master/examples/CADET_00001CADET_00001是DARPA为网络大挑战赛...
  • doudoudouzoule
  • doudoudouzoule
  • 2018-04-01 10:52:18
  • 37

angr符号执行用例解析——defcon2016quals_baby-re

用例源码以及二进制文件链接:https://github.com/angr/angr-doc/tree/master/examples/defcon2016quals_baby-re执行二进制文件,发...
  • doudoudouzoule
  • doudoudouzoule
  • 2018-04-17 18:42:43
  • 18

angr源码分析——claripy ,factory

claripy是一个符号求解引擎,大多数时候,我们只是简单使用claripy,然而当我们做一些核心的符号执行分析时,则不得不深入claripy api,了解其实现细节及处理逻辑,从而进行改进。就我目前...
  • doudoudouzoule
  • doudoudouzoule
  • 2018-02-25 21:26:18
  • 90

angr符号执行用例解析——defcamp_r100

用例源码以及二进制文件链接:https://github.com/angr/angr-doc/tree/master/examples/defcamp_r100这道题非常非常简答啦!就是要求输入一个p...
  • doudoudouzoule
  • doudoudouzoule
  • 2018-04-17 10:45:26
  • 4

angr符号执行用例解析——asisctffinals2015_license

源码及二进制文件链接: https://github.com/angr/angr-doc/tree/master/examples/asisctffinals2015_license分析题目:运行二进...
  • doudoudouzoule
  • doudoudouzoule
  • 2018-04-12 15:51:08
  • 5
    个人资料
    持之以恒
    等级:
    访问量: 5187
    积分: 578
    排名: 9万+