我一直在通过一个以字符串作为参数的c程序来试验缓冲区溢出。然后(我认为?不太熟悉有问题的漏洞)将strcpy调用为64长度的字符串,而不检查参数字符串的长度,所以超过我的64值会覆盖堆栈的其他部分。
我相信每个有问题的字符都会转换为ASCII中的十六进制对应字符,然后写入堆栈。但是,由于ASCII仅上升到7E,有人会如何在堆栈中获得7F和9F之间的任何值?
我知道我并不真正理解这个话题,如果有人想澄清答案中到底发生了什么,那将非常受欢迎。
答案 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将允许您显示0x20
和0x7E
之间的字节(不计算扩展(8位)ASCII),您仍然可以提供0到255之间的任何值到C {{ 1}}。
当你在堆栈上推送的字节多于预期时会发生什么,只有上帝知道(即它是未定义的),你应该真的不这样做。提示:使用strncpy
。