首页
社区
课程
招聘
[讨论]关于ESP定律
发表于: 2006-10-18 20:57 6910

[讨论]关于ESP定律

2006-10-18 20:57
6910
文章见:

http://www.pediy.com/bbshtml/BBS6/pediy6083.htm

这个地方我有点不明白:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1.call
  这个命令是访问子程序的一个汇编基本指令。也许你说,这个我早就知道了!别急请继续看完。
  call真正的意义是什么呢?我们可以这样来理解:1.向堆栈中压入下一行程序的地址;2.JMP到call的子程序地址处。例如:

00401029    .  E8 DA240A00    call 004A3508
0040102E    .  5A             pop edx
在执行了00401029以后,程序会将0040102E压入堆栈,然后JMP到004A3508地址处!
<<<<<<<<<<<<<<<<<<<<<<<<<<<<

这个地方,我一开始有点不明白,怎么是这个样子的?因为在我的理解里面,执行了call 004A3508以后,早不管下面这一行了。怎么可能是他说的“执行了00401029”的call后,又去执行0040102E呢?现在好象有点明白了,不过他的说法有点怪怪的。

应该是在执行00401029的call 004A3508之前,先把执行完这个call之后的下一步的地址先压入堆栈。不然执行完这个call,回来时不知道下一步是哪个地址了?

是不是这个理解?

=======================================
还有这个地方:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>
而当我们PUSHAD的时候,ESP将寄存器压入了0012FFC0--0012FFA4的堆栈中!如下:

0012FFA4   77F517E6  返回到 ntdll.77F517E6 来自 ntdll.77F78C4E           //EDI
0012FFA8   77F51778  返回到 ntdll.77F51778 来自 ntdll.77F517B5          //ESI
0012FFAC   0012FFF0                                                    //EBP
0012FFB0   0012FFC4                                                   //ESP
0012FFB4   7FFDF000                                                  //EBX
0012FFB8   7FFE0304                                                 //EDX
0012FFBC   0012FFB0                                                //ECX
0012FFC0   00000000                                               //EAX

所以这个时候,在教程上面就告诉我们对ESP的0012FFA4下硬件访问断点。也就是说当程序要访问这些堆栈,从而恢复原来寄存器的值,准备跳向苦苦寻觅的OEP的时候,OD帮助我们中断下来。

于是我们停在0040EE10这一行!

<<<<<<<<<<<<<<<<<<<<<<<<<<

作者的话我有点不解。他的文字中一会儿是0012FFA4,一会儿又是0012FFC4。注意这里A和C的区别。

我的理解:

不按这个ESP定律,反向用PUSHAD和POPAD来分析的话:

应该是先 POPAD,然后是JUMP OEP。

那么,按作者上面写的PUSHAD时各个被压入堆栈的寄存器来看,我记得好象以前学汇编(不好意思,已经忘得差不多了)时,压入堆栈是先把最底下的压入,再压上面的,一个一个压,直接压满。那么,POPAD弹出时,也是从上往下,一个一个弹出。所以最后弹出的是最底下的0012FFC0。

按我的理解,实质上POPAD可能就是一个一个弹出。最后如果分解成几步的话,最后一个是弹出 0012FFC0的那条。

所以,弹完了0012FFC0,下一步就是JUMP OEP。

所以,在OD中用 HW 12FFC0设置断点后,F9执行……

?按我现在的理解,到了断点,应该还没有JMP OEP啊。

看来我理解错了。有谁能指点我一下吗?

我主要搞不明白的是 作者他有没有写错?为什么一会儿说A4,一会儿又说C4?还有,ESP是什么?有什么专门的作用吗?我记得以前学汇编时有一个寄存器叫SP,可能是E+SP->ESP。但ESP是用来做什么的?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
2
ESP堆载平衡原理
2006-10-18 21:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最初由 bestchao 发布
ESP堆载平衡原理


晕,我知道这个名字。
但你得告诉我,我哪里理解错了才行啊。
还有,如果是缩写,请告诉我ESP的英文全称是什么。

感谢你回贴。
2006-10-18 21:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 skype 发布
晕,我知道这个名字。
但你得告诉我,我哪里理解错了才行啊。
还有,如果是缩写,请告诉我ESP的英文全称是什么。

感谢你回贴。


ESP E* Stack Pointer Register?
EIP E* Instruction Pointer Register?
2006-10-18 21:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主的用户名真不错啊:),我一开始也想注册的,不过....
我没有读那篇文章,对什么ESP定律不太清楚,
不过第一个问题我觉得可以这样理解,我觉得作者写得执行顺序还是对的,先将下一条地址压入堆栈,然后再jmp到调用处执行.楼主说的是否知道下一条地址,那是要在调用处结束前执行ret,这样的话会将一开始压入堆栈的地址弹出堆栈,放如eip,这样执行流程就得到返回了.
2006-10-18 21:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 zzCherring 发布
楼主的用户名真不错啊:),我一开始也想注册的,不过....
我没有读那篇文章,对什么ESP定律不太清楚,
不过第一个问题我觉得可以这样理解,我觉得作者写得执行顺序还是对的,先将下一条地址压入堆栈,然后再jmp到调用处执行.楼主说的是否知道下一条地址,那是要在调用处结束前执行ret,这样的话会将一开始压入堆栈的地址弹出堆栈,放如eip,这样执行流程就得到返回了.


嗯,谢谢你。我喜欢用skype。我在取名字时,乱取的话,也喜欢用zz_,比如zz_beauty,以前乱用过。

作者所说的:1.向堆栈中压入下一行程序的地址;

我现在想了想,汇编和普通的高级语言编程确实应该是不一样的。

0xA: call 0xC
OxB: some instruction

这样的话,在高级语言中没有"向堆栈中压入下一行程序的地址"这么一说的,可能实质上还是存在的,但对普通用户来说,这个东西是透明的,根本不用想管,或是想象。

但在汇编中,流程是这样的:

到了0xA处,它要执行 call 0xC。要转至0xC处的一段代码。但,要先把下一步的地址0xB压入一个栈中(你说是EIP?),然后才真正地转到0xC处,即作者说的 JMP 0xC。这段代码结束了,要通过RET(这个是return的缩写吧?)返回时,把0xB的值从栈中弹出。于是,代码就接着从0xB处继续,对吧?

现在好象完全明白过来了!谢谢。

关于ESP定律,在这个页面上有:

http://www.pediy.com/bbshtml/BBS6/pediy6083.htm
2006-10-18 22:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不好意思,我现在又有问题了。(刚才那个基本算是明白了,那个ESP和EIP的作用除外。)

针对原作者这句话,我有点不解。

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

他说,“当到达OEP后,绝大多的程序都第一句都是压栈!”我怎么觉得应该是这样的,先弹栈,再JMP到OEP啊?

看这张图:



里面明明是先popad,然后是那行OEP嘛。

有谁来指出我的错误?
2006-10-18 23:08
0
雪    币: 314
活跃值: (10)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
8
喂,楼上的popad可是出栈啊!
作者说:“而当到达OEP后,绝大多的程序都第一句都是压栈!”这句话的意思也许是经典的这个代码:
PUSH EBP
MOV EBP ESP
我猜的……

“ESP和EIP”

关于这两个我想说EIP总是指向下一条代码的地址
ESP堆栈的寄存器,总是用来指向内存中的地址
也就是说你push 就是ESP-4
POP就是ESP+4
2006-10-19 18:06
0
游客
登录 | 注册 方可回帖
返回
//