(upx学习ing,不定期更新一些自己遇到的一些关于此的比较好的题目或者感悟)
对于手动脱壳,我们有两种常用的安全工具,一个是od,另一个是ida。两个方法略有不同。对于脱一般的程序壳的时候,我主要用的是ida来脱壳,一般ida实在脱不了了再想到用od来脱,od,,所以我记录的大多都是用的ida来脱的。
大致步骤
1、寻找oep
因为我们的壳经过运行之后,会慢慢的自动解开壳,我们就要去寻找解开后的那个时候的程序入口。而oep就是程序的入口。
2、寻找到加密函数
找到oep之后,运行下来,我们的程序就出来了。我们就可以去寻找了。string里面去寻找字符串,然后再跳到函数里面,去就可以直接分析了。
3、dump与修复
有些时候,可能我们要将程序剥离出来,这个时候就在oep口的地方将全部程序dump出来即可,dump出来之后还要进行修复文件,因为它的程序地址那些会发生改变,因此我们需要修复IAT。
对于脱壳运用最多的方法,一个是单步调试法,另一个就是ESP定律来脱壳
单步调试法
正如其名,单步调试法就是进行动态调试文件,分析汇编指令,找到关键点,寻找oep
esp定律(堆栈平衡)
由于我们壳会在内存中还原程序,然后再运行,则必然会跳到oep(程序入口),执行我们的程序。所以大致过程就是运行壳程序解壳,然后退出解壳程序,加载原本程序。有着壳程序的运行与退出,根据堆栈平衡原理,壳的加载与退出后,必然会操作堆栈指针为进入之前的堆栈指针。因此根据这个原理,我们可以在堆栈处,设置访问断点,让程序运行,当程序暂停的时候,就是壳程序即将执行完的时候,然后在其附近单步跟踪就可以找到原始OEP了。
UPX
题目一:
链接:https://pan.baidu.com/s/1teQgV5kgKpuNJ60o0byYVg?pwd=j8mj
提取码:j8mj
单步调试法
这个jmp非常可疑(一般那种jmp有大跳转就要注意),我们在这里按下f2 下断点,运行之后,按f7跟入。
到这里大致就可以猜出我们找对了。
按f8,运行到 jmp,f7跟入
到这里就差不多知道找到oep了,由于这样ida没有将它分析出来,我们按p,将其分析出来
进行反汇编之后发现看不懂,也没有找到我们的函数。这里有两个方法,一个就是单步,直到程序等待输入,另一个方法就是直接去string中搜索,字符串。我运用的是第二种。
按键盘上的X快捷键。
查询交叉引用就可以找到我们的加密函数,按f5反汇编即可。
然后进行分析即可。
题目二
链接:https://pan.baidu.com/s/1_e_A7gJow71q4s8KYs0JfQ?pwd=fycv
提取码:fycv
直接在程序的第一条指令上下一个断点。然后运行,寻找可疑点。
指令的最后有个retn,这里我们按f4运行到此处,再按f7跟入
进入之后,一直翻到后面,发现最后的jmp,我们继续像先前一样,f4,f7跟入。
继续重复上面步骤。
继续
继续
-
跟到了这里我们就大致可以知道了,我们马上成功了,我们找到了oep。继续
到这里之后按p分析,就成了现在的样子,到这里就找到了我们的oep了。
反汇编(F5)后进入如下函数
在这里按c,再按p,再反汇编就可以得到我们的加密函数了
成功
通过这两到题,我们大致可以发现,upx脱壳,就是去寻找可疑点,jmp,或者ret,因为壳是一个程序,因此我们脱壳就是要其运行完成的结果,所以我们在脱壳过程中总是要跳到ret,也就是这个原因。最后到oep的时候也很有特点,多脱几次就有感觉了。
最近做了一道NKCTF关于UPX的题
头一次遇到,upx的另一种考点,将upx的头部抹去,使得我们的脱壳软件不能脱去。
关于upx文件头的抹除。
版权归原作者 二木先生啊 所有, 如有侵权,请联系我们删除。