[toc]
前言
书接上回,第一天的预赛如果大家还算理智和克制,那第二天的决赛现场的选手可能就跟打了鸡血一样,比赛分了企业组、学生组和政府组,每个组在最后半小时都是风云变幻,赛后甚至还有人打探到某组的第一名是花钱买的,去年相同级别的一个比赛花了2w,今年花了1w(难道市场化了?所以价格下跌了。。。)
企业组的前几名,复杂的附件题目哐哐秒答案,最简单的web和pwn题没人做,就不要太明显。
虽说各级别CTF比赛的PY交易从来都不罕见,但是如此混乱的赛场纪律真是第一次见。
比赛的时候有一道复杂一点的misc,到比赛结束后和队友交流的时候才发现,其实比赛的时候已经做到最后一步了,盲水印隐写已经拿到结果了,但是还是因为疏于练习,竟然连文件路径都搞错了,愣是没找到输出的盲水印结果。。。如果有这道题目的分数,可能起码还能混到一个奖金。
比赛结束后在赛场附近闯了个红灯,痛失6分+200大洋,没拿到奖金还搭进去200块,真悲摧。
btw:WP还没写完,写博客的时候,用hexo直接创建了post,deploy了之后就发布了,暂时不知道如何将layout为post的文章改为draft,就先这样吧,反正写起来也快。
Misc
hide flag
一道简单的word隐写,打开word全选字符串之后修改颜色,发现了密码

那么肯定需要什么东西去解压了,docx本身也是一种压缩文件,将其解压之后,在word-media中发现了flag.zip

构造字典爆破压缩密码,可以考虑直接用Advanced Archive Password Recovery,当时作为一名优雅且喜欢CLI的CTFer,图形化显然不够优雅。
首先用crunch构造字典
1 | crunch 11 11 -t S1cRe7..%%% -o password.txt |
同样优雅的用7z配合for循环爆破
1 | for i in `cat password.txt`;do 7z x -p$i -aoa flag.zip >/dev/null 2>&1 && echo "Password found:$i"&&break;done |

手速不手速的不要紧,要紧的是优雅。
布达拉宫
binwalk发现图片存在压缩包,压缩包包含的是两张图片

用foremost对图片进行分离,得到一个压缩包,压缩包再解压得到两张看似一样的图片。

双图的话两个方向,一个是双图隐写,比如对比两张图片不通的像素位置,然后看是否隐写了别的内容;要么是盲水印,这道题实际是盲水印
直接上工具解盲水印
1 | blindwatermark decode output/zip/budalagong_1.png output/zip/budalagong_2.png result.png |
上面的blindwattermark是在zshrc中设置了alias,简化命令


盲水印执行成功后,拿到flag.zip的密码,密码是一个计算式,结果就是密码
password is (sqrt(4096576)*87/12+8)*17-8787 + “Tibet666”

解压后,通过tips发现,是词频统计

e和n组成的字符串就是flag{的base64,所以只需要根据flag文件中的词频,正确拼接flag的内容就行
1 | from collections import Counter |

Web
qiandao
略
ezjava
比赛的时候没时间看,赛后主办方也没给wp或者docker文件,所以没法继续做。
Crypto
EasyRSA
Revere
confidential
如果不脱壳,找到的字符串是缺失字符的



脱壳之后用ida打开,直接在字符串那里成功看到flag的base64编码

或者直接strings也能搜索到完整的字符串


ezmaze
反编译后,查看字符串,发现了迷宫

根据段数据内容,找到了对应的函数

根据函数内容,确定了迷宫的入口出口,以及操作的方式,wsad分别代表上下左右,所以输出的路径就是代表上下左右方向的字符串

确定了迷宫的情况之后,只需要找到路径就可以了。
1 | from hashlib import md5 |

PWN
NoTeLanDer_v2
vunlnerable函数存在溢出

dream函数可以执行命令

比赛的题目环境,幸亏是/flag文件,否则还得想办法传递system函数去执行自定义的命令
偏移是0x20+8
1 | from pwn import * |
