首页
社区
课程
招聘
[原创]看雪.京东 2018CTF 第十二题 破解之道 Writeup
发表于: 2018-7-9 14:52 4255

[原创]看雪.京东 2018CTF 第十二题 破解之道 Writeup

2018-7-9 14:52
4255

运行情况如下:

看来是命令行参数的形式输入,并且有错误信息。

入口是经典的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函数为strchr14000E46C函数为strcat。因为出现.dll必然是拼接dll文件名嘛(看到此处惊出一身冷汗,难道此题里还藏有dll?)。

主要操作就是把输入用'9'进行分段,猜测程序输入一共三段,第一段已经校验,最后以9结尾,此操作最后把最后的9替换成了\x00。所以flag格式为KXCTF20189xxxxxxxxx9xxxxxxxxx9

但是这flag形式也不是绝对的,只是想的最简单的一种,再结合dll名只取了5字节,那有可能是KXCTF20189xxxxx9xxxxxxxxxxxxx9。但是如果中间的9前面或(和)是最后9后面添加了几个未参加单独检验的字节,最后靠输入的hash跑来肯定也有可能的。所以后两个9的位置未定。初步只能假设KXCTF20189xxxxx9xxxxxxxxxxxxx9的形式来简化求解。

下面代码不太容易看也看不明白。需要上动态了。

用前面的flag形式作为输入只要手动过了全输入串的hash检查就可以继续往下了。具体过程不说了。
1400053C6处附近是获取LoadLibraryapi地址(至于GetModuleHandleA那条路似乎是走不通的);14000548B处是加载拼接的dll;140005516处是获取GetProcAdressapi地址;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!SoftpubCleanupntdll!DbgUiContinueDbgUiContinue确实是13字节,为什么上面没有跑出结果呢。苦苦思索不得其解,就放着了。

后来想到dll名可能是大写。尝试一下,check通过。

所以最后的flag为KXCTF20189NTDLL9DbgUiContinue9


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
2
你这从wintrust都能搞出事情,也是独秀了
2018-7-10 18:54
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
3
ccfer 你这从wintrust都能搞出事情,也是独秀了
没办法,开始没注意dll名大小写问题,跑不出函数,还以为有其它东西。就跟了进了别的路径看有什么信息。
2018-7-10 20:58
0
游客
登录 | 注册 方可回帖
返回
//