这是内核漏洞挖掘技术系列的第九篇。
第一篇:内核漏洞挖掘技术系列(1)——trinity
第二篇:内核漏洞挖掘技术系列(2)——bochspwn
第三篇:内核漏洞挖掘技术系列(3)——bochspwn-reloaded(1)
第四篇:内核漏洞挖掘技术系列(3)——bochspwn-reloaded(2)
第五篇:内核漏洞挖掘技术系列(4)——syzkaller(1)
第六篇:内核漏洞挖掘技术系列(4)——syzkaller(2)
第七篇:内核漏洞挖掘技术系列(4)——syzkaller(3)
第八篇:内核漏洞挖掘技术系列(4)——syzkaller(4)

在上一篇文章中我们主要分析了一遍进行fuzz的流程,一直追踪到了系统调用的执行。这一篇文章我们主要介绍Generate和Mutate的具体实现。回到loop函数中,我们接下来看看Generate和Mutate的部分。Generate函数随机生成含有ncalls个系统调用的程序。

跟进generateCall函数,r.target.Syscalls是RegisterTarget函数初始化的。如果有ChoiceTable调用上一篇文章说过的Choose函数选择一个,然后调用generateParticularCall函数继续根据系统调用号生成具体的系统调用类型。



依次调用了generateParticularCall->generateArgs->generateArg->generateArgImpl,generateArgImpl函数只是生成了参数本身而并没有生成具体的内容,后续调用不同的generate函数进行不同的处理。

比如对于指针类型,随机生成一个特殊的值或者正常的值。

这里的特殊值可能是0x0000000000000000这样的空指针,0xffffffffffffffff这样没有映射到的内核地址或者是0x9999999999999999这样不规范的地址。

对于数组类型,根据数组长度是否有指定的范围随机生成数组的长度,再根据数组的类型调用对应的generateArg函数生成每个元素的值。

Generate的部分分析完成之后我们来接着分析Mutate的部分。Mutate部分会随机选择下面几种变异类型。

squashAny函数对参数进行压缩,因为能够压缩参数的情况比较少,所以可能性是最低的。test中的例子如下。
之前:

`foo$any0(&(0x7f0000000000)={0x11,0x11223344,0x2233,0x1122334455667788,{0x1,0x7,0x1,0x1,0x1bc,0x4},[{0x0,@res32=0x0,0x0,@i8=0x44,"aabb"},{0x0,@res64=0x1,0x0,@i32=0x11223344,"1122334455667788"}]})`,

之后:

`foo$any0(&(0x7f0000000000)=ANY=[@ANYBLOB="1100000044332211223300000000000088776655443322113d0079230000000000000000",@ANYRES32=0x0,@ANYBLOB="00000000000000000000000044aabb000000000000000000",@ANYRES64=0x1,@ANYBLOB="000000000000000044332211112233445566778800000000"])`,

splice函数克隆一份系统调用拼贴到原来的中间再移除拼贴后的后半部分。

insertCall函数插入系统调用。

test中的例子如下。

(mutator的)mutateArg函数调用(Target的)mutateArg函数对参数进行变异,在(Target的)mutateArg函数中根据不同的类型调用不同的mutate函数。

这里的处理方式和前面Generate的部分比较相似,有一些类型甚至是直接调用regenerate函数调用generateArg函数然后替换掉原来的。比如对于flag类型其实就是int类型,变异的方法包括加一个随机数,减一个随机数和异或一个随机数。对于struct/union类型来说首先会检测是否含有SpecialTypes特殊的类型。SpecialTypes允许对某些struct/union类型进行定制的Generate/Mutate。在linux系统中下面这些成员是SpecialTypes。

没有SpecialTypes的话调用generateArg函数然后替换掉原来的。

test中的部分例子如下。
变异flag:

变异filename:

变异array:

变异len:

变异proc:

(mutator的)removeCall函数调用(Prog的)removeCall函数随机移除一个系统调用。

内核漏洞挖掘技术系列关于syzkaller的部分暂时就结束了。

点击收藏 | 0 关注 | 2
  • 动动手指,沙发就是你的了!
登录 后跟帖