栈溢出时,代码最终执行结果为taizihuc这个字符串。现在让
ame成为一段大于8个字节的字符串,将taizihuc修改为abcdefghijklm
opqrstuvwxyz,再次编译执行,可以看到此刻代码最终运行结果发生了错误,系统给出了一个错误警告提示对话框。可以看到,程序在执行内存地址6c6b6a69的时候发生了错误。其实这里的6c6b6a69就是“lkji”的ASCII码,之所以不是“ijkl”,是因为Wi
dows操作系统的性质决定了内存中的数据是倒着存放的。也就是说此刻,lkji这4个字母覆盖了程序的返回地址,栈溢出现象发生了。具体分析一下,在i之前的abcdefgh刚好8个字节,也就是output指向的8个字节的内存地址已经被填满,多余的ijklm
opqrstuvwxyz就覆盖到了栈空间中的其他数据,包括函数的返回地址。用OLLYICE来分析一下,可以看到如下关键的寄存器指向:ESP0012FF80ASCII