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

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

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

  倘若输入了更多的字符,以致密码字符数组存储空间无法容纳,一个攻击者就可以溢出此缓冲区,并以shellcode(可为任意的代码)地址覆盖掉返回地址。出于演示的目的,在此假定shellcode已被注入,且定位于0x00408130,为执行此代码,攻击者只需把下列字符串作为密码输入:

Enter 8 character password:
123456789012345678900|@

  这个输入的字符串被复制到密码字符数组,溢出了此缓冲区并覆盖相应的内存包括返回地址。字符串中的三个字符0|@覆盖了返回地址的前三个字节,而返回地址的最后一个字节被一个由gets()函数产生的null结尾字符所覆盖。注意,如果这个null不在最后一个字节上,那么不可能复制整个字符串,因为gets()函数会把这个null字符解释为字符串的结尾。那为什么要以上这三个字符呢?因为,这些字符的十六进制形式提供了内存中表示地址所需的值,"0"的ASCII十六进制码为0x30,"|"为0x81,而"@"为0x40。如果把这三个字符以顺序{ '0', '|', '@' }连接起来,就可将shellcode(0x00408130)地址的小尾字节序表示形式写入到内存中。最后一个null字节 由字符串的null字符提供。(见代码段2。)

  代码段2:

002DF3D4 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 1234567890123456
002DF3E4 37 38 39 30 30 81 40 00 01 00 00 00 79 3a 4e 00 78900.@.....y:N.
002DF3F4 a8 2b 2f 00 38 f4 2d 00 da c4 fc 79 78 f4 2d 00 .+/.8.-....yx.-.
002DF404 48 f4 2d 00 60 13 40 00 01 00 00 00 50 53 54 00 H.-.`.@.....PST.

  当checkpassword()函数返回时,控制权就传到shellcode而不是main()函数中的原始返回地址上。

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

正在加载评论...