看雪2022 KCTF 春季赛 | 第七题设计思路及解析

资讯 作者:看雪学院 2022-05-24 18:41:52 阅读:303
看雪 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 给出:


Step1

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

1、如果输入的不是数字或者长度不为7,则会出现错误的反馈;
2、如果输入长度为7的数字,若不为正确结果,则不会回显。

Step2

将程序拖入IDA,发现是Go写的。所以先用Go的反编译插件解析一遍。然后进入main_main查看主要逻辑:

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

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

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

4、若字符串均为数字,则会在for循环执行结束后,从LABEL_11进入粉色方框。

Step3

在前一步中,存在一个问题,按照正确逻辑,当程序进入粉色方框后,fmt_Println_0应该打印出"fail!!!"的提示,但实际并没有任何回显,接下来就看一看这个fmt_Println_0

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

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

Step4

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"


 

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

在线申请SSL证书行业最低 =>立即申请

[广告]赞助链接:

关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

#
公众号 关注KnowSafe微信公众号
随时掌握互联网精彩
赞助链接