2020 BJDCTF WriteUp
主办方:由江苏科技大学、北京工业大学、西南民族大学、杭州师范大学、江苏大学、湖南工业大学、新疆大学七校联合举办。北京工业大学的官方信息也确认参与了本次赛事的组织
Misc
just a rar(RAR 爆破 + Hex 隐写)

rar的名字是四位数,那么密码应该也是四位数

WinHex 打开拿到 flag

你猜我是个啥(Hex 隐写)

WinHex 打开拿到 flag

藏藏藏(文件附加隐写)

010 看到文件中有 PK 头,推测还附加有压缩文件

使用 BinWalk 提取出来后有个名为 “福利.doc” 的文件,打开发现有个二维码

认真你就输了(文件附加隐写)

解压缩文件,给了一个 XLS 文件,打开该文件,发现是 PK 头

改为 .zip 后缀解压缩拿到 flag


签个到(文件后缀名欺骗)

下载压缩包解压报错,WinHex 打开发现是 PNG 文件头

改后缀为 PNG 是一张二维码,扫码得到 flag

一叶障目(PNG 宽高篡改)

改一下宽高就行

鸡你太美(文件头篡改)

WinHex 打开发现缺少了文件头

补充上去后换个方向就能看到 flag
1 | flag{zhi-yin-you-are-beautiful} |

Crypto
sign in(签到)

直接 Hex 转 ASCII 码即可

rsa_output(共模攻击)

1 | # 导入所需的函数:长整数转字节串、求最大公约数 |
Polybius(Polybius 方阵密码)

题目提示解码得到
1 | The length of this plaintext: 14 |
密文长度是 28,根据提示说明密文应该是两个字符表示一个明文字母
密文只由 5 个元音组成,5 个符号,两两组合,可以表示
1 | 5 * 5 = 25 |
这正好对应经典的 Polybius 方阵密码
Polybius 方阵常用 5x5 表编码 25 个字母,一般把 i/j 合并
1 | a b c d e |
我们可以直接爆破 5 个元音的排列
1 | import base64 |
编码与调制(曼彻斯特编码)

曼彻斯特编码的特点是每个原始 bit 会被编码成 2 个 bit,常见规则之一是
1 | 0 -> 01 |
或者相反
1 | 0 -> 10 |
先把十六进制密文转成二进制,再按照曼彻斯特规则还原得到
1 | BJD{DifManchestercode} |
rsa(共素数攻击)

题目源码
1 | from Crypto.Util.number import getPrime,bytes_to_long |
输出里一共有四个重要值
1 | 第一组: |
两组 RSA 生成过程
1 | p = getPrime(1024) |
两个模数共用了同一个素数 q
1 | n_1 = p_1 * q |
那么直接计算 gcd(n_1, n_2) 就能得到 q
1 | #!/usr/bin/env python3 |
base??(Base64 换表)

解题思路:
建立题目字符表
custom建立标准 Base64 字符表
standard对密文中每个字符
ch:找到
ch在custom表中的索引i替换成
standard[i]
得到正常 Base64 字符串
base64 解码
1 | import base64 |
Reverse
JustRe(签到)

反编译就能拿到 flag
