• 【转】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
    ");
            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!
    ");
        }
        else
        {
            printf("Check password failed!
    ");
        }
        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溢出的攻击示例

  • 相关阅读:
    极客技术专题【008期】:CSS3核心技术:选择器
    10670 Work Reduction (贪心 + 被题意坑了- -)y
    hdu 4617 : Weapon
    [poj 2186]Popular Cows[Tarjan强连通分量]
    caldera
    linux内核书籍
    DedeCMS Error:Tag disabled:"php"的解决办法
    China特色创新现状
    麒麟OS剽窃
    国产系统
  • 原文地址:https://www.cnblogs.com/tiandsp/p/7440836.html
Copyright © 2020-2023  润新知