【深入浅出】分析strcpy导致栈溢出的具体原因

您所在的位置:网站首页 strcpy函数举例 【深入浅出】分析strcpy导致栈溢出的具体原因

【深入浅出】分析strcpy导致栈溢出的具体原因

2023-08-29 23:31| 来源: 网络整理| 查看: 265

                     (a)IDA看到的伪代码                                                           (b)c语言的代码

                                                                     (c)sub_401020()的汇编指令

 

                                                                                (d)OllyDbg调试过程中

如图(a)[bp-XXh]、(c)ss:[ebp-0xXX]、(d)栈空间所示,在当前函数中,所有局部变量都存储在栈内。

       如图(d)当前函数ebp=0018FAEC;

     (a)中的v4(即图(b)的authenticated)位于ebp-4h位置(即图(d)的0018FAE8);

     (a)的v3(即(b)的buffer[8])位于ebp-ch位置,给了他8个字节的空间,v3的地址&v3即是图(d)的0018FAE0;

        如图(d)所示,栈上18FA90-18FA88的位置记录了strcpy函数在栈内操作的变化,可以看到直接把a1的值赋给了v3,18FA8C存储的是v3的地址,可以看到18FA8C指向的位置是0018FAE0,这个位置上已经是被赋值好“123456”字符串了。而由于局部变量v3位于栈上,并且strcpy没有限制a1要复制的长度,所以会有可能造成栈溢出覆盖当前函数ebp(存储了上个函数的ebp的地址)及返回地址。

        所以造成栈溢出的主要原因是当前函数将局部变量、参数储存在了栈上,调用strcpy、sprintf、vsprintf这样的函数之前,将传入参数的地址push进栈,然后strcpy、sprintf、vsprintf这样的函数再当给位于栈上的变量赋值超过其定义的长度时就会发生溢出的问题。如图(e)所示,ss:[ebp-xxxh]指的就是栈内的位置,这些变量、参数都会预留一定的空间。

                                                                       (e)OllyDbg调试过程中截图



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3