脱壳

二木 王者

对于脱壳一些题型的记录

对于手动脱壳,我们有两种常用的安全工具,一个是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

单步调试法

image-20221221172644959

这个jmp非常可疑(一般那种jmp有大跳转就要注意),我们在这里按下f2 下断点,运行之后,按f7跟入。

image-20221221174102488

到这里大致就可以猜出我们找对了。

按f8,运行到 jmp,f7跟入

image-20221221175001632

到这里就差不多知道找到oep了,由于这样ida没有将它分析出来,我们按p,将其分析出来

image-20221221175423558

进行反汇编之后发现看不懂,也没有找到我们的函数。这里有两个方法,一个就是单步,直到程序等待输入,另一个方法就是直接去string中搜索,字符串。我运用的是第二种。

image-20221221203609175

按键盘上的X快捷键。image-20221221203438864-1671634100072-1

image-20221221203345394

查询交叉引用就可以找到我们的加密函数,按f5反汇编即可。然后进行分析即可。

题目二

链接:https://pan.baidu.com/s/1_e_A7gJow71q4s8KYs0JfQ?pwd=fycv

提取码:fycv

image-20221227095122670

直接在程序的第一条指令上下一个断点。然后运行,寻找可疑点。

image-20221227095328753

指令的最后有个retn,这里我们按f4运行到此处,再按f7跟入。

image-20221227095542230

进入之后发现最后的jmp,我们继续像先前一样,f4,f7跟入。

image-20221227095720390

继续重复上面步骤。

image-20221227095757480

继续

image-20221227095822799

继续

image-20221227095854783

image-20221227095925714

image-20221227095948589

跟到了这里我们就大致可以知道了,我们马上成功了,我们找到了oep。继续

image-20221227103349134

到这里之后按p分析,就成了现在的样子,到这里就找到了我们的oep了。

image-20221227103532762

image-20221227103552479

在这里按c,再按p,再反汇编就可以得到我们的加密函数了

image-20221227103659899


通过这两到题,我们大致可以发现,upx脱壳,就是去寻找可疑点,jmp,或者ret,因为壳是一个程序,因此我们脱壳就是要其运行完成的结果,所以我们在脱壳过程中总是要跳到ret,也就是这个原因。最后到oep的时候也很有特点,多脱几次就有感觉了。

 评论