【发布时间】:2015-05-27 14:18:49
【问题描述】:
我最近刚刚了解缓冲区溢出。我试图使用 GCC 来复制它。这是我写的代码。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one");
strcpy(buffer_two, "two");
printf("[BEFORE] buffer_two is at %p and contains %s\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains %s\n", buffer_one, buffer_one);
printf("[BEFORE] value is at %p and contains %d\n\n", value, value);
printf("[STRCPY] copying %d bytes into buffer_two\n\n", strlen(argv[1]));
strcpy(buffer_two, argv[1]);
printf("[BEFORE] buffer_two is at %p and contains %s\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains %s\n", buffer_one, buffer_one);
printf("[BEFORE] value is at %p and contains %d\n\n", value, value);
return 0;
}
看起来应该可以了,对吧? buffer_two 和 buffer_one 在内存中是相邻的。
[BEFORE] buffer_two is at 0x7fff56ff2b68 and contains two
[BEFORE] buffer_one is at 0x7fff56ff2b70 and contains one
[BEFORE] value is at 0x5 and contains 5
然而,不久之后……
[STRCPY] copying 14 bytes into buffer_two
Abort trap: 6
C 怎么会认出这个?一些黑客如何执行更复杂的实际有效的缓冲区溢出?
【问题讨论】:
-
C(或 C++)不承认这一点。两种语言都没有对 C 字符串或数组进行边界检查,无论如何都没有标准化。写出任何东西都会导致未定义的行为,这意味着任何事情都可能发生。
-
如果没有为您的代码 (
gcc -S) 生成的程序集,就不可能明确回答,一旦提供,答案应该足够清楚,无需提问。 -
您使用的是什么平台、gcc 版本和编译/链接命令行?
-
检查你如何运行你的程序,可能你正在强制进行一些运行时检查。在这里查看它是如何工作的 ideone.com/wQHItj 。另请注意,ideone 堆栈的增长方向相反。
-
@MichaelBurr OS 10.10.2,最新版本的 GCC 4.2.1
标签: c++ c gcc buffer buffer-overflow