首页
社区
课程
招聘
[原创]360比赛第3题-我的解法
2008-12-20 12:38 37739

[原创]360比赛第3题-我的解法

2008-12-20 12:38
37739
这题比较简单,大牛们不愿意发,我来发一下我的解法。
第3题—注册表保护挑战题

驱动加载后,创建一个内核态线程( driver-created thread)

0001054A xor eax, eax
0001054C push eax ; StartContext
0001054D push offset StartRoutine ; StartRoutine
00010552 push eax ; ClientId
00010553 push eax ; ProcessHandle
00010554 mov [ebp+ObjectAttributes.RootDirectory], eax
00010557 mov [ebp+ObjectAttributes.ObjectName], eax
0001055A mov [ebp+ObjectAttributes.SecurityDescriptor], eax
0001055D mov [ebp+ObjectAttributes.SecurityQualityOfService], eax
00010560 lea eax, [ebp+ObjectAttributes]
00010563 push eax ; ObjectAttributes
00010564 push 1F03FFh ; DesiredAccess
00010569 lea eax, [ebp+ThreadHandle]
0001056C push eax ; ThreadHandle
0001056D mov [ebp+ObjectAttributes.Length], 18h
00010574 mov [ebp+ObjectAttributes.Attributes], 200h
0001057B call ds:PsCreateSystemThread


线程的执行体为:

000104C8 ; void __stdcall StartRoutine(PVOID)
000104C8 StartRoutine proc near ; DATA XREF: sub_10542+B o
000104C8
000104C8 ObjectAttributes= OBJECT_ATTRIBUTES ptr -2Ch
000104C8 DestinationString= UNICODE_STRING ptr -14h
000104C8 Interval = LARGE_INTEGER ptr -0Ch
000104C8 Handle = dword ptr -4
000104C8
000104C8 mov edi, edi
000104CA push ebp
000104CB mov ebp, esp
000104CD sub esp, 2Ch
000104D0 or dword ptr [ebp+Interval+4], 0FFFFFFFFh
000104D4 push esi
000104D5 push offset SourceString ; "\\Registry\\Machine\\System\\360game"
000104DA lea eax, [ebp+DestinationString]
000104DD push eax ; DestinationString
000104DE mov dword ptr [ebp+Interval], 0FECED300h
000104E5 call ds:RtlInitUnicodeString
000104EB xor esi, esi
000104ED lea eax, [ebp+DestinationString]
000104F0 mov [ebp+ObjectAttributes.Length], 18h
000104F7 mov [ebp+ObjectAttributes.RootDirectory], esi
000104FA mov [ebp+ObjectAttributes.Attributes], 240h
00010501 mov [ebp+ObjectAttributes.ObjectName], eax
00010504 mov [ebp+ObjectAttributes.SecurityDescriptor], esi
00010507 mov [ebp+ObjectAttributes.SecurityQualityOfService], esi
0001050A
0001050A loc_1050A:
0001050A push esi ; Disposition
0001050B push esi ; CreateOptions
0001050C push esi ; Class
0001050D push esi ; TitleIndex
0001050E lea eax, [ebp+ObjectAttributes]
00010511 push eax ; ObjectAttributes
00010512 push 0F003Fh ; DesiredAccess
00010517 lea eax, [ebp+Handle]
0001051A push eax ; KeyHandle
0001051B call ds:ZwCreateKey
00010521 test eax, eax
00010523 jl short loc_1052E
00010525 push [ebp+Handle] ; Handle
00010528 call ds:ZwClose
0001052E
0001052E loc_1052E:
0001052E lea eax, [ebp+Interval]
00010531 push eax ; Interval
00010532 push esi ; Alertable
00010533 push esi ; WaitMode
00010534 call ds:KeDelayExecutionThread
0001053A jmp short loc_1050A
0001053A StartRoutine endp


    该线程的作用是通过不断的循环,来创建HKEY_LOCAL_MACHINE\System\360game这个键值,并没有其他的保护删除的措施。

    根据题目要求“程序只能运行于用户态,不能以任何形式直接执行RING0代码或修改RING0的内存”;那么我们只有在RING3下将上述的StartRoutine线程挂起,然后就可以直接删除了。
    原理很清楚,实现就比较简单了,先找到系统的system进程,再找到其中的StartRoutine线程,然后将其挂起,之后将可以直接删除HKEY_LOCAL_MACHINE\System\360game这个键值了,详细实现见代码。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (15)
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
XSJS 2008-12-20 12:58
2
0
好思路!!!!学习!!
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
XSJS 2008-12-20 13:00
3
0
想问下是怎么判断循环中遇到的线程就是从StartRoutine开始执行的那个线程?
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
qihoocom 9 2008-12-20 14:35
4
0
呵呵 写suspend做法的基本都是抄看雪腾讯比赛的吧

这题本来是不允许SUSPEND线程的,只是为了降低难度,所以去掉了这个限制
你找线程的那个方法是非常不通用的 ,不是很好

那么现在已知的答案有四种:
1.suspend法
2.vol key法
3.直接HIVE法
4.hive替换法

目前选手做出来的只有前三种
雪    币: 1122
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
DiKeN 5 2008-12-20 15:06
5
0
我没准备回复
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
nevergone 3 2008-12-20 23:21
6
0
偶也想过suspendthread法
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wdsm 2008-12-21 11:29
7
0
郁闷!!我的suspend方法怎么失败了呢?早知道通讯比赛里面有这个方法我也去看一下咯。 我只会hive方法,以为hive方法评委不推荐用,导致这题居然没做!悔不该当初。。。
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2008-12-21 12:54
8
0
我第一反应就是用Suspend法,不过我真不知道那个看雪什么比赛上用过~~~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
醉梦红楼 2008-12-21 15:11
9
0
[QUOTE=;]...[/QUOTE]
楼主很好很强大啊
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
qihoocom 9 2008-12-21 21:04
10
0
suspend法没什么。只是做成地址低16位比较就比较XX TX了~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
凉水冰凉 2008-12-21 22:02
11
0
王姐姐 你太牛啦
雪    币: 1252
活跃值: (510)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
zhujian 2 2008-12-21 22:48
12
0
pSystemProc = (PSYSTEM_PROCESSES)lpSystemInfo;
        while(pSystemProc->NextEntryDelta != 0)
        {
                 if(pSystemProc->ProcessId == dwPID)  //为什么不用NtQuerySystemInformation 里获得的 ProcessName 比较是不是"System"进程.

而是用 CreateToolhelp32Snapshot 便利进程获得"SYSTEM"进程ID,然后
用NtQuerySystemInformation获得的信息链表再与 CreateToolhelp32Snapshot获得的进程ID比较呢呢。

NtQuerySystemInformation 难倒这个的功能不够强大一定要CreateToolhelp32Snapshot一起辅助。
小鸟,我认为NtQuerySystemInformation 足够了啊。看不懂,请大师指点。睡不着啊,在线等。

好不容易编译通过啊。下载最新sdk  + ntdll.h + ntdll.lib
(http://bbs.pediy.com/attachment.php?attachmentid=17289&d=1219225831)

代码有一处明显错误,导致编译不过。调用这个函数NtQuerySystemInformation的两个地方
,全部要改成pfNtQuerySystemInformation

-------------------------------------------------------------------------------
调试到半夜,发现 ScanProcess  函数用 CreateToolhelp32Snapshot 去获得"SYSTEM"的进程ID是多余的。
ScanProcess 这函数可以不要 。
SpeciProcess 这个函数就可以它的所有的事情。只要在SpeciProcess函数
        while(pSystemProc->NextEntryDelta != 0)
        {
               

                if(pSystemProc->ProcessId == dwPID)   //  只要在这里加进程名判断就可以。但搞不懂楼主意图。
                {                                                             //或者有什么深层的意思是我不懂的。请教论坛的高手,我也学习下。

                        for(ulIndex = 0; ulIndex < pSystemProc->ThreadCount; ulIndex++)
                        {
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
windsun 1 2008-12-22 08:55
13
0
NtQuerySystemInformation是在NTDLL.H中直接申明的,否则应采用pfNtQuerySystemInformation来调用。

后面的可以简化。
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wping 2008-12-22 09:39
14
0
请问 楼主 :
如何才能发现这个线程呢 用工具 还是  什么东西  ???
雪    币: 1252
活跃值: (510)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
zhujian 2 2008-12-22 12:16
15
0
应该是ida
雪    币: 44
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bozer 2008-12-24 14:45
16
0
ProcessExplorer就能看到该线程
游客
登录 | 注册 方可回帖
返回