发布网友 发布时间:2022-05-07 09:38
共2个回答
热心网友 时间:2023-10-24 07:21
因为RET之后,ESP恰好指向我们想要执行的代码。所以需要JMP ESP,让IP指向代码来执行。追问如果我将“abcdefgh” 分别压力堆栈,当没有发生溢出前紧跟着后面的EBP、EIP值是多少呢?为什么要把EIP值覆盖成JMP ESP指令的地址?这样做程序已经发生了“该内存不能为read” 为什么EIP不能为读?追答缓冲区溢出,是内容超出栈帧范围,覆盖掉原有结构。原栈帧底部的结构是新EBP指向的位置,原EBP值,返回地址。覆盖后是新EBP指向的位置,原EBP,JMP ESP地址,欲执行的机器码。所以,栈帧在返回时,会先POP EBP,再RET。其中RET实质上POP EIP。则,EIP指向JMP ESP的指令,马上执行该指令,然后恰好此时ESP指向欲执行的代码。
关于问题:
1、因为EIP是用来标记将要执行的指令的寄存器。我们想执行JMP ESP,所以才会把他覆盖为JMP ESP的地址。
2、EIP的位置不能读,情况比较多,例如覆盖的JMP ESP地址不对,不是代码段的地址,或者,此时ESP指向位置没有可执行代码。当然,即使执行成功后,EIP并没有回到原来的位置,仍然会一直在栈区遇到不可读的保护内容。
来自:求助得到的回答
热心网友 时间:2023-10-24 07:22
首先esp是堆栈寄存器,指向堆栈。堆栈常用来保存函数的局部变量。