语义:%esp <- %esp-4 (substraction) ss:[%esp] <-%eax (move) 如前所述,这是经中间语言处理的。在此我们需要追踪基本的内存区域,以及它们的大小和 寄存器名称(保持按位信息_这相对于字节级【21】可更好地避免误报,但收集的数据量 极易发生数据爆炸)。 布尔操作也存在一种特殊情况,就是当它们对相同数据或者固定值进行操作时可能会生 成不同的结果,比如相同的污染数据进行异或操作将返回未污染的信息(比如与0操作等 等…),正如前面解释的。一些字符串指令也可能被污染(一些整数溢出的发生可以是由数 据大小计算错误导致的)。关于字符串的污染操作将在后续的“从崩溃到利用” 一节中讲到。 污染数据可以在系统中存在很长时间,进而又导致其它问题的出现(若要删除追踪数据,就 得要求该数据是接收一个不可控制值的,或者已经以某种方式被释放了)。在数据追踪过程 中的指令复杂度应该简明些,便于加速分析进度。 污点分析可能面临着各种挑战,比如可能会遇到缺乏某一特定文件格式或协议的源数据 等详细信息,因此对于构造可用的故口10^也是存在很大困难的,在此笔者使用了一种与众 不同的方法。这种方法在你重现崩溃事件后非常有用,这种方法就叫污点回溯分析。 污点回溯撕 ^.^JV 污点回溯分析是通常的数据流污点分析的逆向方法。基本的方法就是不采用获取所有的 输入数据,而是将它们标记为污点,并在程, 去追踪它们,而我们要做的就是追踪过程中可收集一些有用的信息,比如有影响作用的地址以及数值(后面可用于检测数据是复制到哪里,以及它是如何被影响到的)。注意: 參这是使用[汕8&插件来完成的。 參只支持基础x86指令集(因此不支持碰伙和SSE)。这就局限了某些情况下的分析, 并且只能在支持的指令集上进行扩充。由于此项目是开源的,所以希望有人可提交补 丁给笔者,以帮助改进。 參简化指令集使下一步操作更为轻松。 为了简化指令集,就需要处理一些特殊情况,比如以下指令: 參 CMPXCHG r/m32, r32 ->将EAX与r/m32进行比较,如果相等,则ZF被标记,同时 r32被加载进r/m32;否则清除ZF,并将r/m32加载进AL【17】 像这类指令需要一定条件才可被污染,攻击者可通过控制%6&1和r32来控制r/m32o 追踪过程中可生成文件以用于下一步的操作,该文件包含: 參指令的内存地址 參操作数 參依赖的源操作数 这里举个依赖操作数的例子,比如间接内存地址。它将创建一个数据流结构树,而在崩溃指 令中存在一个根(root)。分析步骤中接收的地址范围里包含有攻击者恶意构造的数据,然 后对其进行自动分析,以检测出哪些数据被恶意控制了。 參这是一个独立工具(位于同一项目文件中),并且拥有界面! 由于数据流在崩溃指令的树根中是有效的,因此分析过程只需在这一树中进行搜索,这个借 助8?3算法【18】(译注:狭度优先搜索)即可实现。下面看些代码例子: 1-) mov edi, 0x1234 dst=edi, src=0xl234 2-) mov eax, [OxABCD] dst=eax, src=ptr 0xABCD 注意0xABCD是一个邪恶的地址 3-) lea ebx, [eax+ecx*8] dst=ebx, src=eax, srcdepl=ecx 4-) mov [edi], ebx dst=ptr 0x1234, src=ebx 5-) mov esi, [edi] dst=esi, src=ptr 0x1234, srcdepl=edi 6-) mov edx, [esi] 崩溃!!!
树结构看起来如下: |