• 恶意代码分析实战 加壳与脱壳 lab 181 182 183 184 185 手动脱壳和自动脱壳操作


    脱壳存根

    被加壳程序中的脱壳存根由操作系统加载,然后脱壳存根负载加载原始程序。对于加壳程序来说,可执行程序的入口点指向脱壳存根,而不是原始代码。原始程序通常存储在加壳程序的一个或多个附加节中。

    脱壳存根执行了以下三步操作:

    1. 将原始程序脱壳到内存中;

    2. 解析原始可执行文件的所有导入函数;

    3. 将可执行程序转移到原始的程序入口点(OEP)。

    尾部跳转

    一旦脱壳存根完成脱壳,他就必须转到OEP运行。转到OEP的指令通常被叫做尾部跳转指令(jmp、ret、call)。

    书中对于脱壳过程图示如下:

     

    ESP定律脱壳 本文手动脱壳大量用到此方法

       ESP定律是比较常用的脱壳方式,作为新手用的也比较多简单写一下我的看法。

      esp定律的使用过程大致为:

        1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色),并且只有sp和ip为红色。

        

        2.Command窗口中输入dd 0012FFA4 后回车,跟随esp寄存器后的地址。

        3.选中下断的地址,断点--->硬件访--->WORD断点

        4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP(程序入口)

      花了很长时间理解了一下原理,简单谈一下,可能有错。

    我们把壳理解为一个对程序进行压缩和解压的子程序,相当于调用call指令:call xxxx,call指令遵循堆栈平衡,所以esp作为堆栈指针,程序前后入栈和出栈必须相同。

    可刚开始的程序:

    0040D000  60 pushad //注意这里ESP=0012FFC4(入栈)

    0040D001 E8 00000000 call ASPACK.0040D006 //ESP=0012FFA4
    PUSHAD就是把所有寄存器压栈!我们在到壳的最后看看:
    代码:
    0040D558 61 popad //ESP=0012FFA4(出栈)
    0040D559 75 08 jnz short ASPACK.0040D563 //注意这里ESP=0012FFC4

    我们在0012ffa4处设置下物理断点,壳在出栈时调用ESP=0012FFC4是截断。按下f8到达程序入口。

    适用范围:

    几乎全部的压缩壳,部分加密壳。只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用

    Lab18-01.exe

    首先利用peid进行查壳

    可以看出这是一个被UPX加壳的文件。UPX是一个压缩壳,并不是一个加密壳。

    在OD中打开Lab18-01.exe分析: 

    可以看出这并不是OEP,而是脱壳存根。为了进行脱壳,我们需要找到尾部跳转从而得到OEP。00409DC0处的指令为pushad,在脱壳存根中为了保持栈平衡,也一定会一个popad的命令。

    PUSHAD 指令

    本指令将EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 这8个32位通用寄存器依次压入堆栈,其中SP的值是在此条件指令未执行之前的值.压入堆栈之后,ESP-32–>ESP.

    POPAD 指令

    本指令依次弹出堆栈中的32位字到 EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中,弹出堆栈之后,ESP+32–>ESP.

     

    在OD中查找popad命令,在00409F43处看到jmp指令。

    在IDA中定位到00409F43分析:

    结果UPX压缩后,IDA不能识别处 00409F43处的有效地址,所以猜测该处的jmp就是尾部跳转指令。

    另外在od中看到:

    该地址后面一堆这样0000没有意义的代码!并且40154F和409F43的地址差异太大,也是疑点!

    OD中在00409F43处下断点并step 下一条指令,看到下面这种奇怪的东西:

     

    然后可以看到二进制数据了:

    然后dump:

     右键OEP后使用OllyDump插件脱壳:

    “重建输入表”取消勾选后点击脱壳。

    保持OD不退出, 然后使用ImportREC获取导入表

     

    点击fixdump,修复转存文件

    至此已完成脱壳,脱壳后的文件就是unpack_那个!

     将该文件放到IDA里分析,看起来就很正常了!

     

      lab 18-2

    lab18-02

    FSG加壳,定位到ope即可

    恶意代码分析实战 Lab18

    这里快点选择下面插件可以快速到达程序oep

    恶意代码分析实战 Lab18

    定位到这里,选择分析,就可以

    恶意代码分析实战 Lab18

    这里是是选择ollydbg插件直接脱壳,成功.

    最后使用import rec修复下导入表即可,和上面1的思路一样。

     lab 18-3
     

    本次实验我们将会分析lab18-03文件。
    将lab18-3载入peview
    在这里插入图片描述

    可以看到这个壳是PECompact
    载入od
    在这里插入图片描述

    默认405130为入口点
    使用od的插件来查找oep
    在这里插入图片描述

    结果如下
    在这里插入图片描述

    插件猜测的oep起始位置在40a110 但是这里的这些指令不像是oep。==》为啥???
    而且这里它访问的值在0040a115处的栈底指针上方,如果这个地址不是文件的入口点,那么栈底指针之上的任何数据都不会被初始化。

    使用另外一个插件选项
    在这里插入图片描述

    结果如下
    在这里插入图片描述

    暂停在了ntdll中的一条指令上,这明显也不是oep ==》这个是因为上下文的汇编指令都是有联系的!
    使用插件不行的话,我们查看尾部跳转是否容易定位
    在这里插入图片描述

    在上图阴影指令是一条retn指令,后面是一段0字节。==》又是靠肉眼人工脱壳了!
    我们在这里下断点,执行过来
    在这里插入图片描述

    可以看到,没有命中我们下的位置,而是显示了一个异常
    说明这种方法也不起作用了 ==》为啥呢?
    我们查看程序默认的入口点
    在这里插入图片描述

    jmp指令会直接跳到00405138,而00405138,00405139的pushfd,pushad会影响内存。这些指令保存了所有的寄存器和标志信息,加壳程序很可能在跳转到OEP之前恢复所有的寄存器和标志,所以我们可以通过在栈上设置一个断点来尝试找到oep
    在尾部跳转之前会有一个popad或popfd,将帮助我们找到oep
    单步执行到call指令时
    在这里插入图片描述

    在上图右侧可以看到此时esp为0012ffa0
    右键,如下操作
    在这里插入图片描述

    将地址载入到内存转储中

    选中栈顶的前四个字节,如下操作
    在这里插入图片描述

    然后执行
    在这里插入图片描述

    可以看到断在了0040754f
    看到了retn 4会将程序转移到另一个位置运行,这可能是尾部跳转,我们单步执行到这里,接着就来到了401577处
    在这里插入图片描述

    如下操作
    在这里插入图片描述

    强制od反汇编这些代码,结果如下
    在这里插入图片描述

    在右侧可以看到eip现在指向了00401577的位置
    如下操作转储程序
    在这里插入图片描述

    点击get eip as oep
    在这里插入图片描述

    然后单击dump即可保存
    再次使用peid查看新文件
    在这里插入图片描述

    可以看到脱壳成功了

    这种脱壳还是比较繁琐的!!!反正下次看到

     这种壳的时候就留意下。

     
    lab 18-4

     和3一样,几乎没有区别!都是利用popad进行手动脱壳!
    将lab18-4载入peid 
    在这里插入图片描述

    可以看到是使用ASPack加壳的
    载入od
    在这里插入图片描述

    第一条就是pushad
    我们单步步过pushad
    如下所示
    在这里插入图片描述

    选中esp的值follow in dump
    在这里插入图片描述

    然后下硬件断点
    在这里插入图片描述

    执行后如下所示
    在这里插入图片描述

    jnz指令的前一条是popad,我们知道跟在popad指令后面的应该是尾部跳转,尾部跳转可以将程序切换到oep运行。
    我们单步步过jnz
    在这里插入图片描述

    在push指令后面看到了retn,它将跳转到压入栈的地址处运行,这可能就是尾部跳转
    单步步过retn,来到了
    在这里插入图片描述

    右键,如下操作
    在这里插入图片描述

    结果如下
    在这里插入图片描述

    这样就找到了oep
    将其转储
    在这里插入图片描述

    将转储后的文件载入peid
    在这里插入图片描述

    可以看到脱壳成功了。

    lab 18-5

    和34本质没有区别,都是利用esp popad追踪栈的数据来进行脱壳!

    将lab18-5载入peid
    在这里插入图片描述

    可以看到是WinUpack加壳得到的
    载入od

    在这里插入图片描述在这里插入图片描述

    但是会直接报错
    od能够加载文件,但是不能发现脱壳存根的入口点,而会在系统断点上中断
    在这里插入图片描述

    我们单步
    在这里插入图片描述

    直到esp的值为红色
    接着,右键-》数据窗口中跟随
    在这里插入图片描述

    然后下断点
    在这里插入图片描述

    执行后停在下图所示位置
    在这里插入图片描述

    这里就是oep的位置

    还是同样的转储操作
    在这里插入图片描述

    载入peid看到此时脱壳成功了
    在这里插入图片描述

    但是查看导入信息时,如下所示
    在这里插入图片描述

    无法正确识别
    我们需要对导入表进行修复
    使用import rec进行修复工作
    在这里插入图片描述

    上图的两个箭头所指的地方是需要修改的,一个是lab18-5的进程,一个是oep地址
    单击自动搜索
    在这里插入图片描述

    点击获取输出表
    在这里插入图片描述

    然后点击修复转存文件
    在这里插入图片描述

    点击打开即可
    在这里插入图片描述

    显示saved_success说明修复完毕
    将修复后的文件载入peid
    在这里插入图片描述

    可以看到导入信息等都可以查看了
    说明脱壳成功

     
  • 相关阅读:
    JS Ajax跨域访问
    CentOS 6.8 Java 环境搭建
    vue+vant ui+高德地图的选址组件
    vue和element全局loading
    axios简单的二次封装
    vuex的简单教程
    vue 使用 element ui动态添加表单
    Promise对象和async函数
    css不定高图文垂直居中的三种方法
    js点击复制文本
  • 原文地址:https://www.cnblogs.com/bonelee/p/16758192.html
Copyright © 2020-2023  润新知