我一直在通过将字符串作为参数的 ac 程序来试验缓冲区溢出。然后它(我认为?不是很熟悉所讨论的漏洞)将 strcpy 调用为长度为 64 的字符串,而不检查参数字符串的长度,因此超过我的 64 值的内容将覆盖堆栈的其他部分。
我相信每个有问题的字符都会转换为 ASCII 中的十六进制对应字符,然后写入堆栈。但是,由于 ASCII 只能达到 7E,那么有人如何将 7F 和 9F 之间的任何值放入堆栈?
我知道我并不真正理解这个话题,如果有人想澄清他们的答案到底发生了什么,那将非常受欢迎。
谁说你不能传递高于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
$
在 C 中 achar
实际上是一个字节,因此可以取 255 ( 0xFF
) 个值。虽然(7 位)ASCII 将允许您显示 和 之间0x20
的字节0x7E
(不包括扩展(8 位)ASCII),但您仍然可以向 C 提供 0 到 255 之间的任何值char
。
至于当你在堆栈上压入比预期更多的字节时会发生什么,只有上帝知道(即它是未定义的),你真的不应该这样做。提示:使用strncpy
.