0


对于UPX脱壳的解决


(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文件头的抹除。


本文转载自: https://blog.csdn.net/qq_54894802/article/details/128516718
版权归原作者 二木先生啊 所有, 如有侵权,请联系我们删除。

“对于UPX脱壳的解决”的评论:

还没有评论