__alloca_probe分析

之前毛哥面试金山,问题申请栈空间有几种方式,他只答了sub esp,xx。然后那个面试官怕他没有听明白,换了一个角度问他,说用IDA分析程序时,经常可以看到__alloc_probe这个函数,这个函数有什么用呢!

       刚好那几天在分析腾讯的CrackMe,也看到了这个函数,现在分析一下这个函数。

seg000:004042E0 __alloca_probe  proc near

seg000:004042E0 arg_0           = byte ptr  4

seg000:004042E0

seg000:004042E0                 push    ecx

seg000:004042E1                 cmp     eax, 1000h      ; 判断申请的大小是为小于1000h

seg000:004042E6                 lea     ecx, [esp+4+arg_0] ; 取得原来参数在栈中的地址,用于用来提升栈空间

seg000:004042EA                 jb      short loc_404300 ; 小于

seg000:004042EC

seg000:004042EC loc_4042EC

seg000:004042EC                 sub     ecx, 1000h

seg000:004042F2                 sub     eax, 1000h      ; 这相当于把栈提高了

seg000:004042F7                 test    [ecx], eax      ; 看是否溢出

seg000:004042F9                 cmp     eax, 1000h

seg000:004042FE                 jnb     short loc_4042EC

seg000:00404300

seg000:00404300 loc_404300:

seg000:00404300                 sub     ecx, eax        ; 再减去1000h的余数

seg000:00404302                 mov     eax, esp        ; 记录原来的栈顶指针

seg000:00404304                 test    [ecx], eax      ; 看是否溢出

seg000:00404306                 mov     esp, ecx        ; 修改堆栈指针

seg000:00404308                 mov     ecx, [eax]      ; 还原ecx的值

seg000:0040430A                 mov     eax, [eax+4]    ; 这里存放的是返回地址

seg000:0040430D                 push    eax             ; 构建一个假的Far Return 堆栈返回地址

seg000:0040430E                 retn

seg000:0040430E __alloca_probe  endp

       函数分为三部分,首先一开始检查申请的栈大小是否大小0x1000,如果大于的话,不停的循环,依次将大小和栈顶地址减0x1000,再判断一下是否溢出,通过test [ecx], eax来判断是否溢出,因为栈大小有限制,如果申请的空间过大,到了低端地址,是无法访问的,所在test一下,如果无法访问,则会报错产生一上访问异常。最后再减去0x1000的余数,再检查一下是否到了低地址,再修改esp的值,还原原来ecx的值,再构建一个假的Far return返回地址。

       流程如下:

[转自]http://hi.baidu.com/evilknight1986/blog/item/4735513fb405f13070cf6c59.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值