现在有一个c程序:
打印了abcdefgh这8个字母的十六进制。
现在试试赋给output 全26个字母(超了26-8=18个)看看:
只打印了前8个字母,并有错误信息。查看详细错误信息:
Offset:706f6e6d代表的是溢出的ponm这几个字母的十六进制数。
为什么会这样呢?
先明确两个概念:中断、堆栈(场景保护和恢复,先进后出)。
第一次输入abcdefgh,因为要进入main函数,所以系统把之前的eip、edp保存在堆栈中以便以后的恢复。然后output分配了8个char空间,拷贝abcdefgh到里面,等执行完main函数以后,就把保存在堆栈中的edp、eip恢复就可以了。
第二次输入的是26个字符,output分配的还是8个字符。执行完main函数以后,系统要恢复edp、eip。但eip被覆盖成了ponm,但系统并不知道,所以系统会继续执行6d6e6f70。那我们可以把eip覆盖成我们想要去的地方。也就是让电脑运行我们想运行的程序。