首页
社区
课程
招聘
[原创]KCTF2022春季赛 第七题 一触即发
2022-5-24 10:48 8692

[原创]KCTF2022春季赛 第七题 一触即发

2022-5-24 10:48
8692

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"

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞6
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回