汇编中修改EIP值的指令
什么是EIP
EIP也是一个寄存器,但不是通用寄存器,原因是它里面存的值,是我们CPU下一次要执行的地址,CPU通过EIP寄存器,找到地址,去执行地址上的指令。
如何修改EIP的值
可以使用以下指令来修改EIP的值:
指令 | 格式 |
---|---|
jmp | jmp 内存/立即数/寄存器 |
call | call 内存/立即数/寄存器 |
ret | ret |
jmp指令
jmp指令无条件跳转,之前修改通用寄存器我们可以使用mov指令,但这对于EIP这寄存器来说并不好用,不过我们可以使用jmp这个指令来实现mov指令的功能。运行结果:
call指令
之前遇到的指令都按F8步过,但是遇到call指令的时候要按F7步入,这个call起到一个调用子程序的作用。call指令不仅会修改EIP的值,也会修改栈顶指针ES拍的值,如果你不知道什么是堆栈,可以点这里,call指令相对于jmp指令而言,jmp指令对堆栈没有影响,而call指令会影响堆栈。
ret指令
ret指令就是把当前栈顶指针里的值放在EIP里,然后栈顶指针ESP的值+4,这就是它干的事儿,不是返回那个函数的值什么的。
运行前:
运行后: