首页
社区
课程
招聘
[原创]Lenus所写的寻找真正的入口(OEP)--广义ESP定律 这个帖子中出现的问题
发表于: 2006-8-2 14:22 4689

[原创]Lenus所写的寻找真正的入口(OEP)--广义ESP定律 这个帖子中出现的问题

2006-8-2 14:22
4689
今天阅读了Lenus所写的
寻找真正的入口(OEP)--广义ESP定律,在里面发现了一个错误。所以拿出来和大家一起讨论一下。
寻找真正的入口(OEP)--广义ESP定律的网址是:http://www.pediy.com/bbshtml/BBS6/pediy6083.htm
首先,我要声明lenus写的ESP定律很好。我发现的问题,是lenus写的这个帖子里的第一个例子。原文是这样的“
4.广义ESP定律

  很多人看完了教程就会问:ESP定律是不是就是0012FFA4,ESP定律的适用范围是不是只能是压缩壳!
  
  我的回答是:NO!

  看完了上面你就知道你如果用0012FFA8也是可以的,ESP定律不仅用于压缩壳他也可以用于加密壳!!!

  首先,告诉你一条经验也是事实---当PE文件运行开始的时候,也就是进入壳的第一行代码的时候。寄存器的值总是上面的那些值,不信你自己去试试!而当到达OEP后,绝大多的程序都第一句都是压栈!(除了BC编写的程序,BC一般是在下面几句压栈)

  现在,根据上面的ESP原理,我们知道多数壳在运行到OEP的时候ESP=0012FFC4。这就是说程序的第一句是对0012FFC0进行写入操作!
  
  最后我们得到了广义的ESP定律,对只要在0012FFC0下,硬件写入断点,我们就能停在OEP的第二句处!!

下面我们来举个例子,就脱壳进阶第一篇吧!

  载入OD后,来到这里:

0040D042 N>  B8 00D04000      mov eax,Notepad.0040D000 //停在这里
0040D047     68 4C584000      push Notepad.0040584C
0040D04C     64:FF35 00000000 push dword ptr fs:[0]    //第一次硬件中断,F9
0040D053     64:8925 00000000 mov dword ptr fs:[0],esp
0040D05A     66:9C            pushfw
0040D05C     60               pushad
0040D05D     50               push eax

直接对0012FFC0下硬件写入断点,F9运行。(注意硬件中断)

在0040D04C第一次硬件中断,F9继续!

0040D135     A4               movs byte ptr es:[edi],byte ptr ds:[esi] //访问异常,不管他 shift+F9继续
0040D136     33C9             xor ecx,ecx
0040D138     83FB 00          cmp ebx,0
0040D13B   ^ 7E A4            jle short Notepad.0040D0E1

第二次硬件中断。

004058B5       64             db 64                                 //断在这里
004058B6       89             db 89
004058B7       1D             db 1D
004058B8       00             db 00
004058B9       00             db 00

这里也不是,F9继续!

004010CC   /.  55             push ebp
004010CD   |.  8BEC           mov ebp,esp  //断在这里,哈哈,到了!(如果发现有花指令,用ctrl+A分析一下就能显示出来)
004010CF   |.  83EC 44        sub esp,44
004010D2   |.  56             push esi

   快吧!还不过瘾,在来一个例子。


到些我所引用的原文结束。我所发现错误,就在引用的这段文字中。我把例子中用到的脱壳进阶第一篇中所用的程序下载下来。之后,我进行了调试,原文中“直接对0012FFC0下硬件写入断点,F9运行。(注意硬件中断)”,我自己调试的时候给12ffc0 下硬件断点,我发现是不行的。我再观察各个寄存器的值
EAX 00000000
ECX 0013FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFD9000
ESP 0013FFC4
EBP 0013FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 0040D042 Notepad.<ModuleEntryPoint>
我认为, 这个断点不应该下在12ffc0上,应该下在13ffc0上。我在13ffc0下了断点,也做了最终的脱壳。程序的壳可以正常脱掉了。那个程序也打算传上去。大家可以查证一下。
我指出这个错误的目地,是为让大家能在这个地方少走一些路,没有别的意思。

到这里可以下载到例子中用到的程序:openworld.ys168.com  如果大家有时间的话可以查证一下,给这个程序脱一下壳试试。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 70
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
经过测试,Lenus的大侠方法无错~
不同的机子可能值不一样,
也不一定指的是某个值,ESP的下面是EBP,
就从EBP下硬件写入不就得了?
2006-8-2 16:05
0
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
3
呵呵,首先,你要明白作者写这篇文章的含义,一般来说,ESP定律就是指的堆栈平衡原理,而由于初始环境的不同,ESP大部分是指12ff00,有一部分是13ff00或者其它的,所以,你这个时候要看的是ESP所指向的地址,并不是生搬硬套.

当然,帖子在说明的严谨上是有点问题,以指定死地址来写文对于对于新手来说,依葫芦画瓢当然容易出问题,但最主要的是掌握它的原理----堆栈平衡原理.那么至于ESP是多少你还感觉困难么??
2006-8-3 00:24
0
雪    币: 241
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
希望 可以有更多的大侠能验证一下。关于第一例子中下硬件断点地址的问题。
2006-8-3 10:03
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错啊
支持
2006-8-3 13:43
0
游客
登录 | 注册 方可回帖
返回
//