【转】strcpy溢出的攻击示例

在学习c/c++的时候,就讲到了一些C类型的字符串函数不是安全的,比如strcpy没有检查长度会溢出,推荐使用strncpy,笔试面试也经常问到。同时经常浏览安全相关的新闻,缓冲区溢出攻击是很常见的一种。那缓冲区溢出为什么可以攻击。今天通过strcpy进行简单的演示。

如下是guess_pwd.cpp代码

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("Invalid params\n");
        exit(1);
    }
    bool check_result = false;
    char pass[10];
    memset(pass,0,10);
    strcpy(pass, argv[1]);
    if (0 == strcmp("xuzeshui", pass))
    {
        check_result = true;
    }
    if (check_result)
    {
        printf("Check password succ!\n");
    }
    else
    {
        printf("Check password failed!\n");
    }
    return 0;
}

上面的代码使用g++编译  g++ -o guess_pwd guess_pwd.cpp  生成可执行文件。当我们运行下面的输入。

./guess_pwd 0123456789012345

我们期望的是提示”Check password failed!”,结果却提示了”Check password succ!”。说明尽管我们不知道密码是多少,但通过缓冲区溢出,绕过了密码的安全检验逻辑。

上述check_result和pass两个变量由于是局部变量,故申请的时候是在栈上分配。由于栈是从高地址往低地址,所以从地址由低到高,check_result分配在pass后面,当进行strcpy操作的时候,因为没有检测输入长度,所以pass溢出了,会覆盖后面的内存区域。由于check_result在pass后面,所以当溢出足够的时候,check_result被改写了。

PS:check_result是否是仅挨着pass分配那不得而知,这个取决于编译器的优化,但是溢出就面临数据被异常改写的风险。

转载自听风江湖
本文链接地址: strcpy溢出的攻击示例

上一篇:Oracle - ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 解决


下一篇:iphone越狱还原