我在学习安全。下面是我得到的一些示例代码:
#include <stdio.h>
#include <string.h>
char *j; /* use to dump the stack in function cat */
/* Strings to be copied into buffer in function cat */
char str1[] = "";
char str2[] = "";
int main() {
void cat(int *parm) {
char buffer[8];
/* Dump the stack for function cat */
for (j=buffer; j<((char *)&parm); j++)
printf("%p: 0x%x\n", j, *(unsigned char *)j);
/* copy str1 followed by str2 into buffer */
/* note that a \0 remains between str1 and str2 in buffer */
strcpy(buffer, str1);
strcpy(&buffer[strlen(str1)+1], str2);
}
int *arg; /* dummy argument for call to function cat */
int x;
x = 0;
cat(arg);
x = 1;
printf("%d\n",x);
}
我在用GCC编译。不过,我只得到“1”。你知道为什么吗?
另外,我的目标是最终让程序打印出“0”,并通过只向cat()添加代码来实现这一点。我不能改变任何已经在那里,只是补充。帮我找到正确的方向。
最佳答案
我在用GCC编译。不过,我只得到“1”。你知道为什么吗?
我们可以看到
x = 1;
printf("%d\n",x);
所以这可能是实际运行的惟一print语句。
所以我推断
for (j=buffer; j<((char *)&parm); j++)
从未输入。有点奇怪。我希望堆栈向下增长,所以我希望参数
parm
的地址高于buffer
。你在用什么机器?
尝试打印buffer和&parm的值,例如。
void cat(int *parm) {
char buffer[8];
printf("buffer=%p\n", buffer);
printf("&parm=%p\n", &parm);
...