【问题标题】:Buffer Overflow add bytes over 0x7E to stack缓冲区溢出将超过 0x7E 的字节添加到堆栈
【发布时间】:2013-04-30 22:19:02
【问题描述】:

我一直在通过一个将字符串作为参数的 c 程序来试验缓冲区溢出。然后它(我认为?不是很熟悉所讨论的漏洞)将 strcpy 调用为长度为 64 的字符串,而不检查参数字符串的长度,因此超过我的 64 值的部分将覆盖堆栈的其他部分。

我相信每个有问题的字符都被转换为 ASCII 中的十六进制对应字符,然后写入堆栈。但是,由于 ASCII 只能达到 7E,那么有人如何将 7F 和 9F 之间的任何值放入堆栈?

我知道我并不真正理解这个话题,如果有人想澄清他们的答案到底发生了什么,那将非常受欢迎。

【问题讨论】:

    标签: c hex overflow buffer


    【解决方案1】:

    谁说不能为字符传递高于 0x7E 的值?

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        char *p = argv[1];
        unsigned char c;
    
        if (argc < 2) return 1;
    
        while ((c = *p++))
        {
            printf("%02x\n", (unsigned int) c);
        }
    }
    

    我们可以在argv[1] 字符串中传递高于0x7E 的字符值:

    $ ./tst $(echo -ne "\xAB\xCD\xEF\xFF")
    ab
    cd
    ef
    ff
    $
    

    【讨论】:

      【解决方案2】:

      在 C 中,char 实际上是一个字节,因此可以取 255 (0xFF) 个值。虽然(7 位)ASCII 将允许您显示 0x200x7E 之间的字节(不包括扩展(8 位)ASCII),但您仍然可以将 0 到 255 之间的任何值提供给 C char

      至于当你压入堆栈的字节数超过预期时会发生什么,只有上帝知道(即它是未定义的),你真的不应该这样做。提示:使用strncpy

      【讨论】:

      • 我知道这是一个巨大的安全漏洞,而且我知道 strncpy(指定要复制的数量等)。我只是为了它而尝试这样做,看看如何编辑变量以及堆栈如何更好地工作。
      猜你喜欢
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      相关资源
      最近更新 更多