我在学习安全。下面是我得到的一些示例代码:

#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);

...

10-06 04:53