运行情况如下:
看来是命令行参数的形式输入,并且有错误信息。
入口是经典的VC代码:
只不过这个sub rsp;add rsp
是那个哪个版本的VC,还是因为是64bit的是这样。
直接找出main
函数,其主要代码结构如下:
先判断是否带一个参数运行,如果不是就在else
里执行一大串的算术计算,最后打印程序运行形式信息;如果是,则将参数copy到全局变量中,进入140002E00
函数进行校验。
校验函数代码量比较大,大致拉了下伪代码的滚动条,里面也有非常大量的算术计算。直接追踪保存着输入的全局变量g_input
。
第一次引用g_input
是在1400033A6
:
是在计算输入的长度,后面紧接着对长度值进行一些计算,然后在140003458
检查长度值计算结果,实际就是检查长度为30,其它的计算是冗余代码。
紧接着是第一次引用。
检查输入长度不为0,然后以64bits的FNV_hash
算法分别计算输入各字节的hash值,并与常量0xAF63B44C8601A894
比较,并累加正确次数,再在hash全部计算完后检查正确次数不小于3。
可以跑下这个hash,真实是计算输入中9
的个数:
再下面又是大量计算与赋值,不过与输入没有直接关系,跳过。来到140003F2A
。代码不贴了,有点多。这里是还是用64bitsFNV_hash
算法分别计算输入前9字节的hash值,并与分别与9个常量比较,正确与否影响一个局部变量值,此局部变量参与下面的计算,影响流程。上脚本,上面已经有了单字符的hash表,跑出来结果为KXCTF2018
:
再次跳过计算,来到1400044BD
。此处又再一次地用了64bitsFNV_hash
算法计算并检验全部输入的hash值为0x4F8075587499C0FF
。
再下面就很难看了,有些9
、.dll
的常量和32bits的FNV_hash
算法计算。
虽然难看,但在140004FAB
处,结合此处的9
、.dll
,还是能猜出此部分的两个函数调用:14000BDD8
函数为strchr
,14000E46C
函数为strcat
。因为出现.dll
必然是拼接dll文件名嘛(看到此处惊出一身冷汗,难道此题里还藏有dll?)。
主要操作就是把输入用'9'进行分段,猜测程序输入一共三段,第一段已经校验,最后以9结尾,此操作最后把最后的9替换成了\x00
。所以flag格式为KXCTF20189xxxxxxxxx9xxxxxxxxx9
。
但是这flag形式也不是绝对的,只是想的最简单的一种,再结合dll名只取了5字节,那有可能是KXCTF20189xxxxx9xxxxxxxxxxxxx9
。但是如果中间的9
前面或(和)是最后9
后面添加了几个未参加单独检验的字节,最后靠输入的hash跑来肯定也有可能的。所以后两个9
的位置未定。初步只能假设KXCTF20189xxxxx9xxxxxxxxxxxxx9
的形式来简化求解。
下面代码不太容易看也看不明白。需要上动态了。
用前面的flag形式作为输入只要手动过了全输入串的hash检查就可以继续往下了。具体过程不说了。
1400053C6
处附近是获取LoadLibrary
api地址(至于GetModuleHandleA
那条路似乎是走不通的);14000548B
处是加载拼接的dll;140005516
处是获取GetProcAdress
api地址;14000554D
处是从刚加载的dll中获取以第三部分输入为名的函数api地址;14000557E
处是调用新获取到api。这里除了GetProcAdress
的,其它api的获取都是通过PEB取得模块基址,再枚举函数名并用32bits的FNV_hash
值确定的。
上面是正确的流程,我整理下:
加载5个字节名字的dll,我们的第一反应是ntdll.dll
,如果输入没有其它未单独校验的字节,那剩下的13字节就是函数名。
我dump出了ntdll的所有导出函数并挑出13字节的函数,进行了枚举,结果就是没结果。又尝试其它能调用返回负数的函数,字节数不够的进行爆破跑,还是没有结果。
于是我又跟踪了下如果取dll函数地址失败的路径。其流程与上面类似,只不过加载是wintrust.dll
,获取的函数名为SoftpubCleanup
。
搜索了下,查到这个文章https://bbs.pediy.com/thread-221970-1.htm,讲windows签名劫持的。里面提到了可使用的劫持函数wintrust!SoftpubCleanup
和ntdll!DbgUiContinue
。DbgUiContinue
确实是13字节,为什么上面没有跑出结果呢。苦苦思索不得其解,就放着了。
后来想到dll名可能是大写。尝试一下,check通过。
所以最后的flag为KXCTF20189NTDLL9DbgUiContinue9
。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)