BUUCTF_Crypto_WriteUp | 密码学的心声

发布时间 2023-11-06 19:06:33作者: Guanz

题目

密码学的心声_题目

分析

试着唱了一下(bushi,发现歌词里的提示

  1. 简谱需要转为 ASCII 码
  2. 谱子里没有 8,且 8 与进制相关

根据第 2 点可猜测谱子为八进制。

对照 ASCII 码表,发现编码的范围在 0 到 127 之间,其中非控制功能的字符范围为 32 到 126,范围大小为 95。而 8 的 3 次方可将这个范围完全囊括,谱子里的数字共 63bit 正好整除,于是暂定分组大小为 3bit 一组。对分组后得到的字符由八进制转换为十进制,得到 21 个数字。

再看题目,要求的是“有意义语句通顺”的字符串,尝试将数字对照 ASCII 码转换为字符串,得到 flag 内容。

代码如下:

// 按每3位一个数划分
int nums[] = { 111,114,157,166,145,123,145,143,165,162,151,164,171,126,145,162,171,115,165,143,150 };
int numsSize = sizeof(nums) / sizeof(int);
// 八进制转十进制
char* OctToDec = (char*)malloc(numsSize);
memset(OctToDec, 0, numsSize);
for (int i = 0; i < numsSize; ++i) {
	int p = 0;
	while (nums[i]) {
		OctToDec[i] += nums[i] % 10 * pow(8,p);
		nums[i] /= 10;
		++p;
	}
}
for (int i = 0; i < numsSize; ++i) {
	printf("%c", OctToDec[i]);
}

Flag

flag{ILoveSecurityVeryMuch}

参考

ASCII码一览表,ASCII码对照表