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

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-09-06,20:23:27。
作者By-----溺心与沉浮----博客园

一、JMP指令

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

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

 JMP 0x401052

在0x401052处输入如下代码:

 JMP 0x401007

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

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

 MOV DWORD PTR DS:[ESP-],ESP
SUB ESP,

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-09-06,20:23:27。
作者By-----溺心与沉浮----博客园

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

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

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

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

二、CALL指令

  CALL指令,首先将程序运行的下一地址压入堆栈,并修改EIP的值,我们看如下例子,首先我们将EAX, ECX, EDX, EBX, ESI, EDI的值分别修改成了0x1,0x2,0x3,0x4,0x5,0x6,ESP, EBP不要动!然后输入下面指令

 CALL 0040101C

执行CALL 0x40101C

CALL指令发生跳转的时候,下一行地址,也就是要回来的地址,并不是在它原有的基础上+4,而是看它旁边有几个字节

如果是第一个红框中所标,那就是2个字节,如果是第二个红框所标,那他就是5个字节,这里涉及到硬编码,大家就先知道是个什么回事就行

根据图中变化所示,我们可以清晰的看到,执行CALL 0x40101C指令时,0x401000下一行地址0x401005被压入栈中,ESP的值减4,原先ESP的值是0x0018FF8C,EIP的值也变成了0x0040101C

三、RET指令

  RET指令会将ESP的值POP出来,然后修改掉EIP的值

紧接上图,我们执行0x40101C处的RET指令,仔细观察ESP,EIP的值,并观察ESP所代表的的内存编号的值得变化

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-09-06,20:23:27。
作者By-----溺心与沉浮----博客园

汇编指令之JMP,CALL,RET(修改EIP的值!!!)的更多相关文章

  1. 常见寄存器以及常见汇编指令,常见爆破指令 good

    CPU的任务就是执行存放在存储器里的指令序列.为此,除要完成算术逻辑操作外,还需要担负CPU和存储器以及I/O之间的数据传送任务.早期的CPU芯片只包括运算器和控制器两大部分.到了近几年,为了使存储器 ...

  2. JMP CALL RET

    一.JMP指令(修改EIP的值)(第一个修改EIP的指令) 三种方法 :JMP 立即数 JMP  寄存器 JMP  内存 EIP 之前介绍过,EIP存放的值就是cpu下一次要执行的地址 1.之前学过要 ...

  3. 王爽汇编第十章,call和ret指令

    目录 王爽汇编第十章,call和ret指令 call和ret指令概述: ret和retf ret指令 retf指令 call 和 ret 的配合使用 call指令详解 call原理 call指令所有写 ...

  4. Cheat Engine 修改汇编指令

    打开游戏 扫描阳光 扫描过程就不讲了 找到阳光的地址 显示反汇编 找到使阳光减少的反汇编代码 空指令替换 将阳光减少汇编指令,用空指令替换.这样阳光就不再减少了 指令替换 也可以将汇编指令修改,减少变 ...

  5. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  6. go语言调度器源代码情景分析之五:汇编指令

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第4小节. 汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运 ...

  7. 通过修改EIP寄存器实现远程注入

    功能:通过修改EIP寄存器实现32位程序的DLL注入(如果是64位,记得自己对应修改汇编代码部分) 原理: 挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器码和数据拷贝 ...

  8. 通过修改EIP寄存器实现32位程序的DLL注入

    功能:通过修改EIP寄存器实现32位程序的DLL注入 <如果是64位 记得自己对应修改汇编代码部分> 原理:挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器 ...

  9. 通过修改EIP寄存器实现强行跳转并且注入DLL到目标进程里

    /* 描述 功能:通过修改EIP寄存器实现32位程序的DLL注入(如果是64位,记得自己对应修改汇编代码部分) 原理: 挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器 ...

随机推荐

  1. 六、CSS 选择器:BeautifulSoup4

    和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会局部遍历,而Beautiful Soup 是基 ...

  2. fiddler---Fiddler抓取https协议

    上一篇简单的介绍了Fiddler的使用方法和页面布局介绍,Fiddler默认抓取的是HTTP协议,现在的协议基本上都是基于HTTPS协议的,今天写一篇如何通过Fiddler抓取HTTPS协议 什么是H ...

  3. scanf函数和cin的区别、类的数组、C++排序函数

    给定n个字符串,将这n个字符串按照字典序进行排列,此处用排列函数是C++的库函数sort,产生如下两个疑问,望大佬解答 #include <iostream> #include <a ...

  4. 201271050130-滕江南《面向对象程序设计(java)》第十一周学习总结

    项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...

  5. lua 11 闭包,函数的使用

    转自:http://book.luaer.cn/_41.htm 当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界.虽然这看起来很清楚,事实并非如此 ...

  6. 剑指Offer-24.二叉树中和为某一值的路径(C++/Java)

    题目: 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的 ...

  7. Ubuntu下的录GIF神器——Peek

    最近一直在找Ubuntu下面录GIF好用方便的软件一直没找到,很多都是要获取录屏四角的坐标,现在终于找到了,就是我们的录GIF神器——Peek. 1 获取Peek的ppa源 sudo add-apt- ...

  8. luoguP5283 [十二省联考2019]异或粽子

    题意 类似超级钢琴,找最优解用可持久化trie. code: #include<bits/stdc++.h> using namespace std; #define re registe ...

  9. Ajax常用例子 Post 和 Get

    1. 前台:Post$.ajax({ url: "@Url.Action("Save", "UserFun")", type: " ...

  10. 修改gradle中央仓库,加快jar包下载速度

    打开gradle项目的build.gradle文件 找到repositories,注释掉mavenCentral(),使用阿里云的仓库地址 repositories { //mavenCentral( ...