zoukankan      html  css  js  c++  java
  • 硬编码02

    2.经典定长指令(修改EIP)

    (I立即数)(d DWORD)(b BYTE)

    无符号 0-FF(正数)
    有符号 0-7F(正数)80-FF(负数)
    0x70 - 0x7F(后跟一字节立即数偏移,有符号)
    最大值:0-7F(向前跳)8F-FF(向后跳)
    0x70 JO
    0x71 JNO
    0x72 JB/JNAE/JC
    0x73 JNB/JAE/JNC
    0x74 JZ/JE
    0x75 JNZ/JNE
    0x76 JBE/JNA
    0x77 JNBE/JA
    0x78 JS
    0x79 JNS
    0x7A JP/JPE
    0x7B JNP/JPO
    0x7C JL/JNGE
    0x7D JNL/JGE
    0x7E JLE/JNG
    0x7F JNLE/JG

    0x0F 0x80 - 0x0F 0x8F(后跟四字节立即数偏移,有符号)
    最大值:0-7FFFFFFF(向前跳)8FFFFFFF-FFFFFFFF(向后跳)
    跳转到地址 = 当前指令地址 + 当前指令长度 + Ib
    0x0F 0x80 JO
    0x0F 0x81 JNO
    0x0F 0x82 JB/JNAE/JC
    0x0F 0x83 JNB/JAE/JNC
    0x0F 0x84 JZ/JE
    0x0F 0x85 JNZ/JNE
    0x0F 0x86 JBE/JNA
    0x0F 0x87 JNBE/JA
    0x0F 0x88 JS
    0x0F 0x89 JNS
    0x0F 0x8A JP/JPE
    0x0F 0x8B JNP/JPO
    0x0F 0x8C JL/JNGE
    0x0F 0x8D JNL/JGE
    0x0F 0x8E JLE/JNG
    0x0F 0x8F JNLE/JG

    例子1:

    公式:跳转到地址 = 当前指令地址 + 当前指令长度 + Ib

    00444243 = 0x004441EC( 当前指令地址)+2(当前指令长度) + 0x55(Ib)

    例子2:

    公式:跳转到地址 = 当前指令地址 + 当前指令长度 + Ib

    00444243 = 0x004441EC(当前指令地址)+0x2(当前指令长度) + 0xF0(有符号=-16)[00444243 = 004441EC +2 - 0x10]

    3.其它指令

    计算:0044421A=00444228+(2)指令长度+F0(有符号数-16);
    00444228 E2 F0 loopd short 1.0044421A

    0xE0 LOOPNE/LOOPNZ Ib (Jb) 共2字节
    ECX = ECX - 1 当ZF = 0 && ECX!=0 时跳转到 当前指令地址 + 当前指令长度 + Ib

    0XE1 LOOPE/LOOPZ Ib (Jb) 共2字节
    ECX = ECX - 1 当ZF = 1 && ECX != 0 时跳转到 当前指令地址 + 当前指令长度 + Ib

    0XE2 LOOP Ib (Jb) 共2字节
    ECX = ECX - 1 当 ECX!=0 时跳转到 当前指令地址 + 当前指令长度 + Ib

    0XE3 JrCXZ Ib (Jb) (在32位模式中,rCX为ECX) 共2字节
    当 ECX = 0 时跳转到 当前指令地址 + 当前指令长度 + Ib
    (自己控制步长)

    0xE8 CALL Id (Jd) 共5字节
    CALL指令的下一条指令地址入栈后,跳转到 当前指令地址 + 当前指令长度 + Id

    0xE9 JMP Id (Jd) 共5字节
    跳转到 当前指令地址 + 当前指令长度 + Id

    8个段寄存器: ES CS SS DS FS GS LDTR TR (顺序固定)
    (段寄存器实际是个结构体,共96位,其中仅16位是汇编指令可以访问到的)

    0xEA JMP Ap (Ap:六字节长度的直接地址) 共7字节
    JMP CS:Id 将Ap中的高2位赋值给CS,低4位直接赋值给EIP, 即跳转

    004183D7 > EA 12345678 1B00 JMP FAR 001B:78563412

    0xEB JMP Ib (Jb)
    跳转到 当前指令地址 + 当前指令长度 + Ib

    0xC3 RET 共1字节
    EIP出栈

    0xC2 RET Iw 共3字节
    EIP出栈后,ESP = ESP + Iw

    0XCB RETF (return far) 共1字节
    出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS

    0xCA RETF Iw 共3字节
    出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS后,ESP = ESP + Iw
    ret -> pop eip
    retf -> pop eip, pop cs

  • 相关阅读:
    使用TransactionScope实现多数据库连接事务操作
    zabbix_agentlinux下的安装
    (转)Zabbix AgentWindows平台配置指导
    使用SpringSide 3.1.4.3开发Web项目的全过程(上)
    应用开发中数据字典项设计实现方案
    Oracle Top N 和 Oracle中的limit问题解决方案
    Struts 2.0的codebehinde插件应用简述
    PropertyUtils和MethodUtils使用
    Log4j基本使用方法
    Quartz从入门到进阶
  • 原文地址:https://www.cnblogs.com/Besttwuya/p/14319923.html
Copyright © 2011-2022 走看看