缓冲区溢出还是问题吗?C++/CLI安全编码
http://tech.ddvip.com 2007年04月09日 社区交流
本文详细介绍缓冲区溢出还是问题吗?C++/CLI安全编码
程序编译及测试的环境均与前例相同,除了在此使用了Unicode字符集及打开了缓冲区安全检查选项(/GS),我们在此继续使用托管扩展(CLR)。
这是一个非常简单的程序,尽管为了支持Windows GUI,它显得稍微有点长。在17至20行,有几个有意思的变量,lpszPassword是一个由16个宽字符(32字节)组成的已初始化的静态变量,紧跟其后的是userP指针及两个无符号整形:userNameLen和userPasswordLen,之后,userP在33行初始化。这些变量的地址如下:
&lpszPassword = 0x0040911C
&userP = 0x0040913C
&userNameLen = 0x00409140
&userPasswordLen = 0x00409144userP的值为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。
来源:天极开发 作者:谢启东 责编:豆豆技术应用
正在加载评论...