梦有所依丶 发表于 2022-10-19 11:10:43

不改动程序情况下输出congratulate该怎莫办

#include<stdio.h>
#include<string.h>
int main()
{
char a={0};
char b={0};
const char s[]="hahaha";
printf("hello,there is a gift for you:\na = %p\nb = %p\nNow,do what you want to do:\n",a,b);
gets(a);
if(!strncmp(b,s,6)) printf("Congratulate\n");
return 0;
}

jackz007 发表于 2022-10-19 11:56:20

      这个题实际上考的是变量内存越界侵入,a 和 b是相邻变量,它们在内存中的位置应该和它们的定义顺序相关,a 在前,b 在后,然后,在读入 a 的时候,故意超出 a 的内存范围,入侵到 b 的存储区间,从而达到 b 的内容成为 "hahaha" 的目的。
      a、b 占用空间的前后关系可能会因编译器而异,我使用 tdm-gcc 5.1.0,从编译后的程序输出可以看到:
hello,there is a gift for you:
a = 0022FF48
b = 0022FF40
Now,do what you want to do:
      a 占用的内存空间从 0x0022FF48 开始,而 b 占用的空间从 0x0022FF40 开始,显然,它们之间存在 b 在前,a 在后的顺序,如果是这样的话,就不满足我们的预期,就不可能做到题目的要求,怎么办呢,好办,只要调整一下 a、b的定义顺序就行了,于是,我们可以看到:
      编译、运行效果:
D:\\C>x
hello,there is a gift for you:
a = 0022FF40
b = 0022FF48
Now,do what you want to do:
xxxxxxxxhahaha
Congratulate

D:\\C>

jackz007 发表于 2022-10-19 12:13:58

      好办,键盘输入 xxxxxxxxhahaha 试试。

梦有所依丶 发表于 2022-10-19 12:40:50

jackz007 发表于 2022-10-19 12:13
好办,键盘输入 xxxxxxxxhahaha 试试。

不行阿0.0

jackz007 发表于 2022-10-19 12:50:18

本帖最后由 jackz007 于 2022-10-19 12:52 编辑

梦有所依丶 发表于 2022-10-19 12:40
不行阿0.0

         这题需要变量 a 和 b 的存储位置 a 在前,b 在后,这样,在输入 a 的时候,在填满 a 的 8 个字符空间的时候,后面的输入会侵入到 b 的空间,从而,可以和 s 相等。

         但是,我试过 VC6 和 tdm-gcc,这两种编译器编译的结果都显示是 b 在前,a 在后(程序有打印 a、b指针,先后顺序只要看看指针的数值大小就可以知道了),这样,就无法达成我们预期的效果了。

         如果换编译器无法做到,那就只好把 a 和 b 的定义顺序改一下了,改成先定义 b,再定义 a,这样肯定好使。

梦有所依丶 发表于 2022-10-19 13:00:17

jackz007 发表于 2022-10-19 12:50
这题需要变量 a 和 b 的存储位置 a 在前,b 在后,这样,在输入 a 的时候,在填满 a 的 8 个 ...

感谢

梦有所依丶 发表于 2022-10-19 13:44:01

jackz007 发表于 2022-10-19 12:50
这题需要变量 a 和 b 的存储位置 a 在前,b 在后,这样,在输入 a 的时候,在填满 a 的 8 个 ...

指针的大小该怎么看呢0.0

jackz007 发表于 2022-10-19 13:49:10

梦有所依丶 发表于 2022-10-19 13:44
指针的大小该怎么看呢0.0

D:\\C>c
hello,there is a gift for you:
a = 0012FF78
b = 0012FF70
Now,do what you want to do:
       a = 和 b = 后面的就是他们的内存地址。
页: [1]
查看完整版本: 不改动程序情况下输出congratulate该怎莫办