首页
社区
课程
招聘
[原创]2018看雪CTF第十二题WP
发表于: 2018-7-10 01:06 3211

[原创]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直播授课

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