一个有趣的题(要求越界危险题)

题目要求:

在如下代码中适当添加代码实现输出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]
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值