目录
(例题附件放在了文章最后)
upx脱壳
脱壳就是将外面的保护程序脱掉,看到里面的程序。对于有壳的程序,每次程序的入口点总是从壳开始,这个入口点是EP,那么源程序的入口点是OEP,壳将真正的OEP隐藏了,我们脱壳就是修改程序的入口点。
示例一
upx脱壳工具
1.将exe文件拖到exeinfope里面查壳
2.有upx壳,用upx解壳,在upx所在目录输入cmd打开终端,在终端输入
upx -d [完整文件路径]
解壳成功,出现如下界面
如果没有成功,那可能是改了区段名
用010editor打开,查找区段
然后修改变化的地方(有时候是大写的UPX,要根据Exeinfo来),保存文件,上述相同步骤解壳
将解壳后的文件拖进ida,分析主函数
写出解密代码
#include<iostream>
using namespace std;
int main(){
string s="ek`fz`abcdefg|";
for(int i=0;i<14;i++)
s[i]++;
cout<<s;
}
//flag{abcdefgh}
动态调试脱壳
手动脱壳,顾名思义就是不使用工具脱壳,而是直接脱壳,一般是利用ESP定律,使用ollydbg、xdbg等动调工具和他们附带的插件进行脱壳。
ESP:是汇编语言里面的栈指针寄存器,它指向栈的顶端,出栈和入栈都需要用到它。加壳的原理:在加壳程序中,壳程序会将原始程序的代码压缩、加密或进行其他处理,然后嵌入到一个外部包装壳中。壳程序在启动时会先解压、解密或还原原始程序,再将控制权交给原始程序的入口点(OEP)。
ESP定律:壳程序在启动时,一般会压入一些解压需要 的参数,压入参数时,ESP会发生改变。为了保证堆栈平衡,在解压完成时,ESP会恢复到压入参数之前的位置,然后跳转到程序入口点开始执行代码。可以此为标志,判断是否到达程序入口点。
ollydbg、xdbg下载: dbg
注意:ollydbg只能调试32位程序,如果要调试64位程序只能用x64dbg
示例二
查壳,32bit
拖进x32dbg,打开的黑框不要关掉,否则会退出调试
这是xdbg的一些快捷键
F7 | 单步步入,会进入函数 |
F8 | 单步步过,不进入函数 |
F4 | 运行到光标处 |
; | 添加注释 |
F2 | 设置或取消断点 |
F9 | 运行直到遇到断点 |
ctrl+F2 | 重新开始调试 |
F9先走到如下界面,一般的加壳程序一开始就是一个push指针
一开始栈顶寄存器ESP值为61FF78,程序自动脱壳后会回到这个位置,按F8单步调试将(所有寄存器的值包括)这个地址压入栈中,使得ESP值为61FF58,于是我们将其从内存窗口中转到内存1
转到内存1窗口后右键,设置断点(这个无论1,2,4字节都可以)
我们按F9运行到断点,即当程序回到这个位置时,就解压完成了,不过这个位置还不是程序的入口点,F8继续往下,遇到一个死循环
不过没关系,在循环下面设个断点,按F4进入
这里有一个很大的跳转,一般遇到大跳转就是到了程序的入口点
F8到了程序入口点,这里有个dump插件,点击dump保存文件
但是这个文件还不能用,要进行修复,即IAT
点击Get I得到修复地址
点击Fix D进行将刚刚得到的文件进行修复
生成一个新的文件,这个文件一般就是脱壳成功的
双击没什么问题
拖进ida分析
和上面一样解密就可以了
例题附件
逆向脱壳,你学会了吗