-
-
[原创]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
-
用DIE查看,发现是.net,所以使用dnSpy进行分析
-
将题目拖入dnSpy,搜索栏搜一搜可以找到main函数
-
点进去main,看不太明白,感觉是混淆了
-
使用de4dot解混淆一下,会相对好看一点
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]KCTF2024 第九题 第一次接触 2482
- [原创]KCTF2024 第四题 神秘信号 3056
- [原创]KCTF2024 第二题 星际生物 4750
- [原创]KCTF2022春季赛 第九题 同归于尽 13032
- [原创]KCTF2022春季赛 第七题 一触即发 9712