#逆向-UPX手动破壳初探

🚈 5ea1(寒假限定


本节将使用一道UPX简单题来辅助学习——BUUCTF-新年快乐

拿到题目附件,老规矩先到die里查壳,有一个UPX壳;再进ida看看,发现只有三个函数。
在010里观察,发现是普通的UPX壳的特征,实际上可以直接用upx.exe -d 来去壳,但是由于本次探讨的是手动脱壳,所以仅把自动脱壳作为参照的结果


UPX壳原理

UPX是一种压缩壳,它的运行模式是通过一定的算法,进行一个自我解压,这种模式类似于SMC代码自解密。
往往这段信息头位于软件的头部 ,用于提示系统进行这样一个解压操作
譬如原本的运行流程是1->2->3->4->5,那么在UPX加壳后,1~5的代码块会被压缩成一个新的块,这里把它记为6,由于需要一些信息来提示系统,这些信息也会被单独放在一个块中,记作7块;那么,UPX加壳后的结果就是7->6,计算机先读取到7块,知道这是一个压缩壳,就会按照7块中的算法进行自动解压,把6中的5个正常块解压出来以后再执行块中的内容
1


破壳操作

因为在解压操作以后程序会按照正常顺序运行,所以只要找到解压块末尾,即正常块开头,就可以完成破壳,这个点一般被称作OEP(程序入口点)
要找OEP,这里只介绍一种方法,由于要进行解压操作,所以代码中会进行一次大跳转,我们只需要找到这个大跳转,一般就能找到这个入口点了。然后在解压时,程序会先将寄存器全部保存起来,即保存开头时的状态,在解压完成后再还原这个状态,所以我们只需要找到这个保存点的位置,打下断点,当这个点的数据被访问的时候,就是到达OEP的时候
在UPX中,一般会有一系列的push操作,来进行一个保存,然后最后用一系列的pop来取出数据,所以只需要在这个push操作时的栈顶下一个断点,就能直接步到OEP附近


实操

用x32dbg打开题目文件,第一次会断在系统层上,连续两次F9进入用户层
2
3
可以看到pushad标志,这代表了程序在进行入栈,保存当前环境,按照上面的分析,应当在此处的栈顶打下硬件断点,而栈顶指针为ESP
故在右端ESP寄存器上右键,选择在内存窗口转到,如何在该处下断点
4
5
下硬件访问断点,F9一步到位
6
可以看到0x401280的大跳,找到OEP
用dbg自带的妙妙小插件dump一下代码
7
杂七杂八全部点一遍,成功破壳