写在前面:
学习汇编时,不要去死记指令,而要领会它的本质,并且可以用不同的方式重现
EIP:标准寄存器(非通用),用来放cpu下一步执行的操作(一般是内存编号?)
下面介绍一些修改EIP的值的指令:
1.JMP指令
- JMP 寄存器/内存/立即数 无逗号
- 等价于
- MOV EIP,寄存器/内存/立即数这个方法无法执行
下面举例:
MOV DWORD PTR DS:[0022FFC4],11223344
JMP DWORD PTR DS:[0022FFC4]
结果:
EIP-----11223344
注意:是将【】里的值作为内存地址,取其值
2.CALL指令
- 修改EIP的值(JMP指令)
- 将call指令下一步的内存地址放入栈顶,esp减4
- CALL 内存/寄存器/立即数
注:这里的内存只能有dword
注意:执行按f7- 等价于
- JMP …/…/…
- MOV… [ESP],CALL指令下面一个内存地址
- SUB ESP,4
3.RETN指令
将栈顶的值PUSH --给EIP,同时ESP加4
- RETN
等价于- 1.MOV EIP,DWORD PTR DS:[ESP]
//应该不能写EIP吧,所以这个指令不成立- 2.ADD ESP,4