-
-
[原创]2018看雪CTF第十二题WP
-
发表于: 2018-7-10 01:06 3211
-
直接打开CM,程序闪退。用命令行打开,CM会输出一句话然后退出。
原来要用命令行参数的形式输入flag。(IDA调试时,在Debugger->Process Option->Parameter处输入)
随便传了一个flag,回显失败就退出了。
main函数中:
sub_14000E55C作用是把我们输入的flag(argv[1]指向的)复制到全局变量key处。
第二个call是验证函数。
这里值得一提的是,else分支中有大量的垃圾代码(验证函数中也有大量的垃圾代码,其实是一些常量经过各种变换,生成另一些常量,作用是阻挠分析,分析时需要无视它们),比如以下:
由于是静态链接的运行库,还有大量的垃圾代码。验证函数静态并不好分析。我采用的是猜测加上调试来验证的方法。
下面是几个关键的判断(已去除了参杂其中的垃圾代码):
flag长度为30:
flag至少有3个'9'(比较的是字符的hash值):
这里用了一个hash函数(后面的判断中也被多次用到):
flag由'KXCTF2018'开头(也是用的hash函数来比较):
整个flag的hash值(此处调试时无法判断,需要手动设置EIP绕过):
第一个'9'后面5个字符连接上'.DLL'为part1:
第二个'9'和第三个'9'之间的部分为part2:
最后的验证(伪代码表示,CM中是通过PEB来获取这些函数的地址的):
利用hash(flag)==0x4F8075587499C0FF来穷举:
这里比较坑。。。
1、CM中没有限定分隔符9的位置,穷举空间太大,我只能假设3个9把剩下的21的字符恰好分成2部分,第一部分长度为5,第二部分的长度为13。
2、dll名称的大小写不确定,比如GetModuleHandle("nTdlL.dll")也是能成功返回的。根据连接串'.DLL'为大写再次假设dll的名称(前5个字符)为大写的。
代码如下:(其中export文件为提取出来ntdll的导出表)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课