软件安全基础之PE文件格式
值复习《软件安全》这门课之际,PE文件格式可谓是重中之重,在这里,我便结合教材和PPT,对相关知识进行一个小小的梳理。如有不当之处,希望能被指正!
什么是PE文件格式?
PE就是Portable Executable,它是Win32可执行文件的标准格式;
PE文件格式与恶意软件的关系
文件感染的定义:使目标PE文件具备“或启动”病毒功能,但不破坏目标PE文件原有功能和外在形态(如图标等);
病毒代码与目标PE文件融为一体的途径:代码植入、控制权获取、图标更改。
注:这里的代码植入可以分为两种,主动植入和被动植入,主动植入即是程序自身利用系统地正常功能或缺陷将攻击代码植入到目标中,而不需要人的干预;被动植入即是恶意软件将攻击代码植入到目标主机时,需要借助用户的操作——通常是和社会工程学的攻击方法相结合,诱使用户触发漏洞。
权限提升:
首先,访问控制:防止未经授权使用资源,包括防止以非授权方式使用资源;
访问权限:访问控制的访问规则,用来区别不同访问者对资源的访问权限。
而所谓的权限提升就是攻击者通过攻击某些有缺陷的系统程序,把当前较低的账户权限提升到更高级别的用户权限。
由于管理员的权限较大,通常将获得管理员权限看做是一种特殊的权限提升。
病毒被运行的流程:
- 用户点击(或系统自动运行)HOST程序
- 装载HOST程序到内存中
- 通过PE文件的AddressOfEntryPoint和ImageBase之和来定位第一条语句的位置
- 从第一条语句开始执行(病毒代码可能在此时,也可能在HOST代码运行过程中获得控制权)
- 病毒体代码主体执行完毕,将控制权交换给HOST程序
- HOST程序体继续执行
在这里提到一个概念叫AddressOfEntryPoint,ImageBase,这是两个在可选映像头中的字段。可选映像头是PE文件结构里面的一个组成部分,包含了PE文件的逻辑分布信息。
AddressOfEntryPoint是指程序开始执行的地方。这是一个RVA,这个地址通常指向代码节中的一个位置。在计算机病毒中,这个域非常关键。一般来说,计算机病毒可以通过修改这个值来指向自己的病毒体的开始代码以获得控制权。在修改这个域之前,病毒会保存原来的阈值,以便病毒体执行完之后,通过jmp语句跳回HOST原先程序入口处继续运行。
ImageBase则是可执行文件的默认转入基地址。
PE文件格式总体结构
-
DOS小程序
PE结构中的MZ文件头和DOS插桩程序实际上就是一个在DOS环境下显示提示信息的小程序。MZ文件格式中,开始两个字节是4D5A(这两个字节在后面的病毒感染中非常重要,在病毒通过添加新节的感染模式中,首先两步便是判断目标文件开头两个字节是否为MZ以及判断PE文件标记是否为PE) -
紧跟着DOS小程序后的便是PE文件的NT映像头,它由三个部分组成:字串、映像文件头、可选映像头
-
紧跟NT映像头的是节表。节表实际上是一个结构数组,其中每个结构包含了一个节的具体信息。该数组成员的数目由映像头文件结构中的NumberOfSections域的域值来决定
-
节紧跟在节表之后,PE文件一般都会有多个节且有多个种类:如代码节、引出函数节、引入函数节、已初始化的数据节、未初始化的数据节、资源节和重定位节等。
- 代码节 一般名为.txt或.code,该节含有程序的可执行代码。每个PE文件都有代码节。在代码节中,还有一些特别的数据,是作为调用引入函数之用。
- 引出函数节(.edata) 我们知道病毒在感染其它文件时,是不能直接调用API函数的,因为计算机病毒往其它HOST程序中所写的知识病毒代码节的部分。而不能保证HOST程序中一定有病毒所调用的API函数,这样就需要我们自己获取API函数的地址。有一种暴力的方法就是搜索Kernal32模块,利用引出函数节的数据获得API函数的地址。
具体方法是,首先在AddressOfNames中找到相应的字符串进行比较,如果匹配记住其序号为x;通过该序号从AddressOfNamesOrdinals指向的序号表中的第x个成员,找到我们所需要的函数地址在AddressOfFunctions字段所指向的数组中的具体位置y。 - 引入函数节(.idata) 它包含有从其他DLL中引入的函数。引入函数节也可能被病毒用来直接获取API函数地址。比如,直接修改或者添加所需函数的IMAGE_IMPORT_DESCRIPTOR结构后,当程序调入内存时,便会将所需函数的地址写入IAT表中公病毒获取,对于病毒来说,获取了LoadLibrary及GetProcAddress函数,基本上就可以获得所有其他的API函数了。
- 已初始化的数据节中存放的是在编译时刻就已经确定的数据
- 未初始化的数据节是存放的未初始化的全局变量以及静态变量。节的名称一般是.bbs
- 资源节 这个节一般用来存放图表,对话框等程序要用到的资源
- 重定位节 重定位节中存放了一个重定位表。这个技术非常重要。因为当病毒感染不同的HOST程序后,由于病毒代码依附到HOST程序中的位置各不相同,因此随着不同的HOST装入内存后,病毒中的各个变量在内存中的位置会随着HOST大小的不同而发生变化。比较简单的方法是通过(Base-offset V_start)+offset Var_Lable,这个整体就代表Var变量在HOST中时的实际内存地址。