首页
社区
课程
招聘
[原创]第二阶段第二题解答
2007-9-1 19:55 7641

[原创]第二阶段第二题解答

2007-9-1 19:55
7641
1、窗口句柄相关:
1.1 直接向窗口发消息,除了发送WM_CLOSE,还可以发送WM_KEYDOWN,WM_MOUSEMOVE,WM_LBUTTON*,另外还可使用PostMessage等等消息函数:

(方法1) FindWindow("CrackMeApp") -> SendMessage(WM_CLOSE)

1.2 利用模拟键盘输入,首先需要用SetForegroundWindow让这个窗口的线程与RIT进行连接,使用keybd_event输入ESC键。此方法是直接向RIT发送数据,不同于直接向窗口发消息:

(方法2)  FindWindow -> SetForegroundWindow -> keybd_event(VK_ESCAPE)

1.3 利用模拟鼠标输入,首先也需要用让这个窗口的线程与RIT进行连接,然后获取屏幕分辨率和窗口的区域坐标,然后计算出窗口关闭按钮的位置,使用mouse_event移动鼠标和进行点击:

(方法3)  FindWindow -> SetForegroundWindow -> GetSystemMetrics -> GetWindowRect -> mouse_event(MOUSEEVENTF_MOVE) -> mouse_event(MOUSEEVENTF_LEFTDOWN) -> mouse_event(MOUSEEVENTF_LEFTUP)

具体实现的时候,使用了一个循环点击右上角的斜10个点,保证点击到关闭按钮的位置。

2、线程句柄相关:

2.1 通过窗口句柄找到线程ID,然后获取线程句柄,直接调用TerminateThread。

(方法4)  FindWindow -> GetWindowThreadProcessId -> OpenThread -> TerminateThread

2.2 通过窗口句柄找到线程ID,然后获取线程句柄,通过修改线程的上下文来让线程执行ExitProcess,因为大部分情况下窗口的线程是在休眠状态,因此最后调用SwitchToThisWindow来唤醒这个窗口线程。

(方法5)  FindWindow -> GetWindowThreadProcessId -> OpenThread -> SuspendThread -> GetThreadContext(ctx) -> ctx.Eip=ExitProcess -> SetThreadContext(ctx) -> ResumeThread -> SwitchToThisWindow

3. Windows Hook:

3.1 通过SetWindowsHookEx(WH_CALLWNDPRO)插入一个DLL,并用DLL中的CallWndProc替换原来的。只要在DLL中的CallWndProc放入ExitProcess调用即可:

(方法6)  FindWindow -> SetWindowsHookEx(WH_CALLWNDPRO) -> SetWindowLong(GWL_WNDPROC) -> MyWndProc -> ExitProcess

4. 进程句柄相关

首先要开启自身进程的SeDebugPrivilege,从而可以找到csrss.exe进程句柄,并注入DLL,然后从csrss.exe进程中获取CrackMeApp.exe的进程句柄,此句柄具有PROCESS_ALL_ACCESS:

SetSeDebugPrivilege -> EnumProcesses -> EnumProcessModules -> GetModuleBaseName -> GotCSRSS -> InjectDll -> ZwQuerySystemInformation(SystemHandleInformation) -> EnumProcessModules -> GetModuleBaseName -> GotCrackMeApp

SetSeDebugPrivilege通过OpenProcessToken和AdjustTokenPrivileges实现。
InjectDll通过VirtualAllocEx、WriteProcessMemory和CreateRemoteThread实现。

4.1 当通过上面方法获取到进程句柄后,可以直接使用TerminateProcess:

(方法7)  TerminateProcess

4.2 当通过上面方法获取到进程句柄后,可以通过CreateRemoteThread执行ExitProcess:

(方法8)  CreateRemoteThread(ExitProcess)

4.3 当通过上面方法获取到进程句柄后,可以通过WriteProcessMemory修改进程数据:

(方法9)  WriteProcessMemory(0x4025FC)  -> FindWindow -> SwitchToThisWindow

修改0x4025FC的数据为exit的IAT地址0x40321C。如同上面改线程上下文,线程在休眠状态,需要唤醒窗口线程来执行修改后的代码。

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 103
活跃值: (1708)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
TeLeMan 1 2007-9-2 11:53
2
0
5、内核相关:

5.1、恢复SDT:

5.2、patch Crackme.sys:
上传的附件:
雪    币: 103
活跃值: (1708)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
TeLeMan 1 2007-9-2 12:09
3
0
nnd,刚才好不容易都写好了,提交之后居然连不上了,写得内容还没保存

因此先把程序提交,然后再写内容。

5、内核相关:

5.1、恢复SDT:首先使用ZwQuerySystemInformation找到内核文件,然后在该文件中查找KeServiceDescriptorTable,进而找到KiServiceTable的原始NtOpenProcess的地址,然后通过\\Device\\PhysicalMemory设备来修改SDT回到原始数据。

(10) ZwQuerySystemInformation(SystemModuleInformation) -> CreateFile -> ReadFile -> LookUp KeServiceDescriptorTable -> Got NtOpenProcess Index&Entry -> NtOpenSection("\\Device\\PhysicalMemory") -> NtMapViewOfSection -> Restore NtOpenProcess  Orignal Entry -> TerminateProcess

5.2、patch Crackme.sys: 因为Driver得地址空间在R3下很难准确定位到一个物理地址。因此采用代码搜索的方式,来在物理内存中查找相应的地址。只要以4K的页大小为单位查找即可,最大查询次数为0xFFFFF。

(11) NtOpenSection("\\Device\\PhysicalMemory") -> NtMapViewOfSection -> Search Pattern -> Got Crackme.sys Address -> patch Crackme.sys -> TerminateProcess

patch方法:搜索0xXXXXX71D地址,搜索数据是0x137501E0,然后把75 13 改成 EB 6D。

只要保证OpenProcess没有存取权限的限制,结束进程的方法就可以像上面提到的进程和线程相关的方法,这里只是实现了一种。
游客
登录 | 注册 方可回帖
返回