首页
社区
课程
招聘
[原创]KCTF2024 第二题 星际生物
发表于: 2024-8-17 01:54 4749

[原创]KCTF2024 第二题 星际生物

2024-8-17 01:54
4749

用DIE查看,发现是.net,所以使用dnSpy进行分析
图片描述

将题目拖入dnSpy,搜索栏搜一搜可以找到main函数
图片描述

点进去main,看不太明白,感觉是混淆了
图片描述

使用de4dot解混淆一下,会相对好看一点
图片描述

在main开头部分,会先读取输入的字符串,然后判断长度是否为70位,字符串是否以flag{开头,以}结束。这70位里面有6位是flag{}。因此只需要关注剩下64位
图片描述

之后进入一个循环,从头开始遍历sudoku指向的内存,遍历长度为81字节,每遇到一个字节为0xF,就按照输入字符串的顺序去替换掉0xF。本质上是一个数独,0xF就是数独中空白的部分,然后用输入的字符串依次去填充这些空白
图片描述

接下来有两轮循环,分别用来检测数独行和列的合法性。若不通过,则会清空这里num4或者num5的值
图片描述

若数独合法性通过验证,则会走到最后一步。这一步会对未填入到数独中的字符进行验证。这部分只能填入W、A、S、D。其中W会让b4-1,S会让b4+1,D会让b5+1,A会让b5-1。最后会通过b5+4*b4作为下标来访问数组BY113E中保存的值。前面几次访问时值不能是45,最后一次访问时,值必须是63。若能满足以上条件,即可解出flag

通过循环的长度也可以猜到,这里要输入的WASD字符的数量为8个。因此前面填入数独中字符的数量是56个

图片描述

在数独第一次赋值时下断,可以拿到未填入数据的数独,可以用来初始化一个数独
图片描述

然后解一下这个数独,就可以拿到64位字符串中的前56位(下图中白色部分) 34689155813271746868579324125982187492581517263447389126
图片描述

接下来8位,可以根据条件分支逻辑确定第一位是S。最后一个字符执行后,b5+4*b4的值必须是2。无论是(-2, 1)还是(2, 0),最后一个字符都只能是A。这样确定首尾的字符后,剩下来6位可以倒推回去。或者直接写一个程序爆破,也可得到最终的flag
图片描述

  1. 用DIE查看,发现是.net,所以使用dnSpy进行分析
    图片描述

  2. 将题目拖入dnSpy,搜索栏搜一搜可以找到main函数
    图片描述

  3. 点进去main,看不太明白,感觉是混淆了
    图片描述

  4. 使用de4dot解混淆一下,会相对好看一点
    图片描述


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//