-
-
[原创] 看雪 2022 KCTF 春季赛 第七题 一触即发
-
发表于: 2022-5-23 15:14 4261
-
golang程序,高版本IDA(7.7+)打开,体验极好(然后在main_main函数中迷失无法自拔)
程序要求输入7位数字
0x4ae194 的 fmt_Println_0 传了一个 "fail!!!" 字符串作为参数,但始终没有打印出来,反而是不停的循环要输入
(甚至已经把 main_main 里的最后一轮循环 F8 单步跟踪完了,仍然一头雾水找不到路)
好在 IDA 7.7 已经把绝大部分函数都标蓝了(FLIRT识别出的库函数),只有极个别的函数还是白的。挨个看,发现读取输入的 bufio__ptr_Reader_ReadString 函数在 0x4ad700 有检查输入字符是否位于 [0x30, 0x39] 的范围,非常可疑;继续往下看,发现输入的数字被填入了 fmt_Abc 全局变量。
在IDA里按y和*把这个变量定义为4*4的__int64数组,查找交叉引用,发现了初始化的位置在 fmt_Print 函数,而真正检查的位置在 fmt_Fprintln_0 函数。(阴险的出题思路,一直没有想过古怪出在输入输出函数里)
程序对 fmt_Abc 的检查相当简单,是一个4*4的数独,初始化时留了7个空位,输入的7位整数按顺序填入其中,保证4行、4列、4个2*2里的数字相加都是10,即1234的排列。
初始化的值:(0是待填空位)
1 2 3 4 | 0310 1003 2034 0420 |
按照规则填好的值:
1 2 3 4 | 4312 1243 2134 3421 |
所以程序正确的输入是:
1 | 4224131 |
(另:7位整数,只有10000000种输入,单线程几十分钟能爆破10000,找个多核机器直接硬爆一天也能出来)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-5-23 15:17
被mb_mgodlfyn编辑
,原因:
赞赏
他的文章
看原图
赞赏
雪币:
留言: