缓冲区溢出还是问题吗?C++/CLI安全编码[VC/C++编程]
本文“缓冲区溢出还是问题吗?C++/CLI安全编码[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
C++/CLI是对C++的一个扩大,其对全部范例,包含尺度C++类,都增添了对属性、事件、垃圾回收、及泛型的支持.
Visual C++ 2005扩大了对利用C++/CLI(通用语言底子构造)开辟运行于带有垃圾回收的虚拟机上的控件及利用程序的支持,而C++/CLI是对C++编程语言的一个扩大,其对全部范例,包含尺度C++类,都增添了如属性、事件、垃圾回收、及泛型等特点.
Visual C++ 2005支持.NET Framework通用语言运行时库(CLR),其是垃圾回收虚拟机Microsoft的实现.Visual C++ 2005对.NET编程的C++语法支持是从Visual C++ .NET 2003中引入的托管扩大C++演变而来的,托管扩大C++仍旧被支持,但在偏向于新语法的情形下已不赞成利用.Visual C++ 2005同时也对本地编程增添了新的特点,包含64位处理器架构支持,及提高了安全性的新库函数.
在本文中,将主要讲授在以最小代价把现有老系统移植到利用CLR的新环境中来时,所要面对的问题,目的是为了肯定这些程序能否仍旧易受折磨C/C++程序多年的缓冲区溢出的影响.
例1会要求用户输入用户名及密码,除去用户名之外,程序只承受"NCC-1701"为有效的密码.假如用户输入了错误的密码,程序将退出.(这个程序只是作为C++/CLI代码的漏洞测试,而不是演示若何处理密码.) 例1:
1. #include <stdlib.h>
2. #include <stdio.h>
3. #include <windows.h>
4. char buff[1028];
5. struct user {
6. char *name;
7. size_t len;
8. int uid;
9. };
10. bool checkpassword() {
11. char password[10];
12. puts("Enter 8 character password:");
13. gets(password);
14. if (strcmp(password, "NCC-1701") == 0) {
15. return true;
16. }
17. else {
18. return false;
19. }
20. }
21. int main(int argc, char *argv[]) {
22. struct user *userP = (struct user *)0xcdcdcdcd;
23. size_t userNameLen = 0xdeadbeef;
24. userP = (struct user *)malloc(sizeof(user));
25. puts("Enter user name:");
26. gets(buff);
27. if (!checkpassword()) {
28. userNameLen = strlen(buff) + 1;
29. userP->len = userNameLen;
30. userP->name = (char *)malloc(userNameLen);
31. strcpy(userP->name, buff); // log failed login attempt
32. exit(-1);
33. }
34. }
程序从21行的main()开始履行,在25及26行利用了一对puts()和gets()来提醒输入用户名,招致了一个从尺度输入到缓冲区字符数组(声明在第4行)的不受掌握的字符串复制,程序中的这两处地方都有大概会招致一个缓冲区溢出的漏洞.checkpassword()函数由main()中的27行调用,并在12及13行中提醒用户输入密码,这也是利用了一对puts()/gets().对gets()的第二次调用也会招致一个定义在仓库上的密码字符数组缓冲区溢出.
以上是“缓冲区溢出还是问题吗?C++/CLI安全编码[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |