NepnepxCatCTF Reverse CatFly WriteUp
Contents
挺有意思的一道题,本身不算难,但最后加上我只有4解还是挺惊讶
题目是个命令行小游戏,运行起来可以看到屏幕的第一行会一直打印一些字符,但仔细看都是乱码
伪代码内容比较清晰,大段都是关于命令行参数、不同终端的处理之类的东西,重点内容如下:
|
|
|
|
|
|
可以看出这就是更新屏幕显示内容的逻辑,我们关心的是第一行那一串字符,产生这些字符的逻辑在sub_6314,结合这个函数内的if限制可以得到,只有$screen_row = 18 且 screen_col \in [5, 54]$时才会真正产生字符,即画面中字符的位置
而字符的具体值是由enc
数组和key
的值计算而来的,结合hint说要抄写这个算法跑一分钟就能出flag
,最终exp:
|
|
为了节省运算时间,代码中做了一些省略,和计算字符串无关的代码,比如screen_row和screen_col的两个外层循环直接扬了
需要注意每次for循环结束之后,key的值要加上printf函数的返回值,即输出的字符数
踩到的另外一个坑:刚开始想法将所有字符输出到一个文件里,然后结合grep去找有用的字符串,理论可行,但一分钟跑出来就全是乱码,还以为是算法写得有问题。最后又尝试了一遍,程序一分半也没跑出结果,输出文件已经达到了4.7G,使用grep提示内存耗尽,文本编辑器尝试打开直接崩溃,还是挺吓人的,同时也可以看出如printf等输出函数对程序运行效率的降低非常大。
最终flag:CatCTF{Fly1NG_NyAnC4t_Cha5eS_the_FL4G_in_The_Sky}