-
-
[原创]看雪.Wifi万能钥匙 CTF 2017 第5题Writeup
-
发表于: 2017-6-11 22:07 3509
-
说是一个驱动题,那肯定要释放文件加载驱动。ida载入,查找writefile
的调用,找到sub_401F20
,再向上找下就发现sub_4013E0
(后来发现直接通过字符串就能找到位置),此函数应该是OnInitDiaglog
的重载函数,驱动就是从这里开始释放安装的,先拼接文件名,申请堆空间,调用sub_401F20
从程序资源里加载驱动并写文件,调用sub_401AA0
安装驱动启动驱动最后删除驱动文件。
于是乎直接使用资源查看软件导出驱动文件,ida加载分析。 驱动初始化过程中注册了这第几个函数
名字我改了,其中control_1071A
作用两个,一个是算法流程控制标志置位,一个是反调试。本来我将此处作了patch,把驱动入口的检验也作了更改,就是过不了检验,不知道为什么,也不知道怎么改,所以我的整个过程,没有完整的动态调试过。
其实驱动真正和程序交互的是read_105A8
和write_1061C
,不知道这两个名是不是和惯例一样,一个是将结果输出给程序,一个是接收程序写入,并作算法运算。
write_1061C
是未变形的md5算法,不用过多分析,只不过在md5算法运算前将输入第0位加1,后面依次加上i(i为字串脚标)。而且这里用了上面说的算法流程控制标志。如置位则进行hash运算,并将输出标志置位。 read_105A8
根据输出标志是否置位分别输出hash结果和定值结果。
再继续往下看程序。
刚才说了驱动和程序的交互方式,所以继续从writefile
或readfile
调用找起,两步就能找到sub_401760
,通过分析,此函数为验证主流程。 主要过程中取输入小写再反序,检查输入为6位,传给驱动,再读回16字节的hash,str2hex,再进行md5计算,结果str2hex,取[2:12]与888aeda4ab
比较。在与驱动交互前也有个DeviceIoControl
调用前面说的control_1071A
,如果驱动不patch,这个调用起了作用,那动态时驱动算法就不计算了,同样输出结果为定值。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课