首页
社区
课程
招聘
[原创]吾爱破解2016安全挑战赛第二题Windows驱动
发表于: 2016-4-7 15:51 14856

[原创]吾爱破解2016安全挑战赛第二题Windows驱动

2016-4-7 15:51
14856

这道题目当时没有太多时间做,只做到了题目的前2个要求就提交了,想着看能不能混个52pojie论坛帐号。前几天去腾讯面试,刚好和面试官讨论到这个题目,面试官给了些新思路,这几天有点时间就做了下。水平有限,文中若有错误,欢迎大家指出。

1.题目详情

编写一个适用于Windows XP及更高版本系统的驱动,要求对于所有A目录下形如A\B\C.exe的程序在运行时,每1秒钟正确输出一次其包括程序名在内的进程完整路径。
其中A代表一或多级的根目录,B代表一级子目录,C.exe为程序完整文件名。

测试步骤及结果:
1、首先手动启动A\B\C.exe,正确输出进程的完整路径。
2、保持进程运行,然后手动将程序名C.exe修改为任意D.exe后,可正确输出改名后的进程完整路径A\B\D.exe。
3.、手动结束进程,并尽快手动将程序所在的目录名B修改为任意E后再启动该进程,可正确输出改名后的进程完整路径A\E\D.exe。

要求以上步骤中驱动均使用同一种方法获取进程路径信息,且除监控A目录下的进程启动外,驱动不可动态监控以上步骤中的任何手动操作或系统行为

2.关于进程路径

应用层可以调用GetProcessImageFileName这个API来获取路径。这个API的内部实际调用的是功能号为0x1b的NtQueryInformationProcess,NtQueryInformationProcess会查看进程的
EPROCESS->SE_AUDIT_PROCESS_CREATION_INFO->OBJECT_NAME_INFORMATION
,如果有值,那么直接拷贝过去,如果没有值,那么会调用ObQueryNameString查询EPROCESS->SECTION_OBJECT->SEGMENT_OBJECT->CONTROL_AREA->FILE_OBJECT,查询到后会存放在这里供后续的请求。

很明显,要达到题目要求的第2点,我们不能直接调用ZwQueryInformationProcess,因为EPROCESS里存放的路径并不会随着文件重命名而更新。那么我们能不能每次自己调用ObQueryNameString来查询EPROCESS里存放的FILE_OBJECT呢?这样就可以绕过EPROCESS缓存进程路径了,毕竟文件改名,文件系统是一定知道的。题目不会那么简单,重点在于题目的第3个要求。

3.哪里出现问题了

先上一张图:


可以看到PCHunter也有这个问题,也就是说EXE运行一遍后,关闭EXE,把EXE所在目录改个名字再启动EXE,PCHunter获取到的路径会是重命名之前的路径(已经刷新进程列表)。如果你ObQueryNameString查询进程的EPROCESS里存放的FILE_OBJECT就会出现跟PCHunter一样的情况,文件名会跟着变化,但是文件路径却还是原来的。那么难道是ObQueryNameString出现了问题?

实际上,一个EXE关闭后再启动,虽然进程的EPROCESS的地址变了,但是EPROCESS里存放的FILE_OBJECT却还是原来的。系统并不会因为EXE关闭就马上释放掉EPROCESS里存放的FILE_OBJECT,系统会缓存这个FileObject,下次进程启动,它还会把这个FileObject放在这个进程的EPROCESS里。翻了翻WRK的代码,ObQueryNameString内部实际是从FileObject对象头里存放的查询函数指针来查询的,而这个查询函数最终还是会发送IRP给文件系统驱动去查询。那么是文件系统的原因吗,给定FileObject查询出来的文件名路径会是错的?

4.文件名在哪里

FILE_OBJECT有2个重要的域,FsContext和FsContext2,FsContext实际是FCB/SCB(文件控制块/流控制块,分别对应于FAT文件系统和NTFS文件系统),同一个文件/文件流,可以有多个FileObject,但是这些FileObject指向的的FCB/SCB都是同一个。FCB/SCB里存放的是特定于这个文件/文件流的一些信息。另一个域FsContext2实际是CCB(ContextControlBlock),这个是特定于FileObject的,也即是每个FileObject都有属于自己的CCB。为了弄清楚到底是哪里出了问题,特意下载了一份泄漏的ntfs文件系统代码。翻了下,发现文件流的文件名是存放在CCB里的。如下图:

调试发现,启动EXE再关闭,然后改掉EXE所在的目录名再启动EXE后,2个EPROCESS里存放的FileObject是同一个。而这个FileObject的CCB里存放的文件全路径并不会更新路径而只会更新文件的名字。那么问题就清楚了。对于FAT32文件系统,它的文件名是存放在FCB(FileObject->FsContext)里的,同一文件的不同FileObject是共享FCB的,这里面存放的文件名是即时更新的。也就是说对于FAT32文件系统,只要查询EPROCESS里存放的FileObject就可以达到题目的3个要求。那么对于NTFS文件系统,该怎么解决这个问题呢。因为系统会缓存EXE的FileObject,而且这个FileObject的CCB里存放的全路径不更新路径名怎么办呢,能不能自己再创建一个FileObject呢?可是要FileObject得知道进程文件路径,然后ZwOpenFile才可以。这貌似成了一个鸡生蛋的问题了。去北京腾讯面试,面试官恰好给了我一点新思路,那就是文件ID。

5.文件ID

文件ID这个在MSDN里面并没有太多资料,只是在介绍ZwCreateFile的CreateOptions参数的时候提及了一个FILE_OPEN_BY_FILE_ID标记,而且说了FAT文件系统并不支持这个标记。文件ID是一个8个字节的整数,可以唯一的索引到这个文件。文件ID不会随着文件改名而变化,它会一直不变直到文件被删除。那么问题的解决思路就来了,首先通过EPROCESS里存放的FileObject来查询这个文件的文件ID,再根据文件ID来打开这个文件拿到一个新的FileObject,这个FileObject的CCB里的文件名肯定是最新的,调用ObQueryNameString就可以查询到了。

6.文件ID的获取

status = IoQueryFileInformation(FilePointer,
			FileInternalInformation,
			FileIdLen,
			&FileIdInfo,
			&FileIdLen);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 4
支持
分享
最新回复 (22)
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
……我也是搞不了第三个要求……也是想到了鸡生蛋蛋生鸡的问题……

我甚至去暴力搜了内存……发现系统里面确实没有地方有全路径了,有一个,是原子表那里,没有太细致研究,但是应该不能满足第二个要求

折中的想法是ControlArea->u.Flags.DeleteOnClose = 1,好像可以在重新打开进程的时候重新创建这玩意,没怎么试过……不过还是不能满足先改进程再开驱动这个隐藏要求……唉……原来还有文件ID这个东西,我记得以前在哪看到过……第八个男人?
2016-4-7 16:10
0
雪    币: 126
活跃值: (651)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
哈哈,对啊,提交了代码又给邮箱发个隐藏要求,我知道文件ID这个玩意,但是当时还没搞明白整个流程是哪里出问题了,还以为是ObQueryNameString出问题了。
2016-4-7 16:14
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你没有用文件ID之前有别的办法满足第三个要求么……就是满足第三个要求但是不满足隐藏要求的……
2016-4-7 16:20
0
雪    币: 126
活跃值: (651)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
可以试试你的 ControlArea->u.Flags.DeleteOnClose = 1,这个难道会每次EXE启动都有一个不同的FileObject? 不过话说回来,FILE_OBJECT往里面深挖,肯定能拿到文件路径,不过SCB,FCB,CCB,LCB等等结构都不公开。兼容性稳定性难以保证。
2016-4-7 16:27
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是看到了这个帖:
http://bbs.pediy.com/showthread.php?t=114943

(注:文件关联的控制区对象在一个应用程序执行完退出之后,仍然会保存在操作系统中,对应的PE文件头数据也保留在相应的物理内存页面上。操作系统这样处理,也是为了在频繁启动一个应用程序时提高效率。这也会造成一些意想不到的问题,比如对一个运行中的程序,用冰刃等工具(或直接写驱动程序)打开其虚拟地址空间,对其中的文件头部分的关键数据,如:MZ标志头、PE标志头进行篡改并进行回写(如果用冰刃修改并写入时,弹出“是否防止copy-on-write”选择框时,要点击“是”,才能真正修改到系统保留的PE头数据内存页),然后关闭掉该程序,对应的EXE文件本身没有被修改,但直接运行就会报非法PE格式错误。究其原因就是因为之前打开此程序时,留在系统中的全局控制区对象和PE文件头数据仍然存在,操作系统将直接用原来的全局控制区对象和PE文件头数据,结果就会检查到非法的PE文件格式错误。)


其实我刚看到题目找资料的时候就看到这个帖子了,但是我觉得可能我要看很久而且万一没用就浪费时间拉……依旧发挥了我每逢考试前看到题型都觉得那是没用的错觉……哈哈哈哈,看到的时候已经过时间啦……
2016-4-7 16:34
0
雪    币: 615
活跃值: (580)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
我就想,注册个回调不就搞定了吗? PsSetCreateProcessNotifyRoutineEx  原来这个是隐藏要求
2016-4-7 17:38
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
8
这题比较有意思 如果没有限制必须使用同一种方法  第三个路径直接从PEB里拿
2016-4-7 17:45
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
那题PEB里我测试成功了,但是为了要监视那个目录,又不能用minifilter等一些监控技术,我开的是系统线程,这样就会崩溃了,然后我还是没做第三题,也是上交了2个要求,感谢楼主分享,学习了
2016-4-7 18:57
0
雪    币: 2291
活跃值: (938)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
这道题我也是用文件ID在最后时机解出来了。不过花时间太多,后面Win10注入那道题时间不够,匆匆提交。
2016-4-7 19:36
0
雪    币: 126
活跃值: (651)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我看兄台做了好几道题目啊,看来15W奖金有望啊,哈哈。我就随便做着玩。
2016-4-8 09:19
0
雪    币: 2291
活跃值: (938)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
千万别这么说,评委们看到都笑话了。逆向题算法分析太菜,没搞出来。
2016-4-8 09:51
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
很不错,思路优雅, 问题也分析得比较清楚。
2016-4-8 09:54
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
XXB的方案肯定是不合适的,file id算一个比较优美的解法
2016-4-8 09:55
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
前排膜拜MJ,还有没有别的思路呢~
2016-4-9 19:42
0
雪    币: 4928
活跃值: (967)
能力值: ( LV9,RANK:175 )
在线值:
发帖
回帖
粉丝
16
小白学习了,原来还可以这样
2016-4-10 13:25
0
雪    币: 799
活跃值: (457)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
17
赞,之前看到第三个问题时一时想不通到底为什么会导致这种情况
2016-4-10 14:37
0
雪    币: 126
活跃值: (651)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
看我说的准吧,发奖了啊,你Windows二等奖,1W现金!
2016-4-12 16:56
0
雪    币: 2291
活跃值: (938)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
19
真正大牛都没参赛或没来得及参赛或者在当评委,像我们这种刚出道的小菜赚点零花钱

而且跟第一差距很大,还要努力学习啊
2016-4-12 17:18
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
第一名几乎都通杀……真的强……
2016-4-12 17:24
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
21
蚯蚓兄,可以可以的!
2016-4-12 21:58
0
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
22
楼主能给一个ntfs源代码的下载链接么?
2016-4-13 15:58
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
好好搜索论坛

http://bbs.pediy.com/showthread.php?t=90393
2016-4-13 16:21
0
游客
登录 | 注册 方可回帖
返回
//