科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件缓冲区溢出还是问题吗?C++/CLI安全编码

缓冲区溢出还是问题吗?C++/CLI安全编码

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

C++/CLI是对C++的一个扩展,其对所有类型,包括标准C++类,都添加了对属性、事件、垃圾回收、及泛型的支持。

作者:谢启东编译 来源:天极开发 2007年11月12日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
如果要使用那些不受控制的字符串复制操作,如gets()或strcpy(),来覆盖掉由"密探"保护的返回地址(EIP)、基指针(EBP)、或堆栈上的其他值,一个攻击者将首先要覆盖掉这个"密探"。如果"密探"被修改了,当函数返回时,将会产生一个错误,导致攻击失败--除非是为了进行"拒绝服务攻击"。通过暴力枚举猜测这个值,或其他方法,还是有可能挫败这个"密探"的,但是,进行一次成功攻击的难度增加了。

  打开/GS选项不会让程序对缓冲区溢出漏洞彻底免疫,堆栈中的缓冲区溢出仍会使程序崩溃,攻击者利用基于堆栈的溢出来执行任意代码的可能性,即使在打开/GS的情况下仍然存在。更重要的是,/GS选项不会检测堆中或数据段中的缓冲区溢出。

  为举例说明,例2使用Win32 GUI重写了前面那个示例程序,这个程序提供一个带有一些简单选项的菜单栏--File菜单下有两个菜单项:"Login"和"Exit"。Login会用一个对话框来提示用户输入密码,一旦输入了密码,在用户点击"OK"按钮之后,将把输入的密码与之前记录的密码相比较。

  例2:

1. #include "stdafx.h"
2. #include "TestItDan.h"
3. #include <stdlib.h>
4. #include <stdio.h>
5. #include <windows.h>
6. #define MAX_LOADSTRING 100
7. struct user {
8.  wchar_t *name;
9.  size_t len;
10. int uid;
11. };
13. HINSTANCE hInst;
14. TCHAR szTitle[MAX_LOADSTRING];
15. TCHAR szWindowClass[MAX_LOADSTRING];
16. TCHAR lpszUserName[16] = L"guest";
17. TCHAR lpszPassword[16] = L"0123456789abcde";
18. struct user *userP = (struct user *)0xcdcdcdcdcdcdcdcd;
19. size_t userNameLen = 16;
20. size_t userPasswordLen = 0xffffffff;
25. int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow) {
26.  UNREFERENCED_PARAMETER(hPrevInstance);
27.  UNREFERENCED_PARAMETER(lpCmdLine);
28.  MSG msg;
29.  HACCEL hAccelTable;
30.  LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
31.  LoadString(hInstance, IDC_TESTITDAN, szWindowClass, MAX_LOADSTRING);
32.  MyRegisterClass(hInstance);
33.  userP = (struct user *)malloc(sizeof(user));
34.  if (!InitInstance (hInstance, nCmdShow)) {
35.   return FALSE;
36.  }
37.  hAccelTable =LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTITDAN));
38.  while (GetMessage(&msg, NULL, 0, 0)) {
39.   if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
40.    TranslateMessage(&msg);
41.    DispatchMessage(&msg);
42.   }
43.  }
44.  return (int) msg.wParam;
45. }

109. INT_PTR CALLBACK GetPassword(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
110.  TCHAR lpszGuestPassword[16] = L"NCC-1701";
111.  UNREFERENCED_PARAMETER(lParam);
112.  switch (message) {
113.   case WM_INITDIALOG:
114.    return (INT_PTR)TRUE;
115.   case WM_COMMAND:
116.    if (LOWORD(wParam) == IDOK) {
117.     EndDialog(hDlg, LOWORD(wParam));
118.     SendDlgItemMessage(hDlg,
119.     IDC_EDIT1,
120.     EM_GETLINE,
121.     (WPARAM) 0, // line 0
122.     (LPARAM) lpszPassword
123.     );
124.     userP->len = userNameLen;
125.     if (wcscmp(lpszPassword, lpszGuestPassword) == 0) {
126.      return true;
127.     }
128.     else {
129.      MessageBox(hDlg,
130.       (LPCWSTR)L"Invalid Password",
131.       (LPCWSTR)L"Login Failed",
132.       MB_OK
133.      );
134.     }
135.     return (INT_PTR)TRUE;
136.    }
137.    break;
138.   }
139.   return (INT_PTR)FALSE;
140.  }

  程序编译及测试的环境均与前例相同,除了在此使用了Unicode字符集及打开了缓冲区安全检查选项(/GS),我们在此继续使用托管扩展(CLR)。

  这是一个非常简单的程序,尽管为了支持Windows GUI,它显得稍微有点长。在17至20行,有几个有意思的变量,lpszPassword是一个由16个宽字符(32字节)组成的已初始化的静态变量,紧跟其后的是userP指针及两个无符号整形:userNameLen和userPasswordLen,之后,userP在33行初始化。这些变量的地址如下:

&lpszPassword = 0x0040911C
&userP = 0x0040913C
&userNameLen = 0x00409140
&userPasswordLen = 0x00409144

  userP的值为0x00554D30,userNameLen的值为0x00000010,userPasswordLen的值为0xffffffff。如果我们查看lpszPassword地址的起始处内存,可以非常清楚地看到这些变量的初始值(见插3)。

  代码段3:

0040911C 30 00 31 00 32 00 33 00 34 00 35 00 36 00 37 00
0040912C 38 00 39 00 61 00 62 00 63 00 64 00 65 00 00 00
0040913C 30 4d 55 00 10 00 00 00 ff ff ff ff 8a 00 07 02
0040914C c6 00 07 02 02 01 07 02 00 00 00 00 01 00 00 00

  此程序中的漏洞是在118至123行中对SendDlgItemMessage的调用,EM_GETLINE消息指定了从编辑控件IDC_EDIT1获取一行文本--编辑控件在Login对话框中,并把它复制到定长缓冲区lpszPassword中。这个缓冲区只能容纳15个Unicode字符及一个结尾的null,如果输入了多于15个字符,就会发生缓冲区溢出;在此假设输入了20个字符,第17及18个字符将会覆盖掉userP,第19及20个字符将会覆盖掉userNameLen,结尾的null将会覆盖掉userPasswordLen。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章