题目要求:
在如下代码中适当添加代码实现输出len变量的值为1361654881
#include<stdio.h>
#include<stdlib.h>
int main() {
int len = 0;
char str[8] = { 0 };
printf("输入构造的串\n");
scanf("%s", str);
printf("len=[%d]\n",len);
return 0;
}
解题思路:
1,正常思路不可能实现。
2,利用编译原理知识,及程序在内存中的存储位置关系(main中先定义的变量先压入栈中,栈地址由高向低延伸,可以构造一个串使str越界,相应的在Len地址区域输入一定值使得输出len为目标值)。
3,通过计算将1361654881转换为16进制为51 29 34 61(低字节在内存低位,高字节在高位),并查ascll码表得知其对应的字符为a4)【Intel和AMD的CPU为小端存储】
4,越界最后输入其值使得len输出结果
结果:
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#pragma warning(disable:4996)
#pragma pack(1)
int main() {
int len = 0;
char str[8] = { 0 };
printf("len和str地址相差%d字节\n", (char *)(&len) - (char *)str);
printf("输入构造的串\n");
scanf("%s", str);
printf("len=[%d]\n",len);
return 0;
}
/*
执行结果
len和str地址相差16字节
输入构造的串
0123456789012345a4)Q
len=[1361654881]
*/