Windows内核是操作系统核心部分,提供系统级别服务,如设备和内存管理,分配处理器时间和管理错误处理。 Win32 API在实现命令行和其他基于字符的用户界面时使用控制台窗口。实现上述功能的特定代码位于CSRSS.EXE系统进程中。CSRSS.EXE进程的WINSRV.DLL文件创建并管理控制台窗口。如果用户从控制台窗口的系统菜单中选择了\"属性\"选项的话,包含有控制台窗口信息的数据结构就被拷贝到了文件映射的对象。该数据结构被称为CONSOLE_STATE_INFO,结构如下: typedef struct _CONSOLE_STATE_INFO { /* 0x00 */ DWORD cbSize; /* 0x04 */ COORD ScreenBufferSize; /* 0x08 */ COORD WindowSize; /* 0x0c */ POINT WindowPosition; /* 0x14 */ COORD FontSize; /* 0x18 */ DWORD FontFamily; /* 0x1c */ DWORD FontWeight; /* 0x20 */ WCHAR FaceName[32]; /* Buffer Overflow */ /* 0x60 */ DWORD CursorSize; /* 0x64 */ BOOL FullScreen; /* 0x68 */ BOOL QuickEdit; /* 0x6c */ BOOL DefaultWindowPos; /* 0x70 */ BOOL InsertMode; /* 0x74 */ WORD ScreenColors; /* 0x76 */ WORD PopupColors; /* 0x78 */ BOOL HistoryNoDup; /* 0x7c */ DWORD HistoryBufferSize; /* 0x80 */ DWORD NumberOfHistoryBuffers; /* 0x84 */ COLORREF ColorTable[16]; /* 0xc4 */ DWORD CodePage; /* 0xc8 */ DWORD hwnd; /* 0xcc */ WCHAR ConsoleTitle[2]; } CONSOLE_STATE_INFO,...
Windows内核是操作系统核心部分,提供系统级别服务,如设备和内存管理,分配处理器时间和管理错误处理。 Win32 API在实现命令行和其他基于字符的用户界面时使用控制台窗口。实现上述功能的特定代码位于CSRSS.EXE系统进程中。CSRSS.EXE进程的WINSRV.DLL文件创建并管理控制台窗口。如果用户从控制台窗口的系统菜单中选择了\"属性\"选项的话,包含有控制台窗口信息的数据结构就被拷贝到了文件映射的对象。该数据结构被称为CONSOLE_STATE_INFO,结构如下: typedef struct _CONSOLE_STATE_INFO { /* 0x00 */ DWORD cbSize; /* 0x04 */ COORD ScreenBufferSize; /* 0x08 */ COORD WindowSize; /* 0x0c */ POINT WindowPosition; /* 0x14 */ COORD FontSize; /* 0x18 */ DWORD FontFamily; /* 0x1c */ DWORD FontWeight; /* 0x20 */ WCHAR FaceName[32]; /* Buffer Overflow */ /* 0x60 */ DWORD CursorSize; /* 0x64 */ BOOL FullScreen; /* 0x68 */ BOOL QuickEdit; /* 0x6c */ BOOL DefaultWindowPos; /* 0x70 */ BOOL InsertMode; /* 0x74 */ WORD ScreenColors; /* 0x76 */ WORD PopupColors; /* 0x78 */ BOOL HistoryNoDup; /* 0x7c */ DWORD HistoryBufferSize; /* 0x80 */ DWORD NumberOfHistoryBuffers; /* 0x84 */ COLORREF ColorTable[16]; /* 0xc4 */ DWORD CodePage; /* 0xc8 */ DWORD hwnd; /* 0xcc */ WCHAR ConsoleTitle[2]; } CONSOLE_STATE_INFO, *PCONSOLE_STATE_INFO; 该结构中的值被传送到了WINSRV.DLL中的代码,但该代码没有正确的验证数据。攻击者可以发送全部为0的CONSOLE_STATE_INFO就可以导致CSRSS进程终止和系统崩溃(蓝屏)。 CONSOLE_STATE_INFO数据结构中还包含有指定字体名称的字符串FaceName[32]。该字符串通过wcscpy()函数拷贝到了固定大小的栈缓冲区,但没有任何检查,如下所示: 0x5FFB39DF push [ebp+lpFaceName] 0x5FFB39E2 lea eax, [ebp-54h] 0x5FFB39E5 push eax 0x5FFB39E6 call j_wcscpy 攻击者可以通过提供大于32个字节的字符串触发栈溢出,这样就可以完全控制计算机,执行任意代码。