首页 > 编程知识 正文

asi文件(ase文件)

时间:2023-05-04 22:46:46 阅读:86460 作者:597

作者: o0xmuhe

估计稿费: 300RMB

如何:向linwei#360.cn发送邮件或登录网络版在线投稿

0x00:简介

我在整理去年的笔记的时候,发现了躺在印象笔记里的用peach进行文件格式fuzz的笔记,所以整理后有了这篇文章。 希望对入门挖洞的同学有帮助。

我觉得文件格式fuzz应该比较容易使用,所以选择了学习peach,学习文件格式fuzz。 在willj老师的指示下,我去了位于fuzz的播放器。 虽然只是尝试,没有什么成果,但fuzz的过程还是很清楚的。 过程中自动化的fuzz脚本具有完整的功能。 那个担心效率。 - -必须完成。 整个项目只是个托y ~

关于0x01:文件格式fuzz

个人资料

文件格式fuzz简单地说是用于文件格式分析的fuzz。 让我们以播放器为例:

首先播放器对应特定的视频文件格式(flv、mp4、mov、avi等……) ),用户将想要播放的文件传递给播放器后,播放器根据文件格式分析该文件,并与之相应

攻击面是分析文件的部分

1 .如果收到畸形文件呢?

2 .如果我搬入了一些结构异常的文件怎么办?

3……

如上例所述,如果我们收到的文件有些结构异常,播放器还能正常工作吗? 是进入异常处理,还是直接崩溃? 可以使用crash吗?

记住最初接触漏洞挖掘和利用时,最初接触到的漏洞是某播放器的m3u文件的堆栈溢出,由于没有简单粗暴地对文件结构进行检查,在数据处理中发生了堆栈溢出,从而可以执行代码

选择工具

决定使用peach2.3.9选择工具。 因为是用Python写的,所以有源代码,容易阅读。

peach是一种优秀的文件格式fuzz工具。

peach基于模板的变异而工作,是开源的,文档不是很多,但是自己摸索、学习可以学到基本的使用方法。 我在看用peach制作文件的fuzz相关资料时,最初看到的《0day2》中作者给的例子是,制作pit file后跑到fuzz; 之后,我看到了国际友人写的fuzzingwithpeachpart1flinkd! 他的这篇文章写得很好,几乎涵盖了peach语法的90%。 仔细阅读,自己实践,很快就会进入pit file的制作。

0 x02:pit文件概述

peach基于提供的模板文件和相应的pit文件,根据创建的pit文件分析模板文件,并通过改变一些结构来生成新文件。 如果你写得很详细,也就是说粒度很小,分析起来会很慢,但fuzz更全面。 但是,peach生成的样本很多都很相似,可能对执行路径的覆盖不太好,但是量很大~

建议这部分直接参考官网,以及一些例子。 虽然官网的文档很难懂,但是和大牌的pit file组合起来,马上就可以着手制作pit file了啊。

这里只介绍基本的构造。

数据模型

DataModel是定义数据结构的元素,可以定义哪些结构需要Fuzz,哪些结构不需要Fuzz。

状态模型

StateModel管理着Fuzz进程的执行流程。

代理程序

Agents用于监视Fuzz中程序的行为,并捕获程序的崩溃信息。

测试块

Test Block负责将状态模型和代理等与单一的测试用例结合在一起。

运行块

Run Block定义在Fuzz进程中执行哪些测试。 此块还记录代理生成的信息。

支持的元素

1 .数据模型

DataModel元素是Peach根元素的子节点。 DataModel定义数据块的结构,并声明Number和String等子元素。

2 .模块

Block用于组合一个或多个其他元素,如Number和String。

3 .选择

Choice元素是数据模型或块的子元素。 Choice元素用于指定其中一个子元素是有效的,并且可以选择其中一个。 就像c语言的switch语法一样。

4 .字符串

String元素定义一个或两个字节的字符串。

5 .编号

Number元素定义长度为8位、16位、24位、32位或64位的二进制数。

6 .罗伯

Blob元素是数据模型或块的子元素。 Blob是用于定义未知类型的数据。

7. Flags

Flags 定义了一些以位为单位的集合,,比如一些标志位。

8. Relation

Peach 允许数据间的关系建模。关系像“X 是 Y 的大小”,“X 是 Y 出现的次数”,或者“X是 Y 的偏移(以字节为单位)”。

size-of Relation

count-of Relation

When 这个关系用来决定一个元素是否用

基础内容的话,推荐参考看雪的教程【原创】文件Fuzz教程之一:Peach语法介绍

0x03: 文件fuzz的思路


现在进入正题,fuzz嘛,简单的来看就是

构造输入

传给目标程序

程序状态检测(是否crash)

做log

之后根据你的log,把产生了crash的样本拿出来单独分析,看看是不是有价值-。-

所以,我的想法也很简单,就是利用peach基于我给的一个小文件,生成很多样本,然后写自动化的脚本去fuzz,并且做好异常检测的工作。

这里我们假设选取Adobe flash player sa版本,刚开始尝试就做一点简单的,选择flv文件作为fuzz的点。其实你选啥都无所谓...直接选一些播放器可能还更简单。

下面我们面临的问题就是:

1. flv文件格式

2. 根据文件格式编写pit file

3. 如何加载我的fuzz.flv文件?

4. 异常检测怎么做

下面慢慢来分析。

flv文件格式

flv文件主要分为header和body两个部分。

1.1. header部分

第1-3字节:文件标志,FLV的文件标志为固定的“FLV",字节(0x46, 0x4C,0x56),见上面的字节序和字符序两行;

第4字节:当前文件版本,固定为1(0x01)

第5字节:此字节当前用到的只有第6,8两个bit位,分别标志当前文件是否存在音频,视频。参见上面bit序,即是第5字节的内容;

第6-9字节:此4字节共同组成一个无符号32位整数(使用大头序),表示文件从FLV Header开始到Flv Body的字节数,当前版本固定为9(0x00,0x00,0x00,0x09)

1.2 .body部分

这部分其实就是很多的tag的组合。

不过tag的种类有三种,分别是script、Audio、Video。每种tag的tag data又各不相同,详细的可以看一些文档了解。

一些参考的文档flv文件格式详解,以及是官方的flv格式相关的文档都可以。

1. 根据文件格式编写pit file

了解了文件格式之后就是编写pit file了,困难的地方可能就在于tag结构,因为数目不确定,而且相互之间有联系,比如某个bit为1或者0,影响着后面的某个结构的有无。

我的做法是,我使用类似Switch case这样的结构,让peach自己去判断选择对应的结构,即我写三种tag,然后限定最大的出现次数,因为样本很小,出现的tag几百个最多了,然后peach根据模板文件的tag的标志,找到我pit file里对应的tag的结构,然后根据pit file里的结构进行变异,然后生成新的样本。

这里可以使用010 editor的二进制模板功能,可以对比你生成的样本是否正确,方便调试。

2. 如何加载我的fuzz.flv文件?

有了样本,下面的问题就是怎么加载样本然后播放了。

然而flash并不直接打开flv文件,而是使用swf来加载,所以我需要用as语言来编写一个swf来加载。这时候就有又一个问题:swf要编译的,即我的文件名会写死,这就相当于文件名硬编码进去了,这时候就麻烦了。

不过这个也好解决,我可以在后续的fuzz脚本中,每次单独复制一个样本到工作目录,然后重命名为swf要加载的文件的名字,然后起flash,加载swf,然后做后续的工作;完成之后,循环这个工作。这样就可以很好的解决这个问题了。

简单的来说就是:

从样本库复制一个样本-------->工作目录(并重命名为fuzz.flv)------->加载fuzz.swf文件-------->进入正常的fuzz流程(含异常捕获)

3. 异常检测怎么做

我觉得最简单的办法就是调试器了,如果你进程崩了,你的just in time debugger会启动,问你要不要调试。

所以呢,我们检测进程就可以了,如果有你设置的即时调试器,直接做log,杀了所有fuzz相关的进程,继续下一轮fuzz就好了。然而呢,这种方法缺点很明显,非常的不优雅,而且效率低的要死,不过刚开始搞嘛,凑合用咯。先跑起来,以后慢慢看着怎么搞优化。

0x04: 编写pit file


1.首先是针对flv header的部分的编写

先来看flv header的结构

第1-3字节:文件标志,FLV的文件标志为固定的“FLV",字节(0x46, 0x4C,0x56)(pit:对应pit的话,String标签就可以了)

第4字节:当前文件版本,固定为1(0x01) (pit:这个可以直接整合到选项1中去)

第5字节:此字节当前用到的只有第6,8两个bit位,分别标志当前文件是否存在音频,视频。(pit:bit位,直接使用Flags标签咯)

第6-9字节:此4字节共同组成一个无符号32位整数(使用大头序),表示文件从FLV Header开始到Flv Body的字节数,当前版本固定为9(0x00,0x00,0x00,0x09)(pit:既然是数字,使用Number标签就好了)

那么对应的xml应该是

2.这部分是script tag部分的编写

首先来看script tag结构,介绍的篇幅略长,不直观,我们直接看010 editor的二进制模板:

那么我们对应的xml如下

3.这部分是audio tag部分的编写

先看一下这部分的结构

然后我们对比模板来看:

最后编写的xml如下

4.这部分是video tag的部分的编写

先来看一下video tag的结构

模板中的代码如下:

0x05: swf加载样本


现在,pit file搞定了,下面就是swf了~

使用as语言编写的代码,编译后得到swf文件

0x06: 自动化fuzz脚本


我这里只使用peach生成了样本,并没有使用peach的Run Block。剩下的fuzz的工作,是我自己写脚本搞定的。

核心部分的代码如下。

0x07: 结束语


我这个东西只能叫toy吧,效率低下,简单粗暴。但是过程中是学习到不少东西,之后的打算是多看一些论文,多学习一些漏洞挖掘的方法,之前尝试了结合winafl来搞,不过问题很多,有待解决...慢慢来吧,欢迎有兴趣的同学一起交流~

所有的东西我都丢github了,有啥错误欢迎各位师傅留言或者邮件o0xmuhe#gmail.com联系我 传送门在这里:fuzz with peach。

0x08: 参考


【原创】文件Fuzz教程之一:Peach语法介绍

flv文件格式详解

peach 文档

Fuzzing with Peach – Part 1 « Flinkd!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。