汇编指令之JMP,CALL,RET(修改EIP的值!!!)

Posted reverse-xiaoyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编指令之JMP,CALL,RET(修改EIP的值!!!)相关的知识,希望对你有一定的参考价值。

  简单介绍了,JMP指令按市面上的意思来说是跳转到指定地址,但我这里不这么说,JMP, CALL, RET三个指令均为修改EIP值的指令,EAX, ECX, EBX, EDX, ESP, EBP, ESI, EDI,这8个寄存器的值均可以用mov指令来修改里面的值,EIP行不行呢?我们实际测试一下。

一、JMP指令

技术图片

 

 

我们发现,指令违法,说明,EIP的值不允许通过MOV指令来修改, 但是可以通过什么办法来修改呢?就是我们的标题咯,就是这三条指令,到这里,相信你明白我为什么会说JMP, CALL, RET指令是用来修改EIP的值了吧,如果不明白,请接着看我下面的演示。

技术图片

 

 

 我们在0x4010000输入如下代码:

1 JMP 0x401052

 

在0x401052处输入如下代码:

1 JMP 0x401007

 

我们这两行代码输入进去,OD会自动帮我们转化成图中左边两个框中的代码,具体为什么要这样,我们这里先不做解释

JMP指令的作用就是无条件的修改EIP的值,我为什么不说是“跳转”,我们熟悉的词语呢?因为决定程序往哪跳转,这不是JMP做的,它所做的就是无条件去修改EIP的值,我们可以去理解成“MOV EIP, 0x00401052”, "MOV EIP, 0x401007", JMP将EIP的值修改完成过后,CPU会根据EIP里面的值决定程序往哪跳转,这件事是CPU决定的。我喜欢“庖丁解牛”,因为只有了解到了本质,我才觉得我是在学东西,就是push,pop,很多人也只是知道是压栈,出栈,知道了这个有什么用呢?只是知道怎么去用而已,万一如果出现

1 MOV DWORD PTR DS:[ESP-4],ESP
2 SUB ESP,4

 

我们还能做到认识push吗?我相信只有“庖丁解牛”,长期这样去认知高级指令,经过一定时间积累,我们看到变形的指令时,我们也能一眼认出它,

我们执行上面OD中写入的两行JMP指令,看看寄存器有哪些变化,为了方便观察,我这里已经将EAX, ECX, EDX, EBX, ESI, EDI的值分别修改成了0x1,0x2,0x3,0x4,0x5,0x6,ESP, EBP不要动!这两个代表这栈顶与栈底。

技术图片

 

 

 经过观察,我们发现只有EIP的值发生了改变,其他的寄存器并无发生变化,在执行第二条JMP指令

技术图片

 

 

 JMP指令执行完过后,可以发现它除了EIP寄存器外,它不影响任何寄存器的值,也不影响EFLAG的值

 

二、CALL指令

明天补充,很晚了,明天还要上班

三、RET指令

 

以上是关于汇编指令之JMP,CALL,RET(修改EIP的值!!!)的主要内容,如果未能解决你的问题,请参考以下文章

8086汇编之 CALL 和 RET指令

8086汇编 call 指令

关于汇编指令call和ret的具体细节操作!

反汇编系列——函数篇

CALLJMP与RET

汇编语言中的call是啥意思