首页
社区
课程
招聘
[讨论]动态二进制插装平台:Pin 文档阅读
2020-9-14 20:00 9094

[讨论]动态二进制插装平台:Pin 文档阅读

2020-9-14 20:00
9094
学了一年的二进制,没有太多的成就。于是开始尝试自己挖掘漏洞,于是开始尝试使用Sulley。在模糊测试过程中查看pcap文件时发现sulley的模糊测试数据似乎重复性很大(虽然有Encoder属性,Encoder属性使Sulley有了良好的扩展性),并没有太多的随机性(也可能是数据形式的原因),所以萌生了自己构建模糊器的想法。
既然要写模糊器,那么数据产生器的可复用性和扩展性必须要好。提供遗传算法,以提高整体的有效率,而且数据必须要有一定的随机性,并且需要有数据与数据间的依赖关系。
遗传算法的两个必要函数:
1.适应性函数(辨别哪些是好的模糊数据)
2.变异函数(如何在好的数据上生成新的函数)

关于适应性函数,有一点想法,延续AFL的思想通过动态二进制插装来选择数据。由于程序是由数个分支构成,模糊测试所作的便是遍历所有的分支以及这些分支组合后的行为,来找到程序员所没有考虑到的情况。那么可以通过程序是否进入分支结构(ja,je)以及分支结构下是否有其他分支来评判数据的有效性。覆盖率来评判一次模糊测试的完成率,并调整。但是在源程序插入代码带来的模糊测试低效只能通过算法解决。
Pin 3.14必须通过vs2019来编译,Pin是即使的,也就是说源程序开始执行第一条指令之前,Pin便获得程序的控制权。并且Pin是通过将文件插入到目标程序中来提供服务(dll,so),那么我们的程序便能获得程序的所有信息。
Pin有三个模式:  
1. TARCE模式,在这个模式下Pin从分支目标开始将指令序列解释为只有一个输入输出的bbl块。并以bbl块为基本数据结构插入代码(Google翻译:Pin保证仅在分支的开始输入跟踪,但是它可以包含多个出口。如果分支连接到跟踪的中间,则Pin会构建一个以分支目标开头的新跟踪,Pin将迹线分为基本块BBL。BBL是单入口单出口指令序列),TARCE模式利用TRACE_AddInstrumentFunction API。在此模式下bbl有一个特性,就是将重复分支代码段。下面是一个Pin提供的例子
switch(i)

{
case 4: total++;
case 3: total++;
case 2: total++;
case 1: total++;
case 0:
default: break;
}
它将生成类似这样的指令(对于IA-32架构)
.L7:
addl $1, -4(%ebp)
.L6:
addl $1, -4(%ebp)
.L5:
addl $1, -4(%ebp)
.L4:
addl $1, -4(%ebp)
如果程序进入L7则bbl包括l7,l6,l5,l4,如果程序进入l6,则包括
l6,l5,l4.并且在遇到CUPID,popf,rep(中间一个不知道是啥)指令时会终止跟踪,因此会破坏bbl,以为rep为隐式循环,因此,如果REP前缀指令多次迭代,则在第一次循环生成一个bbl,第二次一个bbl,因此在这种情况下,将看到比预期更多的bbl执行。
2.instrument模式
这个模式很像单步调试,执行一个指令获得控制权。Pin已摆脱了对跟踪内的指令进行迭代的责任。如在跟踪仪器中所述,某些BBL及其内部的指令可能会多次生成(并因此被仪器化)API为INS_AddInstrumentFunction。
3.IMAGE和ROUTINE模式
IMAGE和ROUTINE模式是通过“缓存”插装请求来实现的,因此会产生空间开销。Pin在首次加载时检查并检测整个文件IMAGE,Pin可以遍历目标程序的section, SEC,函数的retn,ROUTINE的INS。API为IMG_AddInstrumentFunction和RTN_AddInstrumentFunction,IMAGE模式使用符号信息来确定例程边界,因此必须在PIN_Init之前调PIN_InitSymbols。IMAGE模式在执行例程之前或之后或在执行指令之前或之后执行插装
在Image和Routine模式,不可能知道例程是否会实际执行(因为这些工具是在图像加载时完成的)。通过标识作为例程开始的指令,可以仅跟踪在Trace或Instruction模式例程中执行的IMAGE的指令

 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回