初探esp定律脱壳

admin 2022年4月22日15:19:10评论133 views字数 1923阅读6分24秒阅读模式

0x01 前置知识

  什么是壳

  为了防止程序被非法修改或反编译,开发人员通常会在程序中加入一段如同保护层的代码,使得原程序代码失去本来的面目,这段如同保护层的代码和自然界的壳在功能上很接近,因此把这样的程序称为“壳”。软件的壳分为加密壳、压缩壳、伪装壳、多层壳等类型,目的都是为了隐藏程序真正的OEP(程序的入口点),防止被破解。

  一般加壳程序在使用像ollydbg等动态调试器时,会停留在壳的预处决块。即处在对于程序原始代码块的解压或解密操作之前,在运行完程序自脱壳模块后,会停留在程序加壳之前的OEP位置,此时是dump程序的最佳时期。。脱壳时在真实OEP处下int3断点,就可以捕捉到程序代码段完全恢复的状态。因此,寻找加壳程序的正确OEP,也成了手动脱壳时的第一要务。

  简单壳的实现原理

  在原程序中添加一个区段,将壳的代码放在添加的区段中,在程序运行时,壳代码先拿到控制权,当壳代码运行完成后,控制权又会归还给原程序。对代码段的数据进行加密(如异或),由于之前添加区段操作改变了文件结构,所以需要修复原程序的导入表,如果程序开启了随机基址,程序就要进行重定位修复,这样就实现了程序的加壳处理

 

  栈(stack)是内存中分配的一段空间

  向一个栈插入新元素又称作入(push)放在栈顶元素的上面,从一个栈删除元素又称作出栈(pop),它把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素

0x02 实题演练

 攻防世界  crackme

  查壳,发现这里是nsPack的壳,可以用软件进行脱壳,我就借这个题来介绍一下ESP定律法

初探esp定律脱壳


 esp定律脱壳

简单来说,esp定律脱壳其实运用的是堆栈平衡的原理

堆栈平衡:

1.如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址

2.如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化

所以由于在程序自解密或者自解压过程中,不少壳会先将当前寄存器内容压栈,如使用pushad,在解压结束后,会将之前的寄存器中的值出栈,如使用popad。因此在寄存器出栈时,往往程序代码被自动恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步跟踪,就很容易到达正确的OEP位置。

OD载入exe文件

F8单步运行,发现寄存器窗口处只有ESP变红,在ESP上单击鼠标右键,选择“数据窗口中跟随”命令(这里xdbg是用“在内存窗口转到”表示),发现数据窗口第一行地址所指向的值为ESP存储的值

初探esp定律脱壳

在数据面板中选择ESP地址中的字节,单击右键选择“断点”-“硬件访问”-“Dword”命令(这里其实有点疑惑,断点设置为word和dword有什么区别)。下好断点后,F9直接运行,发现被断下的指令为popfd

初探esp定律脱壳

然后看到下面是一个大跳转,说明很快就能到达程序的入口点了,执行跳转后,发现汇编界面都是单个字节显示,分析代码

初探esp定律脱壳

接下来观察到0x00401336处是一个call指令,按F7跟进,发现0x00401621处为程序的入口地址

初探esp定律脱壳

到达程序入口点后,在插件中用OllyDump,脱壳在当前调试的进程

初探esp定律脱壳

这里还要注意的一个问题就是,要注意程序的入口地址等PE头信息是否修改正确,如果出现错误,则需要手动修复信息,这里直接脱壳就行

初探esp定律脱壳

脱壳后ida分析,后面就比较简单了

附上脚本

初探esp定律脱壳



  这题还可以单步跟踪法脱壳

原理:通过OD的单步(F8)、单步进入(F7)和运行到(F4)功能,完整走过程序的自脱壳过程,跳过一些循环恢复代码的片段,并用单步进入确保程序不会略过OEP。这样可以在软件自动脱壳模块运行完毕后,到达OEP,并dump程序。

OD载入程序,F8单步运行,发现这里有一个跳转指令,跳不出去

初探esp定律脱壳

当看到上图中0x004062AB地址处向上的跳转时,在跳转的下一行指令处下断点,直接运行程序到断点处,然后继续单步运行程序

初探esp定律脱壳

在上图中我们发现地址0x0040641D处是一个大跳转,继续执行,同样发现汇编界面都是单个字节显示,单击鼠标右键-“分析”-“从模块中删除分析”,后面就跟esp定律脱壳一样了,就不重复多说了

初探esp定律脱壳

再用一个例子介绍esp脱壳

DASCTF easyre

查壳

初探esp定律脱壳

OD载入,发现pushad指令,判断程序已加壳

F8单步步过,使程序走到call指令的位置

初探esp定律脱壳

下断点后,F8继续运行,断到了

初探esp定律脱壳

pop出栈,发现将会有一个大规模跳转,应该就是oep了

初探esp定律脱壳

判断0x00401180为程序入口,直接脱壳

初探esp定律脱壳

脱壳成功

初探esp定律脱壳


参考文章:https://baijiahao.baidu.com/s?id=1662196196423030806&wfr=spider&for=pc


 



原文始发于微信公众号(火炬木攻防实验室):初探esp定律脱壳

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月22日15:19:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   初探esp定律脱壳http://cn-sec.com/archives/934517.html

发表评论

匿名网友 填写信息