-
-
[分享]关于upx压缩的程序调试--查找OEP
-
发表于: 2022-3-7 19:24 10479
-
压缩器
运行时压缩器:针对可执行文件而言,可执行文件内部含有解压缩代码,文件在运行瞬间于内存中解压缩后执行。
目的主要是减少PE文件的大小、隐藏PE文件内部代码等
保护器
PE保护器主要用来保护PE文件免受代码逆向分析。目的主要是防止破解、保护代码与资源等。
使用PEview查看notepad_upx.exe。
需要注意的是,第一个节区UPX0的RawDataSize为0,这意味第一个节区在磁盘文件中是不存在的。从Virtual Size可以发现其值为00010000。这也就意味着经过UPX压缩后的PE文件在运行瞬间将压缩的代码解压到第一个节区。换一种说法,就是解压缩代码与压缩的源代码都在第二个节区,文件运行时首先执行解压缩代码,把处于压缩状态的源代码解压到第一个节区。解压过程结束后运行EP代码。
第一个节区的起始地址为01001000
第二个节区的起始地址为01011000
注意:如果想在PEview中看见地址,需要自行设置一下。
步骤如下:依次选中VIew->Address->Virtual Address。设置好后,即可在右边的窗口中看见地址。
原notepad.exe程序中的EP代码,EP入口地址为0100739D
OD打开upx压缩过的notepad_upx.exe程序,EP地址为01015330,该处为第二节区的末端部分。
前三条指令分别是
首先使用pushad指令EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 这8个32位通用寄存器依次压入堆栈,可以看到右下栈窗口已经出现先前8个寄存器的值
然后再将第二个节区的起始地址01011000与第一个节区的起始地址(01001000)设置到ESI与EDI寄存器。UPX文件第一个节区仅存在于内存。该处是解压缩后保存源文件代码的地方。
F8执行两下,可以看到ESI与EDI已经分别变成01011000、01001000
跟踪UPX文件,在跟踪数量众多的代码时,使用F7、F8就会变的麻烦,这个时候就要使用OD当中提供的跟踪调试命令,这样会使调试变的方便。
执行Animate Over(Ctrl+F8)指令,进入到一个循环。执行pasue(F12)暂停。手动F8调试一此,循环地址范围为(010153DD 到010153E4)。同时在循环的最后一个地址下面下断点,即010153E6处下断点。
下完断点之后,F9跳出循环。同时继续执行Animate Over(Ctrl+F8)指令,再次碰到循环。这一个循环范围较大在0101534E至010153FD,期间还有一个小循环(01015348---01015359 )。在01015402处下断点,F9跳出循环。
未跳出循环,01015402抵达之前
跳出循环,抵达01015402之后。在数据窗口可以看见有代码被写入第一个节区(upx0)。注意如果Dump窗口没有显示,可以用ctrl+G跳转到该位置查看。
再次遇见循环,在01015436下断点跳出循环。
深色部分为设置IAT的循环。在01015436地址处设置EDI=0101400(1001000+13000=0101400),它指向第二个节区(upx1)区域。该区域保存着原notepad.exe调用的API函数名称的字符串。UPX在压缩原notepad.exe文件时,会分析其IAT,提取出程序中调用的API名称列表,形成API名称字符串。
什么叫IAT?
IAT又称导入地址表,用来保存windows操作系统中的核心进程、内存、DLL结构等。
程序全部解压缩之后,会将程序返回至OEP处。执行010154BB后跳转到OEP处
断点,跳转该地址。
执行该指令之后,跳转到0100739D。看到代码与压缩之前的代码一致。
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!
赞赏
- BUUCTF-reverse1解题思路 8095
- [原创]浅学PE结构(一) 5341
- [原创]初探DLL注入 8875
- [求助]未来职业方向渗透还是逆向、二进制之类的? 5867
- 从crackme程序中接触VB文件以及加密算法 7853