在经典的栈溢出模型中,通过覆盖函数的返回地址来达到控制程序执行流程(EIP寄存器),通常将返回地址覆盖为0x7FFA4512,这个地址是一条JMP ESP指令,在函数返回时就会跳转到这个地址去执行,也就是执行JMP ESP,而此时ESP刚好指向我们在栈上布置的Shellcode,于是就执行了Shellcode. 之所以栈上的数据能被执行,是因为早期操作系统没有区分数据和代码,EIP指向哪里就去哪里执行. 当引入DEP(Data Execution Prevention 数据执行保护)之后,堆.栈