脱壳(初学)-- 手脱EZIP(ESP定律)
本帖最后由 無涯 于 2015-3-30 01:06 编辑几年前在长沙开福寺求了支签,虽然去年搬毕业搬宿舍的时候不慎丢失,可是内容我还记得:留得家财千万贯,不如育子一身才;书山学海无止境,庸人得福终会穷话不多说了,开始今天的书山学海吧~~~
-------------------------------------------------------------------------------------------------------------------------
@Hmily 麻烦前辈看下我对ESP定律的浅显认识有什么不对的地方,我好及时更正,不要误导了跟我一样刚入门的新手,谢谢!!!
希望前辈多多指导
顺便提两个额外的问题
问题1:
如图0-1和图0-2
图0-1
为什么我跟到程序OEP后,向上滚动代码窗口,push ebp变成了add byte ptr。。。地址也从10cc变成了10c7
图0-2
问题2:论坛的搜索引擎,搜索完点击链接后,老是出现卡死现象,我用的是猎豹浏览器,好像是脚本出了什么问题,麻烦跟进一下!!!
看了好几课基础视频啦,感觉自己汇编基础还有对OD的使用不是很了解,这个星期刚好公司没什么事,一直在补基础
顺便推介一下现在正在看得教程
小甲鱼《PE结构详解》(PE结构是要了解的,以后会用到的),
《使用OllyDbg从零开始Cracking_CHM版》这个教程写的很详细,目前只看到10章,觉得还是很有用很有必要看一下的
(上个星期下的,网上应该很容易找到,不记得在哪里下载的,如果有需要我再放上来吧)
在脱壳之前先补一下用ESP定律脱壳需要的基础知识吧,跟ESP定律有关系的
基础1:要了解ESP定律,还是先来了解一下ESP吧
ESP是一个寄存器,一个比较特殊的寄存器,永远指向堆栈最顶端的地址,如下图
http://www.52pojie.cn/forum.php?mod=image&aid=406552&size=300x300&key=d69de60ba6a6fe45&nocache=yes&type=fixnone
基础2:硬件断点 硬件断点分为:硬件执行断点(ON EXECUTION),硬件写入断点(ON WRITE),硬件访问断点(ON ACCESS)3种。1、硬件执行断点与普通的CC断点作用一样,但硬件执行断点并不会将指令首字节修改为CC,所以更难检测。2、硬件访问/写入断点是断在触发硬件断点的下一条指令处。(尴尬,这个我理解也不深,可是接下来要用到,硬着头皮说一下,详细内容可以参考《使用OllyDbg从零开始Cracking.CHM》--第十一章硬件断点和条件断点和第三章寄存器)
接下来,我用ESP定律手脱EZIP壳,顺便讲讲我对ESP定律的理解
步骤一:载入程序
载入程序后我们看到一个跳转,F8单步走一下,如下(图1-2),我们看到004102DC 55 push ebp
图1-2
图1-3
单步F8,注意图1-2 和图1-3箭头所指的地方,我们看到堆栈中已经将EBP压入堆栈中了,这里右键ESP,选择数据窗口中跟随,如图1-3-1
如1-3-1
在数据窗口选中跟随过来的地址下硬件访问断点,右键---断点---硬件访问---word/dword,如图1-3-2
图1-3-2
为什么要选择数据窗口中跟随呢,主要是为了下硬件访问断点,在代码区域只能下硬件执行断点,在堆栈区不能下断点;
为什么要下硬件访问断点呢,我试着讲一下,这是根据我看了几课初级脱壳教程和实践后的理解,不道之处还望多多指导
先讲一下加壳,加壳简单来说就是在程序前面再加一段代码,让我们不知道原程序从哪里开始的,可是终究还是要回到原程序的
所以,在执行加壳程序之前,一般需要保存好程序执行环境,比方说我今天要脱得EZIP的壳,push ebp就是先将源程序的寄存器
环境保存起来,等执行完加壳程序在恢复,所以,我们要找到源程序入口点,就要看什么时候程序将这个ebp重新拿出来,有一课
教程说到寻找popad也是这个道理,加壳之前pushad,将寄存器环境都压入堆栈中,所以我们要寻找与之对应的popad,入口点
往往就在恢复寄存器环境之后不远的地方。。。
我们这里下好硬件断点之后,点击运行(F9),程序会停在pop ebp的下一行,如图1-4
图1-4
这里我可以看到EBP又变回原来的地址了,很好!
此时程序停留在00410688 jmp eax,看右边EAX的值:004010cc,这是一个很大的跳转,很可能就跳到OEP了,单步F8
如图1-5
file:///C:/Users/Administrator/AppData/Local/YNote/data/qqD926D51B8FA6ADA24654A4011682AC3E/61e10ec5c6d14d6ba00e2e520b17f55d/clipboard.png
图1-5
我们看到图1-5 这段代码跟C++程序的入口特征一样,很可能就是OEP,脱壳。。。。的确是程序入口(10cc)!!!
其实这个壳得重点是在修复,具体课程中有讲,我就不多废话啦 ,我主要是想讲一下对ESP的浅显认识,希望前辈们多多指导
ps:以上只是目前为止我对ESP定律的浅显认识,当真不得的
明天还要上班,我为了写博客写到这么晚,有没有人给点鼓励~~~~
写的好不好是另一回事,重要的是我态度好呀~~
如果觉得有帮助麻烦捧个钱场,小手一抖CB到手,
如果觉得写的很烂,麻烦不要吝啬那一点点口水,出来喷喷,指点一下新人!!
万分感谢!!!! 新手路过,纯属捧场 我来捧个场 {:301_971:}菜鸟默默路过 菜鸟默默路过,求大神指点迷津 谢谢楼主的分享。 TOP虚拟网络 发表于 2015-3-30 01:17
新手路过,纯属捧场
多谢捧场 哈哈~~~我也是新手~~~:loveliness: WsQzR 发表于 2015-3-30 01:18
我来捧个场
谢谢!!!多谢各位好汉捧场~~{:1_906:} wanmei 发表于 2015-3-30 01:21
菜鸟默默路过
我也是菜鸟··一起学习呗~~~