文章目录

  • 前言
  • 一、题目是什么?
  • 二、解题步骤
  • 1.下载文件,解压
  • 2.解码Unicode
  • 3.ASCII码解码
  • 4.BrainFunk解码
  • 5.摩斯码解码
  • 6.字频解密
  • 总结



前言

在CTF比赛中,有关密码学的问题,都是考察思路和工具使用,还有具备良好的编码能力。本篇文章主要讲的是一个关于多种编码和字频解密的内容。


一、题目是什么?

ctf python密码学脚本 ctf密码学题目_CTF比赛

二、解题步骤

1.下载文件,解压

ctf python密码学脚本 ctf密码学题目_CTF比赛_02


里面是一个文本文件task.txt,打开文件,内容如下:

ctf python密码学脚本 ctf密码学题目_CTF比赛_03

分析内容,应该是Unicode编码的一种。Unicode编码有以下四种编码方式:

源文本: The

&#x [Hex]: \T\h\e

&# [Decimal]: \T\h\e

\U [Hex]: \U0054\U0068\U0065

\U+ [Hex]: \U+0054\U+0068\U+0065

2.解码Unicode

使用在线Unicode解码,解码如下:

ctf python密码学脚本 ctf密码学题目_密码学_04

得到解码后的文本。可以仔细观察,发现按照两个字符、两个字符间隔一下,是有规律的。43,43,43,43,……。不过需要手动间隔太慢了,可以写代码来完成。比如在NodeJS下,通过文件读写,把上述的解码保存为文件Unicode解码.txt,通过处理之后输出到文件处理Unicode解码.txt。可以这样:

const { readFile,writeFile } = require('node:fs/promises');
const { resolve } = require('node:path');

try{
	const filePath = resolve('C:\\Users\\Administrator\\Downloads\\classical && coding 的附件\\tempdir\\CRYPTO附件\\Unicode解码.txt');
    const contents = await readFile(filePath,{encoding:'utf8'});
    let a = [];
    for(let i=0; i<contents.length; i+=2){
      let t = contents[i]+contents[i+1];
      a.push(t);
    }
    const res = a.join(',');
    const data = new Uint8Array(Buffer.from(res));
    await writeFile('处理Unicode解码.txt',data);
} catch(e) {
	console.error(err.message);
}

这样输出的文件处理Unicode解码.txt就是用逗号分隔的字符了。

ctf python密码学脚本 ctf密码学题目_ctf python密码学脚本_05


这些字符,我们看成十六进制,也可以看成十进制,需要按照ASCII码对应一下。

3.ASCII码解码

通过在线ASCII码解码,解码如下:

ctf python密码学脚本 ctf密码学题目_CTF比赛_06


这个又是一种编程语言代码,名称叫BrainFunk

4.BrainFunk解码

通过在线BrainFunk解码,解码如下:

ctf python密码学脚本 ctf密码学题目_网络安全_07

ctf python密码学脚本 ctf密码学题目_前端_08


终于可以看到真面目了,这个是摩斯码

5.摩斯码解码

通过在线摩斯码解码,可以得到如下:

ctf python密码学脚本 ctf密码学题目_CTF比赛_09

ctf python密码学脚本 ctf密码学题目_前端_10

得到解码后的字符串是:GFBCEL%u7bENAB_AB_F_BAPKIH_HJCQSKEADJ,MDDG_IRCO%u7d,看上去没有任何信息,不过我们需要通过字频解密。

6.字频解密

通过字频解密网址,再加上猜测官方的提示(flag的格式都是:DASCTF{*答案*}),得到:

ctf python密码学脚本 ctf密码学题目_密码学_11

ctf python密码学脚本 ctf密码学题目_CTF比赛_12


结果的第一个:dasc tfws this is a simple encryption good luck wo ,就是答案,我们提取有效字符,即this is a simple encryption good luck即为最终的flag。


总结

以上就是第一道CTF题目的解题过程和思路,可以发现这里面涉及众多的编码,需要平时的知识积累,另外还需要一定的编码能力,例如字符串的处理。这是个很考察基本功的题目。除了基本功,就是观察能力,还有能联想到字频解密,以及根据已知的字符的对应关系来找字频。