2018 网鼎杯-第一场 WriteUp
📝 赛事概况
比赛赛制:采用线上 CTF(夺旗赛) 模式
晋级规则:每场线上预选赛取前 50 名进入线下半决赛。比赛结束后,前 50 名需在 12 小时内提交 Writeup 供审核
Misc
minified(通道隐写)

点击向右箭头发现 Red plane 0 是空的

分别把 alpha,green 和 blue 的 0 通道另存为再进行异或处理,最终在 alpha 和 green 的中发现 flag

clip(文件附加隐写)

题目给的是一个坏的 .disk 磁盘镜像文件,使用 010 查看十六进制搜索到图片

总共有两张图片,图片一如下

图片二如下

PS 拼接得到 flag

Reverse
beijing(Switch Case + 异或)
进入 main 函数,每次都输出 sub_804860 函数的结果

进入函数内部发现是 Switch Case 结构

它把 .data 中从 0x804a020 开始的 28 个字节,每两个一组做异或

如果每两个字节一组
1 | 0: a L |
这时候注意每组的第一个字符
1 | index 0 -> a |
再看我们 main 函数中传入的参数

对应 sub_804860 函数的 a1 变量,也就是选择分支的变量

把这些数据提取出来

得到对应的映射关系
1 | table = ['a','g','i','n','b','e','f','j','m','l','{','z','}','_'] |
拼接得到 flag:flag{amazing_beijing}
advanced(D 语言)

IDA 反编译发现 _Dmain 函数,说明程序是 D 语言编写的

运行程序得到密文
1 | welcome, here is your identification, please keep it in your pocket: 4b404c4b5648725b445845734c735949405c414d5949725c45495a51 |
调转到加密函数中

encrypt 里面连续调用了 enc!("111")……,其实就是
1 | for i in range(1, 500): |
随便进入一个 enc!(key) 函数中

D 语言看不懂,冷门语言,转为 Python
1 | def encrypt(plain: bytes, key: bytes = b"475475475", v7: int = 0) -> bytes: |
编写解密脚本拿到 flag
1 | ct_hex = "4b404c4b5648725b445845734c735949405c414d5949725c45495a51" |