静态分析的时候发现了很多关于0o这样的字符串
其中还利用了zlib1.dll这个动态链接库,但是我给几个可疑的函数下了断点之后都没断下来只能进行动态调试了根据动态调试可以定位到函数sub_7FF694547A20我们注意到它是switch分支结构,可以在以下这个地方下个条件断点方便我们打印case的情况
经过运行之后追踪如下:我们可以发现它调用了3次同样的case既然是验证的程序肯定有输入的地方,通过对case 0下断点进行调试后发现这个函数输出了以下内容并且还获取我们输入的flag其中sub_7FF69455EB8E是单个字符输出'F' 'l' 'a' 'g' ':',sub_7FF6944F90E0是输出了字符串我们发现case 1,2,3都是设置跳转的作用,其中*(int *)(a1 + 4708)是个全局变量,应该是设置次数经过分析与trace可知加密函数应该是在case5 case6 case8 case7 case9首先先设置了128个字节的0x2,经过动调测试它是读取了16个字节并且拓展为了128个字节,其实就说单字节转化为二进制,然后每个二进制位都作为一个字节写入内存中,其中0x0->0x2 0x1->0x3这一部分貌似是一种多线程对我们经过拓展后的字节进行处理,反正单步调试的很懵逼,但是这并不影响咱们之后的逻辑分析*(_DWORD *)(a1 + 4576)同样作为全局变量也是计数
这个case就是将我们处理之后的结构与固定的加密数据进行比较case4就是我们的check,其实他就是设置了v13这个布尔值来判断我们前面case9中的全局变量是否为42,如果为42就输出Correct!,否则就是Wrong由于我们最后的check逻辑可以得到我们的flag的长度为42,并且加密逻辑为字节拓展->一些其它的处理->16字节加密完的结果进行check,如果正确就存到全局变量里面,然后最后再进行判断。
一开始我以为是单字节加密,但是测试之后发现并不完全是他会影响相邻字节,我选择插桩做法,由于windows平台并没有pintools这样的插桩工具,我们可以使用Frida进行测试。
我们选择以下这个位置进行插桩:frida脚本:效果如下:
然后我们就可以利用subprocess+frida写个rpc脚本进行爆破,这个字符集是经过测试之后写的,差不多10分钟就可以爆破完。这个方法是之前做题的时候没有试出来的方法(主要是字节patch的时候多加了空格结果没有patch成功 QWQ),就是在case4的地方直接进行patch,从而能让验证正确的长度打印出来从来进行逐个单字节爆破。
将case4的前面patch成下面这样实现效果如下:
利用subprocess或者pwntools这种交互式进行逐字节爆破,速度比上面的rpc更快char __fastcall sub_7FF694547A20(__int64 a1)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288360.htm
[原创]看雪 2025·KCTF 第十题 涅槃,亦是新生
289 浏览
0 回复
暂无回复,快来抢沙发吧!