缓冲区溢出将字节超过0x7E添加到堆栈

时间:2013-04-30 22:19:03

标签: c hex overflow buffer

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

我相信每个有问题的字符都会转换为ASCII中的十六进制对应字符,然后写入堆栈。但是,由于ASCII仅上升到7E,有人会如何在堆栈中获得7F和9F之间的任何值?

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

2 个答案:

答案 0 :(得分: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
$

答案 1 :(得分:0)

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

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