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:
|
程序从21行的main()开始执行,在25及26行使用了一对puts()和gets()来提示输入用户名,导致了一个从标准输入到缓冲区字符数组(声明在第4行)的不受控制的字符串复制,程序中的这两处地方都有可能会导致一个缓冲区溢出的漏洞。checkpassword()函数由main()中的27行调用,并在12及13行中提示用户输入密码,这也是使用了一对puts()/gets()。对gets()的第二次调用也会导致一个定义在堆栈上的密码字符数组缓冲区溢出。
程序使用Microsoft Visual C++ 2005编译,并关闭了缓冲区安全检查选项(/GS-),打开了托管扩展(/clr)。默认情况下,缓冲区安全检查是打开的,把它关闭并不是个好做法(如本例所示),而/clr选项可允许由托管及非托管代码生成混合的程序集。
程序生成过程中产生的几个警告信息都可以忽略掉,例如,"warning C4996: 'gets' was declared deprecated"和"warning C4996: 'strcpy' was declared deprecated",编译器推荐使用gets_s()来代替gets(),用strcpy_s()来代替strcpy()。如果完全使用这些替代函数,那么就可消除缓冲区溢出潜在的可能性。然而,这些只是警告信息,可以忽略甚至关闭,忽略这些警告信息是符合用最小的代价移植现有老系统这个前提的。
当使用托管扩展时,编译器会为main()及checkpassword()函数生成Microsoft媒介语言(MSIL或称为通用媒介语言CIL),CIL字节码会被打包进一个可执行文件,在调用即时编译器(JIT)将其翻译为本地程序集指令后,接着把控制权交给main()。
程序运行时,提示用户输入用户名:
|
接着程序要求用户输入密码,其被读入到声明在11行上的10个字符数组这个变量中,在插1中,如果在密码从标准输入读取之前,查看堆栈上的数组地址起始处的数据(本例中为0x002DF3D4),将会看到分配给密码的存储空间(以黑体字标出)及堆栈上的返回地址(以红色字标出)。返回地址在此为小尾字节序(Little Endian)。
代码段1:堆栈上数组地址起始处的数据
|
| 共3页: 1 [2] [3] 下一页 | ||
|
|
|||
| · 51CTO主编推荐经典专题 · RAID——磁盘阵列基础 · 充电计划之热门IT认证.. · 51CTO技术自测 挑战自.. · CISSP认证成长之路 · AMD Phenom三核处理器.. · 国际文档格式标准开战 · 2007年互联网大会 |
· 我是黑客我怕谁——讲.. · ARP攻击防范与解决方案 · Solaris 10 配置管理 · Solaris基础知识入门 · RIP路由协议专栏 · MPLS路由协议专栏 · OSPF路由协议专栏 · 思科路由器产品 |
||
|
|||
| · Java基础教程 · VPN技术 · ARP攻击防范与解决方案 · SQL Server 2005全解 · SOA 面向服务架构 · SQL Server 2005全解 · Java编程开发手册 · RAID——磁盘阵列基础 |
· 三层交换技术专题 · SQL Server入门到精通 · Windows Server 2003企.. · Windows远程桌面应用 · C#技术开发指南 · VPN技术 · Solaris 10 配置管理 · C#技术开发指南 |
||
|
|||
| · ARP攻击防范与解决方案 · VPN技术 · SQL Server 2005全解 · Java基础教程 · SQL Server入门到精通 · SQL Server 2005全解 · SOA 面向服务架构 · Java编程开发手册 |
· C#技术开发指南 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · RAID——磁盘阵列基础 · Windows Server 2003企.. · 邮件服务器专题 · wimax技术与趋势 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| ·拯救系统管理员 ·美国选民:我为什么选布什 |
·VMware公司中文命名挑战赛 ·我们真缺乏创新吗? |
| ·J0ker的CISSP之路:复习-.. ·J0ker的CISSP之路:复习-I.. |
·9月第3周安全回顾 内网安.. ·教你几招识别和防御Web网.. |
| · NGN:下一代网络 · 网络访问中断大排查 · FTTx光纤接入 |
· 教你使用Anti ARP Sniff.. · 网络嗅探教程:使用Snif.. · 常见病毒手工清除方法大.. |
| · C++是垃圾语言?! · 2007年IT界七大抄袭事件 · Java实用开发全集 |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · 热门 IT 培训认证官方资.. · Ubuntu 中文开源频道 · Solaris基础知识入门 |
· 费力不讨好 数据中心主.. · AMD Phenom三核处理器解.. · 51CTO主编推荐经典专题 |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 存储2006,一个并购的大.. · IDC宣布浪潮蝉联存储市.. · 双机热备技术 |