黑盒 fuzz 工具 Jackalope 的使用

0x00 前言

Jackalope 是一款专用于 Windows/macOS 的黑盒 fuzz 开源工具,相比于 WinAFL 他要小众得多;WinAFL 是基于 DynamoRIO 插桩工具实现的,能够处理复杂的插桩需求,而 Jackalope 是基于 TinyInst,是基于调试器原理实现的轻量级动态检测库,Jackalope 更便于用户理解和自定义开发,也有一定的应用场景。

Jackalope 和 WinAFL 实现原理不同,但使用起来基本差不多,了解过 WinAFL 的小伙伴可以很快掌握这个工具;同时 Jackalope/TinyInst/WinAFL 都出自于googleprojectzero团队。本文主要介绍和演示 Jackalope 的使用。

 

本文实验环境

windows 10 专业版 x64 1909
Visual Studio 2019
Python 3.10.9

0x01 环境配置

首先配置Visual Studio开发环境,勾选「使用C++的桌面开发」即可:

image

随后配置Python3环境,注意勾选自动添加环境变量:

image

0x02 编译

按照官方提供的指南,我们打开 Visual Studio 命令提示符进行编译:

$ cd C:\Users\john\Desktop\Jackalope
$ git clone --recurse-submodules https://github.com/googleprojectzero/TinyInst.git
$ mkdir build
$ cd build
$ cmake -G "Visual Studio 16 2019" -A x64 ..
$ cmake --build . --config Release

执行如下:

image

编译成功后,可在[src]/build/Release/下看到二进制文件fuzzer.exe

image

0x03 fuzz test

Jackalope 源码中还提供了test.cpp测试代码,会自动编译生成[src]/build/Release/test.exe,我们使用该二进制文件演示 Jackalope 的使用。

test.cpp源码中提供了-f/-m两个命令行参数,用于区分直接读取文件加载数据还是使用内存映射的方式加载数据,其核心代码如下:

image

void FUZZ_TARGET_MODIFIERS fuzz(char *name)被定义为导出函数,其核心逻辑为从文件中读取数据,若数据长度大于 4,且前 4 个字符串等于0x74736574也就是test时,手动触发空指针访问的错误。

接下来我们对test.exe进行 fuzz,构造工作目录,以及提供种子文件1.txt如下:

$ cd [src]/build/Release/
$ tree
.
├── in
│?? └──  1.txt
├── out
├── fuzzer.exe
└── test.exe
$ cat in/1.txt
1234

使用如下命令进行 fuzz:

# 指定样本输入目录 '-in in',结果输出目录 '-out out',超时时间为 '-t 1000'ms
# 指定覆盖率收集模块为 '-instrument_module test.exe',目标模块为 '-target_module test.exe',目标函数为 '-target_method fuzz'
# 开启 '-cmp_coverage' 覆盖率比较,可更高效的爆破多字节比较从而发现新路径
$ fuzzer.exe -in in -out out -t 1000 -instrument_module test.exe -target_module test.exe -target_method fuzz -cmp_coverage -- test.exe -f @@

详细命令行参数请参考 Jackalope/TinyInst 的 README.md

执行如下:

image

运行一段时间后我们便收获了 crash,手动Ctrl-C停止 fuzz,其out目录结构以及 crash 样本如下:

$ cd [src]/build/Release/
$ tree out
out/
├── crashes
│?? └──  access_violation_0000xxxxxxxxx0E0_0000000000000000_1
├── hangs
├── samples
│?? ├── sample_00000
│?? ├── sample_00001
│?? ├── sample_00002
│?? └── sample_00003
├── input_1
└── state.dat
$ cat out/crashes/access_violation_0000xxxxxxxxx0E0_0000000000000000_1
test

实际使用 Jackalope 时,要避免将二进制命名为test.exe,因为正常编译 Jackalope 后与fuzzer.exe同目录下有个官方的test.exe,该文件会被优先加载。

0x04 持久模式

Jackalope 也和 WinAFL 一样提供了持久模式,也就是启动目标程序一次,重复执行执行目标 fuzz 函数多次,以这种方式减少 fuzz 过程中执行目标程序初始化代码的次数,从而提高 fuzz 效率,在 WinAFL 中使用的参数是-fuzz_iterations 100,Jackalope 使用以下一组参数:

# 指定每轮运行 100 次目标函数
-iterations 100 
# 开启持久模式 '-persist -loop',指定目标函数参数为 1 个 '-nargs 1'
-persist -loop -nargs 1

使用持久模式对test.exe进行 fuzz:

fuzzer.exe -in in -out out -t 1000 -instrument_module test.exe -target_module test.exe -target_method fuzz -iterations 100 -persist -loop -nargs 1 -cmp_coverage -- test.exe -f @@

对比上文可以看到 fuzz 速度大幅提高:

image

多核CPU的情况下,还可以结合并发模式-nthreads [n]完全发挥机器性能。

0x05 兼容自定义异常处理

在程序开发中使用异常处理是一件很常见的事情,但对于基于调试器原理实现的 Jackalope 则是一个问题,当目标程序被调试器附加时发生了异常,会将异常首先传递给调试器进行处理,这就会导致 Jackalope 无法正确执行:若种子文件触发异常则会被视为无效种子文件,若 fuzz 过程中触发异常则会存入到 crash 结果中,但实际上在目标程序中却是一个功能正常的异常处理。

Jackalope(TinyInst) 提供了对异常的兼容处理,使用-patch_return_addresses-generate_unwind(需要 UNWIND_INFO version 2,旧版 Windows 不支持) 参数即可,详情可以参考 https://github.com/googleprojectzero/TinyInst#return-address-patching

我们在test.cpp中添加自定义异常处理的代码如下:

if (sample_size >= 4) {
        ......
    }
    // custom-exception
    if (sample_size == 3) {
        __try {
            throw "THIS IS TEST EXCEPTION";
        }
        __except (EXCEPTION_EXECUTE_HANDLER) {
            printf("ok, try-except size = 3\n");
        }
    }

    ......

重新编译test.exe后,我们使用123作为种子文件,启动 fuzz 的同时使用-trace_debug_events参数以便我们排查 Jackalope 运行过程中的问题,随后可以看到
自定义异常导致一些错误日志Debugger: Exception e06d7363 at address ......

image

最终 Jackalope 会报错退出:

[!] WARNING: Process exit during target function

[!] WARNING: Input sample resulted in a hang
[-] PROGRAM ABORT : No interesting input files
         Location : Fuzzer::SynchronizeAndGetJob(), C:\Users\john\Desktop\Jackalope\fuzzer.cpp:630

那么添加-patch_return_addresses参数即可处理以上由自定义异常引发的问题:

# Example
$ fuzzer.exe -in in -out out -instrument_module test.exe -target_module test.exe -target_method fuzz -patch_return_addresses -cmp_coverage  -trace_debug_events -- test.exe -f @@

0x06 覆盖率

Jackalope 使用-dump_coverage可以生成覆盖率文件,如下:

$ fuzzer.exe -in in -out out -t 1000 -instrument_module test.exe -target_module test.exe -target_method fuzz -cmp_coverage -dump_coverage -- test.exe -f @@

运行一段时间后,可在out目录下看到覆盖率文件coverage.txt,使用 IDA 加载 test.exe 文件,并使用 lighthouse 插件加载coverage.txt,可以查看覆盖率情况如下:

image

0x07 样本预处理

在 WinAFL 中我们使用afl-fuzz.exe进行 fuzz,如果输入文件夹中提供的种子文件存在问题,导致目标程序 crash 时,WinAFL 会停止运行并给予提示;但是 Jackalope 的处理机制不同,即便种子文件导致目标程序 crash,但只要有任一种子文件能够让目标程序正常运行,Jackalope 都会正常运行,并基于正常的种子文件进行变异和 fuzz。

这可能导致我们使用 Jackalope 时无法按照样本种子产生预期的覆盖率,所以在实际进行 fuzz 前,最好对样本种子进行校验,编写如下 powershell 脚本:

Get-ChildItem ".\input\" |
Foreach-Object {
    $result = "BAD"
    .\test.exe $_.FullName
    if ($LASTEXITCODE -eq 0) {
        $result = "GOOD"
        Copy-Item $_.FullName -Destination ".\good\"
    } else {
        $result = "BAD"
        Copy-Item $_.FullName -Destination ".\bad\"
    }
    Write-Host $_.FullName $result
}

根据我们编写的目标程序,程序正常运行时的退出码(exit code)为 0,为其他时表示发生异常错误。

除此之外,Jackalope 也提供对语料库最小化的操作,使用-dry_run参数启动 fuzz,Jackalope 在加载处理完所有的样本文件后直接退出,随后便可以在[out]/samples目录下看到通过覆盖率筛选后的样本文件,后续 fuzz 便可以用该文件夹的内容作为输入。

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

  • 2023届全国高校毕业生预计达到1158万人,就业形势严峻;
  • 国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 

网络安全行业特点

1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

 1.学习路线图 

 攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。 

 因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。 

 还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

 因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值