我又去混了一场 CTF 校赛

前几天看到群里面有科大的人在宣传他们的校赛,就又去混了一下。校外的人显然没有奖拿,但是玩一玩还是挺好的。毕竟像我这样的非专业没有队伍的爱好者也只能去这种个人赛玩了。

看了一下这次 web 和 pwn 完全没有什么存在感,大都以 misc 和 reverse 为主,但是都挺有特色的。

太具体的做法就不提了,主要记录下我的感想和收获吧。

web

仅有的几个 web 题里面最有意思的就是那个以 RFC 7168 彩蛋为灵感的了。读一下文档就会做,没什么难度但是看着文档里一本正经用网络协议来泡茶真有意思。

misc

隐写题基本是常见套路。不过有两个不会,一个从图片里提出了一个 ELF 可执行程序的 base64 片段,不过总是弄不完整,就没法继续下去了,还给了一个 tor 的地址,打开之后需要给他传参数,然而并不知道怎么搞。(看了题解思路正确。不过要先把黑边里面像素搞出来,之前想过没有实施,所以提取不完整。后面交互的话我只用过封装好的 tor-browser 没用过命令行…..呃太弱了) 另一个看起来像是用六十四卦代替 base64,不过解出来看不出是什么,作业太多不想在弄了没再做了。(看了题解发现六十四卦01和前后是可以搞出四种情况的,应该多试下的)

有一个给 MC 的红石电路让你调通的也挺好玩的。

最后两个明显是用来科普的题目,代码框架都给了,写几行就得。一道科普零知识证明,装个库调用一下现成函数。另一个是科普深度学习对抗攻击,数据集是最常见的 MNIST,出题的方向就是之前强网杯出坏了的那道(对抗样本那个我没做,看了题解发现比想象中复杂点)。

reverse

我好像都没做出来……题目我看起来比较新奇。比较有思路的有两个,都是以那种经常被人用来炫技的类似图灵机的语言出的,一道是 brainfuck,一道是 malbolge. 直接读懂是不存在的,我都找到了相应的翻译程序,前者翻译成了c,就是一个加密函数,看懂之后我又手动把展开的循环折叠回去了,然而写解密的时候发现数学太烂,我觉得应该是个矩阵求逆乘回去的过程,然而加了模运算之后不知道怎么逆回去了(看了官方题解,确实是有办法求逆的,只怪我代数学得不好)。另一个语言就更邪恶了,不过有教程将它编译成一个叫 hell 的虚拟机语言了,还有调试器,拿来跟着单步调了一下看不懂,懒得花时间学了,放弃。

剩下有一个好像把加密流程放到异常处理里面了,貌似要动态调试。话说 x64dbg 贼好用,真好用啊真好用,好用到我想给作者捐钱!不过确实没经验又不熟悉,调着调着我就跑飞了看不懂了(额看了题解压根不用动态调试,我貌似根本没找到那个异常处理函数)。还有一个把音频隐写到图片里,给了程序让你来逆向,没耐心也放弃了。还有一个貌似是做了一个 OLLVM 的混淆(看了官方题解,我智障了,结果跟输入没关系,把里面几个耗时函数 hack 掉跑就行了)。

总之,我恐怕是学不会 CTF 里面二进制相关的东西了。

crypto

印象比较深刻的是一个哈希碰撞的,三种哈希函数让你分别碰撞。sha1 直接用谷歌公布的两个 pdf 交就过了,md5 的碰撞也满大街都是了,不过题目加了限制,完全碰撞的话会不让过,想去学学王小云那个算法看看能不能只碰撞一部分我又被数学实力劝退,无脑暴力跑了一下感觉不太行,让它们前 8 个 bytes 相同要跑好久,7个很快但是数量又不够,我就放弃了(看了官方题解,确实是暴力跑,我做的优化不够)。

还有一道 RSA 给出了 p q n 的两个等式求 n 也是数学题了,数论学得差不是很懂(看了官方题解,能通过逐位枚举+剪枝暴力出来,前面的分析还是没想到啊)。

pwn

就一道,也不是溢出类型的。代码里捕获了一些异常,然后跳到一个执行 execlp 的写好的函数。捕获的异常中包括了浮点数运算异常的信号,但是直接除 0 被程序限制了,咕果了一下 SIGFPE 学了一招,用 INT_MIN/-1 因为结果没法表示了,也会触发 SIGFPE。接下来输命令执行,过滤了 “sh” 且命令不能带参数,各种试发现 vim 竟然能用。

补充

今天看到了官方的题解,感觉自己是个智障,其实有几道题其实就差一点点了……

感想

虽然这比赛主要是面向新人,最后我还是只水到了 20 多名,太弱了。一般像我这个年纪的都去出题了,我水平不行只能在这里做题膜拜大佬了。不说了赶紧滚去写作业去了。