首页
社区
课程
招聘
[原创]看雪6月 京东 2018CTF 第十二题——在纸老虎的海洋中寻求破解之道
发表于: 2018-7-8 22:55 3296

[原创]看雪6月 京东 2018CTF 第十二题——在纸老虎的海洋中寻求破解之道

2018-7-8 22:55
3296

一道纸老虎的题目,关键校验函数F5出来有2k多行,看起来可怕难逆,实际上很多没用的代码,解题关键在于定位有用的代码。

随便翻一下发现0x140002E00这个函数很像关键校验函数,F5一看,很可怕,2400多行。xref一下,发现调用他的很可能是main函数,动态调试发现的确是(通过命令行参数识别,这题输入是命令行参数)。再看看校验函数,一开始觉得这题估计做不出了。(做题靠猜233)

(话说IDA没法自动识别64位PE的main函数的吗?还是做了混淆?)

看了一下加上动态调试发现0x14000E55C很可能是一个strcpy函数

然后main函数如下

strcpy会把输入复制到一个全局变量,然后check会去访问它,并且校验。

回到看起来很难逆check函数,思路是,不可能一行行逆这个东西,要找关键代码,即,它在哪里访问了输入,怎么访问的?说的高端点,叫做静态污点分析。

那么直接定位到访问input的地方,首先我看到的是这个:

很有可能是一个校验,动态调试也发现input并未被改变,那么逐字节爆破

得出答案为KXCTF2018,试一下发现不对(怎么可能这么简单

接下来看到的是一个疑似长度的校验

看起来很复杂的操作,但是稍微看一下加上动态调试一下的话,就能发现这是在检查长度为30

紧接着看后面的代码,又访问了input

大概逻辑是,满足sub_140002AC0((char*)(&j)) == -5808600853619038060i64的,要有3个以上。

同样爆破一下

结果为9

整个input的hash(sub_140002AC0貌似是一个hash函数,但是又没有雪崩效应)的检查,很明显现在条件不足。

其实到现在为止,还并没有找到爆破点,只是一直在“猜”。因为一般来讲,一个判断,更加复杂(明显有更复杂的代码)或者更难到达(比方说等于情况,任意输入一般都是不等于的可能性要更大)的一条路径,是正确答案所需要被走到的。前面几个check,也是根据这个“猜”的。

现在走下一个check,

其中这些函数的识别,肯定不是通过静态逆向,点进去发现一堆SSE就能吓跑人了,识别是通过猜+调试。

然后这刚好对应大于3个9的check,说明应该没逆错。

其中有个strcat把.DLL加在后面,难道是把输入作为一个dll名?看了一下发现题目并没有给出dll附件。

那么继续看先吧,看看这两个参数是怎么被用的。这后面又有大量的代码,不管它们,用xref。发现一个调用

函数地址貌似是动态生成的,猜测这是一个LoadLibrary函数,x64dbg一看,果然是。

然后proc_name的下一次被使用(当然现在还不知道是proc_name

动态调试,发现call的函数是GetProcAddr。然后critical是关键,动态调试改eflags发现后面如果critical<0,可以显示正确信息。而如果GetProcAddr返回NULL,else分支中永远会产生>=0critical值,所以明显是要给个能用的dll名和相应的函数名,使得其调用返回负数。

所以flag大概应该是KXCTF20189AAAAA9XXXXXXXXXXXXX9

但是,windows的API,一般都是返回0或正的,错误返回负那是Linux的API。这里我又卡了很久,想了好多种方法,最后决定还是猜一猜。首先dll名要是5的长度,第一个想到的就是ntdll.dll,然后去System32目录下找,发现还有一个是wow64.dll,其他的感觉有点偏,应该不会用上(目前先这么猜

然后把所有长度为13的导出函数弄下来,我用的是IDA(LordPE啥的并没有办法复制。。。

然后通过check 4的那个hash值,来判断。(就先不管负不负了


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-7-8 23:03 被holing编辑 ,原因: 错别字
上传的附件:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//