《Linux二进制分析》--Linux 下的 ELF 二进制取证分析

检测入口点修改技术

程序入口点,即 ELF 文件头中的e_entry 成员变量, 目的是检测 e_entry 是否存放了一个指向标志着二进制文件被异常修改过的地址

检测其他形式的控制流劫持

阐述两个概念:(GOT/PTL)

全局偏移量表(global offset table.GOT)。GOT包含每个被这个目标模块引用的全局数据目标的表目。编译器还为GOT中每个表目生成一个重定位记录。在加载时,动态链接器会重定位GOT
中的每个表目,使得它包含正确的绝对地址。PIC代码在代码中实现通过GOT间接的引用每个全局变量,这样,代码中本来简单的数据引用就变得复杂,必须加入得到GOT适当表目内容的指
令。对只读数据的引用也根据同样的道理,所以,加上 IC编译成的代码比一般的代码开销大。

  如果一个elf可执行文件需要调用定义在共享库中的任何函数,那么它就有自己的GOT和 PLT(procedure linkage table,过程链接表).这两个节之间的交互可以实现延迟绑定(lazy binging),这种方法将过程地址的绑定推迟到第一次调用该函数。为了实现延迟绑定,GOT 的头三条表目是特殊的:GOT[
0]包含.dynamic段的地址,.dynamic段包含了动态链接器用来绑定过程地址的信息,比如符号的位置和重定位信息;GOT[1]包含动态链接器的标识;GOT[2] 包含动态链接器的延迟绑定代码的入口点。GOT的其他表目为本模块要引用的一个全局变量或函数的地址。PLT是一个以16字节(32位平台中)表目的数组形式出现的代码序列。其中 PLT[0]是一个特殊的表目,它跳转到动态链接器中执行;每个定义在共享库中并被本模块调用的函数在PLT中都有一个表目,从PLT[1]开始.模块对函数的调用会转到相应PLT表目中执 行,这些表目由三条指令构成。第一条指令是跳转到相应的GOT存储的地址值中.第二条指令把函数相应的ID压入栈中,第三条指令跳转到PLT[O]中调用动态链接器解析函数地址,并 把函数真正地址存入相应的GOT表目中。被调用函数GOT相应表目中存储的最初地址为相应PLT表目中第二条指令的地址值,函数第一次被调用后.GOT表目中的值就为函数的真正地 址。因此,第一次调用函数时开销比较大.但是其后的每次调用都只会花费一条指令和一个间接的存储器引用。

修改.ctors/.init_array 节

分析:.ctors 节中保存了一个存放着地址的数组,这些地址是.init 节初始化代码调用的函数指针。函数指针指向的是构造器创建的函
数(构造器在 main()函数之前执行)。也就意味着可以对.ctors 的函数指针表进行修改,指向注入到二进制文件中的代码,也即我们所说的寄生代码

构造器例程应该总是存放在 text 段的.text 节中特定的位置。.text节不是 text 段,而是 text 段所属范围的一部分。如果.ctors 节存放的函数
指针指向了.text 节以外的位置,这就非常可疑了

检测 PLT/GOT 钩子

检测函数蹦床

识别寄生代码特征

检查动态段是否被 DLL 注入

识别逆向 text 填充感染

识别 text 段填充感染

识别被保护的二进制文件

猜你喜欢

转载自www.cnblogs.com/mysky007/p/12500325.html