Misc Writeup
记录一些有趣的 CTF Misc 题目。
1 看不见的 100 分
一个成绩单.exe 文件,一眼 WinRAR SFX

解压后一个成绩单.png 文件,一个隐藏的 100分.zip 文件

典型的 doc 文件结构,改后缀打开,发现一片空白。不过全选有东西。
复制出来到文本编辑器中 / 开启护眼模式 / 调整字体颜色等等方式,可以看到一串 emoji (其他均为空格):

👝👣👘👞👲👚🐰👛🐭🐪🐫👙🐫🐰🐨👜🐫🐬🐪🐬🐩👚🐨🐭👛🐬🐧🐭🐩🐨🐬🐫🐮🐬🐪🐧👛👴
想到 base100,随便找个平台解密得:
flag{c9d634b491e45352c16d50621547530d}
2 jpg
binwalk 分离出一个 png 和一个 rar 压缩包,需要密码
用 ARCHPR 暴力得到密码 123456,解压后是一个明文文件 ZmxhZy5jb2Rl。
解 base64 得到:

像 hex string,转换成文件后 file:
![]()
用 IDA 载入,发现报错 hex-rays decompiler not found。改用 Cutter,找到关键函数:

直接对整个程序的全部内容 xor 0x37,得到:

结合题目要求 flag需要包含RCTF{},结果为:
RCTF{orz_u_Get_The.C0D3_F1@9}
3 Keyword
一张图:

基础方法都试一遍发现不行,考虑 lsb 加密
在此处下载 python3 对应的版本,然后 pip install pycryptodome,最后
python3 lsb_for_py3.py extract <加密文件> <输出文件> <密钥>
得到一个字符串 PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}。
根据题目的 Keyword 想到是关键词密码,随便找一个网站得到 QCTF{CCGELDNRIBCX9G1G13KFFELNSNMRDOWF},输入进去发现不对。。。
最后想到可能是大小写问题,用 ai 写个脚本:
def keyword_cipher_case_sensitive(keyword, text):
keyword_upper = keyword.upper()
seen = set()
keyword_processed = []
for char in keyword_upper:
if char not in seen and char.isalpha():
seen.add(char)
keyword_processed.append(char)
remaining = [chr(i) for i in range(65, 91) if chr(i) not in seen]
cipher_upper = keyword_processed + remaining
cipher_lower = [c.lower() for c in cipher_upper]
plain_upper = [chr(i) for i in range(65, 91)]
plain_lower = [c.lower() for c in plain_upper]
map_upper = dict(zip(cipher_upper, plain_upper))
map_lower = dict(zip(cipher_lower, plain_lower))
result = []
for char in text:
if char in map_upper:
result.append(map_upper[char])
elif char in map_lower:
result.append(map_lower[char])
else:
result.append(char)
return ''.join(result)
ciphered = "PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}"
keyword = "lovekfc"
print(keyword_cipher_case_sensitive(keyword, ciphered))
结果为:
QCTF{cCgeLdnrIBCX9G1g13KFfeLNsnMRdOwf}
PS:看官方 writeup 发现是 Nihilist 密码