zoukankan      html  css  js  c++  java
  • 机器码call和jmp地址的计算

    call和jmp都是跳转指令,但是call的同时会把pc地址压入堆栈,并且这两种方式都有远和近跳转。下面的分析不全,因为没有在网上找到足够的资料,个人创造这个情景还是有些困难。

    1.例子中的call的机器码为0xe8。

      0x400204ba <+30>:     e8 41 b6 05 00 call   0x4007bb00 <__printf>

      0x400204bf <+35>:     c9     leave  

    问题:0x4007bb00是如何计算得来的?

    pc = 0x400204bf(取完当前指令之后,pc指向下一条语句)

    另一个因为是是在x86机器上,所以是小端,那么下一个32位操作数就是0005b641,

    pc + 操作数 =0x400204bf + 0x0005b641 = 0x4007bb00 

    2.jmp有多种跳转:

    2.1.如果是远跳转,操作数是一个32位数,机器码e9

    0x40011728 <+392>: e9 46 ff ff ff jmp 0x40011673 <_dl_open+211>
    0x4001172d <+397>: 8b bb ec 04 00 00 mov 0x4ec(%ebx),%edi

    计算方式和call(e8)一样,0x4001172d + 0x ffffff46 = 0x40011673 

    2.2.如果是短跳转,操作数8位数,机器码eb

    0x0804850d <+9>: c7 04 24 0a 00 00 00 movl $0xa,(%esp)
    0x08048514 <+16>: e8 1f ff ff ff call 0x8048438 <sleep@plt>
    0x08048519 <+21>: e8 0a ff ff ff call 0x8048428 <myprint@plt>
    0x0804851e <+26>: eb ed jmp 0x804850d <main+9>

    解:pc = 0x8048520

      操作数 = 0xed  

      0x8048520 + 0xed - 0x100 = 0x804850d

    情况2:0x4013b30d <+93>:     eb ee  jmp    0x4013b2fd <*__GI___libc_dlsym+77>

      pc = 0x4013b30f

      操作数 = 0xee

      0x4013b30f + 0xee = 0x4013b3fd

      0x4013b3fd - 0x100 = 0x4013b2fd 

      操作数-0x100就是操作数的补码,最高位是符号位,若为1,则代表负数,若为0 代表正数。需要扩展符号位

      0x4013b30f +0xffffffee = 0x4013b2fd 

    情况3: 0x4013b2d6 <+38>:     75 2b  jne    0x4013b303 <*__GI___libc_dlsym+83>

      0x4013b2d8 + 2b  = 0x4013b303 

    2.3.如果是近跳转,操作数是16位数

      由于没有找到合适的例子,个人觉得和短跳转的计算方式是一样的

    2.4.以上都是相对跳转,还有一种绝对跳转,机器码ff25

    0x08048428 <+0>: ff 25 08 a0 04 08 jmp *0x804a008
    0x0804842e <+6>: 68 10 00 00 00 push $0x10
    0x08048433 <+11>: e9 c0 ff ff ff jmp 0x80483f

    跳转到0x0804a08中保存的地址。还是属于间接跳转。

    其他的跳转方式,等遇到了再补。

  • 相关阅读:
    C# savefiledialog 保存文件后 再操作数据库 提示数据库文件路径错误
    转:在C#中使用Nullable类型
    转:Global.asax通过Application_BeginRequest()事件实现访问链接的静态地址映射
    DZ7.0自动伸缩广告
    转:使用HttpModule来实现sql的防注入
    转:System.Web.UI.Page类的构造函数的执行时机
    使用ISAPI_Rewrite做简单实用的301重定向
    IIS7添加ASP.NET网站碰到的问题
    IE9 崩溃的解决方法
    利用ZEND Studio与Zend server对PHP WEB进行调试
  • 原文地址:https://www.cnblogs.com/leo0000/p/5632247.html
Copyright © 2011-2022 走看看