1

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

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

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

4

2 回答 2

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);
    }
}

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

$ ./tst $(echo -ne "\xAB\xCD\xEF\xFF")
ab
cd
ef
ff
$
于 2013-04-30T22:39:45.787 回答
0

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

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

于 2013-04-30T22:49:20.623 回答