【发布时间】:2017-08-28 12:31:33
【问题描述】:
我只是想知道,因为我有这个 C 代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fillBuffer(int argc, char *argv[]) {
char bufferA[4] = "aaa";
char bufferB[4] = "bbb";
if(argc > 1)
strcpy(bufferB, argv[1]);
printf("bufferA: %s\n", bufferA);
printf("bufferB: %s\n", bufferB);
return 0;
}
int main(int argc, char *argv[]) {
fillBuffer(argc, argv);
return 0;
}
我尝试使用以下命令关闭堆栈保护:-fno-stack-protector
当我尝试通过执行:./program (escape key) 5f 来运行它时,程序输出到:
缓冲区A:f
缓冲区B:fffff
我只是不确定 bufferA 是如何变成 f 的。谁能给我解释一下?
【问题讨论】:
-
您确定
argv[1]是3字符吗?... -
未定义的行为,任何事情都可能发生。这只是一种可能性。
-
c代码只是给我们一个例子
-
我确信
bufferA和bufferB的基址可能会说明正在发生的事情,是的,无论如何它都是UB。我想这段代码是作为一个迫在眉睫的缓冲区溢出问题的例子提供的? -
我也很怀疑。所以将你的打印更改为
printf("bufferA:%p %s\n", (const void*)bufferA, bufferA);(bufferB也是如此)并记下地址。然后做一些数学运算,你应该会发现对bufferB的破坏溢出到了bufferA的内存中。或者在你的情况下它会似乎。如前所述,这都是 UB,所以不要指望你发现的任何东西都是福音。
标签: c stack buffer-overflow