逆向工程核心原理笔记,先记录notepad.exe的脱壳过程,然后练习一道河北省研究生信息安全大赛的upx脱壳题

notepad的EP代码

首先看一下原notepad.exe程序的EP代码,

 

在010073B2地址处调用了GetModuleHandleA() API,获取notepad.exe程序的ImageBase

在010073B4与010073C0地址处比较MZ与PE签名,熟记原PE代码

notepad_upx.exe的EP代码

调试器判断该文件为压缩文件,在是与否中任选一个,显示出UPX EP代码

 

EP地址为01015330,该处即为第二个节区的末端部分。实际压缩的notepad源代码存在于EP地址(01015330)的上方

01015330  >  $ 60                      pushad

01015331 . BE 00100101          mov esi,notepad_.01011000

01015336 . 8DBE 0000FFFF     lea edi,dword ptr ds:[esi-0x10000]

 

首先使用PUSHAD命令将EAX~EDI寄存器的值保存到栈,然后分别把第二个节区的起始地址(01011000)与第一个节区的起始地址(01001000)设置到ESI与EDI寄存器,UPX文件第一个节区仅存在于内存。该处即是解压缩后保存源代码的地方。

 

调试时像这样同时设置ESI与EDI,就能预见从ESI所指缓冲区到EDI所指缓冲区的内存发生了复制。此时从Source(ESI)读取数据,解压缩后保存到Destination(EDI)。我们的目标是跟踪上图中的全部UPX EP代码,并最终找到原notepad的EP代码。

 

实际代码逆向分析中并不会逐一跟踪执行压缩代码,常使用自动化脚本、特殊技巧等找到OEP。但是对于初次学习运行时压缩文件的朋友而言,逐一跟踪代码才是正确的学习方法。

跟踪UPX文件

法则

“遇到循环(loop)时,先了解作用再跳出”

循环#1

开始追踪代码不久后,会遇到一个短循环。暂停跟踪,仔细查看相应循环

 

循环次数ECX=36B,循环内容为“从EDX(01001000)中读取一个字节写入EDI(01001001)”。EDI寄存器所指的0100100地址即是第一个节区(upx0)的起始地址,仅存于内存中的节区。

跳出循环

 

循环#2

 

该循环是正式的解码循环(或称为解压缩循环)。

先从ESI所指的第二个节区(UPX1)地址中依次读取值,经过适当的运算解压缩后,将值写入EDI所指的第一个节区(UPX0)地址。

循环#3

 

该段代码用于恢复源代码的CALL/JMP指令(操作码:E8/E9)的destination地址。在01015436地址处设置断点运行后即可跳出循环。

 

到此处几乎接近尾声了,只要再设置好IAT,UPX解压缩代码就结束了。

循环#4

重新跟踪代码,再稍微进行一段。

深色显示部分即为设置IAT的循环。在01015436地址处设置EDI=01014000,它指向第二个节区(UPX1)区域,该区域中保存着原notepad.exe调用的API函数名称的字符串

 

UPX压缩原notepad.exe文件时,它会分析其IAT,提取出程序中调用的API名称列表,形成API名称字符串。

 

用这些API名称字符串调用上上图中01015467地址处的GetProcAddress()函数,获取API的起始地址,然后把API地址输入EBX寄存器所指的原notepad.exe的IAT区域。该过程会反复进行至API名称字符串结束,最终恢复原notepad.exe的IAT.

 

notepad.exe全部解压缩完成后,应该将程序的控制返回到OEP处。

 

另外、010154AD处的POPAD命令与UPX代码的第一条PUSHAD命令对应,用来把当前寄存器恢复原状。

 

最终,使用010154BB地址处的JMP命令跳转到OEP处,要跳转到的目标地址为0100739D,它就是原notepad.exe的EP地址。

快速查找UPX OEP的方法

在POPAD指令后的JMP指令处设置断点

upx压缩器的特征之一是,其EP代码被包含在PUSHAD/POPAD指令之间。并且,跳转到OEP代码的JMP指令紧接着出现在POPAD指令之后。只要在JMP指令处设置好断点,运行后就能直接找到OEP。

 

提示:

·PUSHAD指令将8个通用寄存器(EAX~EDI)的值保存到栈。

·POPAD指令把PUSHAD命令存储在栈的值再次恢复到各个寄存器。

 

在栈中设置硬件断点

该方法也利用UPX的PUSHA/POPAD指令的特点。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注