首页
社区
课程
招聘
[原创]CTF2018第十二题分析(qwertyaa)
发表于: 2018-7-8 20:56 2918

[原创]CTF2018第十二题分析(qwertyaa)

2018-7-8 20:56
2918

这题相对前面几题简单不少,做题完全靠猜...

这是一个64位的程序,所以我们直接用IDA64分析。启动一遍程序可知:该程序的密钥由argv[1]给出。于是定位GetCommandLineA/W,跟几步就可以到达main函数。

这个程序将命令行输入复制到一个全局变量处(记作key),接下来调用一个函数判断key是否正确。

由于这个判断程序有点花,我把程序F5结果复制下来,主要看出现key处及其前后几行的逻辑。

其中,经常出现两个magic number(0xCBF29CE484222325i64和0x100000001B3i64),查询百度可知这里在计算fnvHash(这就是vc-x64标准库中std::hash的算法),计算函数如下:

几经分析,可猜测这个key主要满足以下条件(fnvStr表示字符串的fnvHashfnvChr表示由传入的单一字符组成的字符串的fnvHash):

前9字节的hash都已给出,所以我们枚举所有字符并将它们的hash值与给出hash比对就可以得出这一部分的正确值。暴力程序如下(defs.h位于ida的plugins目录下,这个程序顺便计算出条件2所需的字符为9):

运行可知前9字节为KXCTF2018

接下来这个key的剩余部分除了还有三个9外似乎只能猜出来。

首先,出于简单考虑,我们不妨假设所有{possibleSuffix*}为空。(最后事实也如此)

system32目录下一番摸索后我找到一些相对可疑的dll:

imm32.dll
mmres.dll
msctf.dll
ole32.dll
psapi.dll
ntdll.dll

显然ntdll.dll是其中最可疑的,我把它的所有导出函数都存到一个*.h文件中。格式如下:

需要注意的是Win下的文件系统是大小写不敏感的,结合后面补的.DLL可以猜测前面应该是全大写的NTDLL

所以我们可以写一个暴力程序(其中{symBolName}的长度即30(总长)-9({prefix})-3(分隔用的9)-5({dllName})=13),如下:

得到keyKXCTF20189NTDLL9DbgUiContinue9,经验证正确。

 

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

最后于 2018-7-8 21:08 被qwertyaa编辑 ,原因: 校对
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//