看雪2022 KCTF 春季赛 | 第七题设计思路及解析
2022-5-24 17:59:45 Author: mp.weixin.qq.com(查看原文) 阅读量:17 收藏

看雪 2022 KCTF春季赛 于5月10日中午12点正式开赛!
第七题《一触即发》已于今日中午12点截止答题,这是本次比赛中比较简单的一道题经统计,此题围观人数1214人,共25支战队成功破解。
【mininepRe】战队用时54分6秒拿下本题“一血”,第二名来自【打打酱油】战队、第三名来自【xtgo】战队。
接下来和我一起来看看该赛题的设计思路和相关解析吧!

出题团队简介

第七题《一触即发》出题方 【one team】战队:

赛题设计思路

题目和说明在附件,不知道会不会入选啊。有啥问题可以qq联系我,就是我看雪账号这个qq。
 
写go代码的时会import很多模块。例如fmt模块,里面的代码可以随便改,我就把小数独的代码添加到这些模块里,编译出来就行了。
 
说明:go语言编写
题目是一个简单的四宫格数独:0,3,1,01,0,0,32,0,3,40,4,2,0答案是:按顺序从左到右、从上到下填入数字就行4224131
提示success就表示成功

赛题解析

本赛题解析由看雪论坛学者 Ally Switch 给出:

运行程序,随便进行一些输入,根据反馈可以得出:

1、如果输入的不是数字或者长度不为7,则会出现错误的反馈;
2、如果输入长度为7的数字,若不为正确结果,则不会回显。
将程序拖入IDA,发现是Go写的。所以先用Go的反编译插件解析一遍。然后进入main_main查看主要逻辑:

1、最早弹出的提示"请输入7位数字",不在循环内,因此只会在第一次打开程序时提示一次;

2、蓝色方框位于大循环中的第一个小循环里,通过读取输入的字符串,并判断字符串的长度是否为7,否则就会在循环里提示"请输入长度7";

3、橙色方框在一个for循环中对字符串进行校验,若存在数字之外的字符,则会提示"请输入数字";

4、若字符串均为数字,则会在for循环执行结束后,从LABEL_11进入粉色方框。
在前一步中,存在一个问题,按照正确逻辑,当程序进入粉色方框后,fmt_Println_0应该打印出"fail!!!"的提示,但实际并没有任何回显,接下来就看一看这个fmt_Println_0

1、通过与标准库中的fmt_Println比较,可以发现fmt_Println_0多了一大段的校验判断过程。

2、在x64dbg中找到最后一个if的位置,将这里的jne给patch掉,再运行一遍看看情况如何。
3、可以看到提示了"success",也就意味着,输入的flag需要能够过掉上方的校验即可。

1、通过交叉引用,可以找到给变量赋值的地方,发现位于fmt_Print中,也就是打印提示"->"的地方。由于这些变量的地址是连续的,所以可以直接转换为数组来看(默认名为fmt_Abc)

2、此时再来看校验的地方就清晰很多,可以将其转换为一个4X4的矩阵,然后就可以得到如下的逻辑。


这里需要保证,矩阵每行每列,以及框出的4个四宫格的元素之和,必须为10。这里刚好有7个0,而要求输入的字符串刚好是7位数字,所以这里猜测是用输入的7位数字,填充这7个0的位置,从而满足校验。

3、这里通过交叉引用看一下这些原先值为0的位置被哪些地方修改过,最终会发现,在bufio__ptr_Reader_ReadString中有一段用输入字符串给fmt_Abc数组元素赋值的操作,也就验证了之前的猜想。最终,根据4X4矩阵填充的值,可以得到flag字符串为"4224131"

第八题《迷雾散去》正在进行中

👆还在等什么,快来参赛吧!
如何成为一名出色的CTF选手?
*点击图片查看详情
入门-基础-进阶-强化,只需四个阶段!摇身一变成为主力、中坚力量


- End -

球分享

球点赞

球在看

“阅读原文展开第八题的战斗!

文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458447393&idx=1&sn=40d6863bc3e48ca27af92492a0ccabc7&chksm=b18fdeab86f857bd55daede2e6caadd3d092def3029c8d32e38ae62bddea0765cef0f048dca6#rd
如有侵权请联系:admin#unsafe.sh