一道题展开的UPX脱壳问题

目录

一,直接脱壳

二,修改区段名

三,利用ESP定律,找到oep,dump文件


之前在打hznuctf校赛时遇到了一个upx壳的题,学到了不少东西,特地总结一下

题目链接(http://ite.hznu.edu.cn/challenges#esay%20signin-84)

UPX是一个著名的压缩壳,主要功能是压缩PE文件(比如exe,dll等文件),有时候也可能被病毒用于免杀.壳upx是一种保护程序,遇到upx加壳问题如何解决

一,直接脱壳

直接用upx -d 文件名.exe脱壳,一般的没被改过的壳时可以脱掉的,例如这样:

一道题展开的UPX脱壳问题_第1张图片

二,修改区段名

有的upx壳被改了区段名,无法使用此方法脱壳,关于修改upx壳区段名的问题具体可以参考一位大佬的文章(https://blog.csdn.net/whatday/article/details/99709317)这里引用一小段

用任何一个十六进制编辑器(UltraEdit,还有VS自带的十六进制编辑器等等都可以,但是不如WinHex)打开加壳后的程序。可以看到三个区段名。“UPX0”和“UPX1”是加UPX壳后的两个区段名。其中UPX1区段包含了需要解压的数据块。“.rsrc”是程序资源信息区段名,这个区段含有原资源段的完整头部以及图标、Manifest、版本等未被压缩的资源,当然还有UPX自身需要的导入信息等(如果程序自身不含资源段,加壳后就是“UPX2”)。“UPX0”和“UPX1”可以被随意改成任何字符串,虽然这样改用处不大,但是也能起到伪装的作用。我们可以把它全部抹去(写0),或者把它改成无效数据,这样就无法使用命令“upx -d”快速脱壳了

一道题展开的UPX脱壳问题_第2张图片

 

 修改过区段名的壳无法用upx -d 指令脱壳,像这样子

一道题展开的UPX脱壳问题_第3张图片

但是可以通过修改区段名,改回upx的特征码。将文件放入到010Editor中,来找被修改的区段名,其实它一般可以在查壳的时候被工具识别出来

所以直接在010Editor中找ZVM 再改回UPX就可以了

 现在就可以脱壳了

三,利用ESP定律,找到oep,dump文件

这里引用大佬的文章介绍

ESP定律的原理在于利用程序中堆栈平衡来快速找到OEP,由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用pushad, 在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的OEP位置.

程序运行先从壳代码运行,壳代码执行完之后会跳转到真正的OEP,也就是是说第一步,首先要找到真正的OEP,大部分情况下,壳代码会在一个单独的区段里面,壳代码执行完一定会跳转到原来的.text段去执行,跳转之后的地址就是这个程序原始的OEP,也就是程序真正的入口,dump文件就是把得到的新的源文件给它保存下来,可以采用从头到最后一个区段的手动复制下来,也可以用工具

因为程序的流程是pushad(所有寄存器压栈),解压,popad(出栈),jmp oep

所以不论是改没改区段名,都可以用这种方法来脱壳。这种可以手动脱壳,也可以用插件自动脱壳

脱壳步骤

1 找到OEP

2 dump(导出)内存文件

3 修复

程序流程:

    pushad 
​
•   //壳代码
​
•   popad
​
•   jmp xxxx

这里介绍使用插件dump脱壳:

先把程序用x32dbg打开,程序停在了这里:

一道题展开的UPX脱壳问题_第4张图片

 pushad直接出现,F8进入下一步,这时esp的值改变,在寄存器窗口esp处右键点击在内存窗口中转到-内存一

一道题展开的UPX脱壳问题_第5张图片

 此时在内存窗口选中前面几个字节-右键-断点-硬件,访问-4字节,再F9运行,即可跳转到popad处停下

一道题展开的UPX脱壳问题_第6张图片

  可以看到下面有jmp指令,程序跳转到另一个地址处,在C0817C处下断点,F9运行程序,再F7单步进入,即可找到oep,程序真正的入口

一道题展开的UPX脱壳问题_第7张图片

 一道题展开的UPX脱壳问题_第8张图片找到oep后要开始dump文件

打开插件,依次点击

 保存好dump文件后,需要进行修复,如下步骤,其中uppppx.exe是保存的dump文件

最后修复好的文件就是

 

 

你可能感兴趣的:(网络安全)