alloca函数的风险___alloca_probe分析

用IDA分析程序时,经常可以看到__alloc_probe(malloc.h中的alloca函数)这个函数,这个函数有什么用呢!

现在分析一下这个函数。

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:2                 sub     eax, 1000h      ; 这相当于把栈提高了

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

seg000:9                 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:                 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返回地址。

流程如下:

bc1fcf7bf9c9384366a306a90643d7e6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值