-
-
[原创]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
表示字符串的fnvHash
,fnvChr
表示由传入的单一字符组成的字符串的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
),如下:
得到key
为KXCTF20189NTDLL9DbgUiContinue9
,经验证正确。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!