首页
社区
课程
招聘
[求助]请问下 test 是怎么检查堆栈溢出的?
发表于: 2006-5-7 20:40 6424

[求助]请问下 test 是怎么检查堆栈溢出的?

2006-5-7 20:40
6424
__alloca_probe(堆栈分配函数)
Apocalypse @ 2004-09-22 15:19

这个函数是在很多程序中间都能够看到的一个东西,Caller Function 调用了这个以后,堆栈结构就不再是一般的BP Frame 了,而变成Local Variable 使用 ESP 定位的方式了,一般用来在堆栈里分配大量的空间。
它一般在Caller Function 构建好BP Frame 之后马上调用,EAX 中存放需要分配的字节数。
函数返回之后  ESP = EBP - EAX。

.text:00458210 __alloca_probe  proc near               ; CODE XREF: .text:00414718p
.text:00458210                                         ; sub_41487A+8p ...
.text:00458210
.text:00458210 savedEBP        = dword ptr  8
.text:00458210
.text:00458210                 push    ecx
.text:00458211                 cmp     eax, 1000h
.text:00458216                 lea     ecx, [esp+savedEBP]
.text:0045821A                 jb      short AllocLess1000h
.text:0045821C
.text:0045821C AllocStack1000h:                        ; CODE XREF: __alloca_probe+1Ej
.text:0045821C                 sub     ecx, 1000h
.text:00458222                 sub     eax, 1000h
.text:00458227                 test    [ecx], eax      ; 看是否溢出
.text:00458229                 cmp     eax, 1000h
.text:0045822E                 jnb     short AllocStack1000h
.text:00458230
.text:00458230 AllocLess1000h:                         ; CODE XREF: __alloca_probe+Aj
.text:00458230                 sub     ecx, eax
.text:00458232                 mov     eax, esp        ; 记录原来的堆栈指针
.text:00458234                 test    [ecx], eax      ; 看是否溢出
.text:00458236                 mov     esp, ecx        ; 修改堆栈指针
.text:00458238                 mov     ecx, [eax]      ; 相当于 pop ecx
.text:0045823A                 mov     eax, [eax+4]    ; 这里存放的是返回地址
.text:0045823D                 push    eax             ; 构建一个假的Far Return 堆栈返回地址
.text:0045823E                 retn
.text:0045823E __alloca_probe  endp

用IDA看这个libc中的函数时硬时搞不明白 他这两句test有什么用
test    [ecx], eax      ; 看是否溢出
百度一下 看到说时检查溢出 那么 test检查溢出是什么原理呢? 怎么达到检查异常的目的的? 触发异常?
哪个蝈蝈解释下啊 谢谢了先

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 199
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
test可能真的只是检查堆栈是否溢出

注意第3句  lea ecx, [esp+8]    // savedEBP = 8,用EBP这个名字,纯粹误导人。
这里其实等于 ecx = esp+8; 注意,并不是ecx = [esp+8]
也就是说堆栈里面的值,其实并没有作用。ecx只是指向了呼叫此函数前的堆栈底部,即call前的esp。

作用其实就是。。。给临时变量分配空间。
2006-5-7 21:41
0
游客
登录 | 注册 方可回帖
返回
//