鱼C论坛

 找回密码
 立即注册
查看: 2503|回复: 7

[已解决]不改动程序情况下输出congratulate该怎莫办

[复制链接]
发表于 2022-10-19 11:10:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
int main()
{
char a[0x8]={0};
char b[0x8]={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;
}
最佳答案
2022-10-19 12:50:18
本帖最后由 jackz007 于 2022-10-19 12:52 编辑


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

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

         如果换编译器无法做到,那就只好把 a 和 b 的定义顺序改一下了,改成先定义 b,再定义 a,这样肯定好使。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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:\[00.Exerciese.2022]\C>x
hello,there is a gift for you:
a = 0022FF40
b = 0022FF48
Now,do what you want to do:
xxxxxxxxhahaha
Congratulate

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 12:13:58 | 显示全部楼层
        好办,键盘输入 xxxxxxxxhahaha 试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 12:40:50 | 显示全部楼层
jackz007 发表于 2022-10-19 12:13
好办,键盘输入 xxxxxxxxhahaha 试试。

不行阿0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 12:50:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-19 12:52 编辑


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

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

         如果换编译器无法做到,那就只好把 a 和 b 的定义顺序改一下了,改成先定义 b,再定义 a,这样肯定好使。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-10-19 13:00:17 | 显示全部楼层
jackz007 发表于 2022-10-19 12:50
这题需要变量 a 和 b 的存储位置 a 在前,b 在后,这样,在输入 a 的时候,在填满 a 的 8 个 ...

感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 13:44:01 | 显示全部楼层
jackz007 发表于 2022-10-19 12:50
这题需要变量 a 和 b 的存储位置 a 在前,b 在后,这样,在输入 a 的时候,在填满 a 的 8 个 ...

指针的大小该怎么看呢0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 13:49:10 | 显示全部楼层
梦有所依丶 发表于 2022-10-19 13:44
指针的大小该怎么看呢0.0

D:\[00.Exerciese.2022]\C>c
hello,there is a gift for you:
a = 0012FF78
b = 0012FF70
Now,do what you want to do:
       a = 和 b = 后面的就是他们的内存地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 11:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表