专栏首页有趣的django逆向初级-硬编码(六)

逆向初级-硬编码(六)

6.1.前缀指令

1、硬编码的结构

2、前缀指令是分组的

<1> LOCK和REPEAT前缀指令:
	LOCK			FO
	REPNE/REPNZ 	F2
	REP/REPZ		F3
<2> 段前缀指令:
	CS(2E)
	SS(36)
    DS(3E)
    ES(26)
    FS(64)
    GS(65)   
<3>操作数宽度前缀指令
	66
<4>地址宽度前缀指令。
	67

6.2.经典定长指令_修改ERX

不包含Eb,Gb,说明是定长指令;

包含Eb,Gb,说明是变长指令

1、PUST/POP

DTDebug中安Ctrl+E快捷键测试

2、INC/DEC

0x40 - 0x47    INC ERX     加1
0X48 - 0X4F    DEC ERX	   减1

测试

3、MOV Rb,Ib

0xb0 - 0xb7      MOV Rv,Ib     //后面跟1个字节的立即数

4、MOV ERX,Id

0xb8 - 0xbF	      MOV ERX,Id    //后面跟4个字节的立即数

5、XCHG EAD,ERX

0x90 - 0x97 XCHG EAX,ERX

6.3.经典定长指令_修改EIP

1、0x70 - 0x7F

2、0x0F 0x80 - 0x0F 0x8F

3、其它指令

4、其它指令

6.4.经典变长指令_ModRM

1、经典变长指令_ModR/M

0x88	MOV Eb,Gb		G:通用寄存器
0x89	MOV EV,GV		E:寄存器/内存
0x8A	MOV GB,Eb		b:字节
0X8B	MOV Gv,EV		v:Worder,duubleword or quadword

当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M,该字节的8个位被分成了三部分

Mod(第6,7位)和R/M(第0,1,2位)共同描述指令中的E部分,即寄存器/内存

2、当Mod = 00时,ModR/M字节通过寄存器直接进行内存寻址

例如当操作指令为88 01时,其对应的汇编为MOV BYTE PTR DS:[ECX], AL

88 是操作指令,其后跟随的01为ModR/M

0x88描述了操作数宽度为b(byte),且操作数的顺序为Eb Gb,所以这条汇编指令为MOV BYTE PTR DS:[ECX], AL

同理可以分析出如下操作指令对应的汇编指令

3、当Mod = 01时,ModR/M字节通过寄存器+I8进行内存寻址(I为立即数,即8位立即数)

例如当操作指令为88 41 12时,其对应的汇编为MOV BYTE PTR DS:[ECX+12],AL

88 是操作指令,其后跟随的41为ModR/M

所以这条汇编指令为MOV BYTE PTR DS:[ECX+12],AL

同理可以分析出如下操作指令对应的汇编指令

4、当Mod = 10时,ModR/M字节通过寄存器+I32进行内存寻址

例如当操作指令为88 81 12 34 56 78时,其对应的汇编为MOV BYTE PTR DS:[ECX+78563412],AL

88 是操作指令,其后跟随的81为ModR/M

所以这条汇编指令为MOV BYTE PTR DS:[ECX+78563412],AL 同理可以分析出如下操作指令对应的汇编指令

5、当Mod = 11时,ModR/M字节直接操作两个寄存器

例如当操作指令为88 C1时,其对应的汇编为MOV CL,AL

88 是操作指令,其后跟随的C1为ModR/M

所以这条汇编指令为MOV CL,AL

同理可以分析出如下操作指令对应的汇编指令

6.5.经典变长指令_Reg/Opcode

上一节中,3-5位用来标识寄存器,Mod字段 与 R/M字段共同用来标识寄存器与内存。但3-5字段,并不仅仅用来标识寄存器,有些时候,用来标识Opcode。

参见Table A-2中

80 81 82 83 这几个编码,并没有明确给出具体的操作码是什么。

特别说明:凡是出现Grp的,均参见TableA-6

举例说明:80 65 08 FF

1.第一个字节为80 查Table-2表,得到对应结构:Eb,Ib

2.第二个字节为ModR/M字段,所以拆分65:

​ 01 100 101

Mod 与 R/M字段 查Table2-2 得到对应的结构:[EBP+DIS8]

3.100 字段 查表TableA-6 得到对应操作码为:AND

4.最终指令格式

AND [ebp+dis8],Ib

AND BYTE PTR SS:[EBP+08],0xFF

6.6.经典变长指令_SIB字段

ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的。这时就在ModR/M后面增加一个SIB字节,与ModR/M字段共同描述。

下图是上两节没有涉及到的三种情况

这三种情况表示,在ModR/M字节后,还紧跟着一个SIB字节。SIB字节的8个位被分成了三部分:

举例说明:88 84 48 12 34 56 78

1.第一个字节为88 查Table-2表,得到对应结构:MOV Eb,Gb

2.第二个字节为ModR/M字段,所以拆分84:

​ 01 000 010

如果查看ModR/M结果是[--][--]+dis8,则还需要一个字节(SIB)来确定[--][--]里面的内容

3.SIB字节48分析

Base + Index*2Scale (Scale描述2Scale,所以只能为 *1 *2 *4 *8)

48拆分:01 001 000

[EAX + EXC*2]

4.结果

88 84 48 12 34 56 78 对应汇编 MOV BYTE PTR DS:[EAX+ECX*2+78563412],AL

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 滴水逆向初级-汇编(一)

    进制的定义: 八进制的定义:由八个符号组成,分别是01234567逢八进一。 十进制的定义:由十个符号组成,分别是0123456789逢十进一。 N进制的...

    zhang_derek
  • 逆向初级-PE(五)

    1、什么是可执行文件? 可执行文件(executable fle)指的是可以由操作系统进行加载执行的文件。 可执行文件的格式: Windows平台: P...

    zhang_derek
  • android 逆向 初级系列(二)

    用户1127566
  • 滴水逆向初级-C++(三)

    1、什么是封装: 将函数定义到结构体内部,就是封装。 2、什么是类: 带有函数的结构体,称为类。 3、什么是成员函数: 结构体里面的函数,称为成员函数...

    zhang_derek
  • 滴水逆向初级-win32(四)

    1、什么是Win32 API?有哪些?在哪里? 主要是存放在C:\WINDOWS\system32下面所有的dll 几个重要的DLL: <1> Kerne...

    zhang_derek
  • 逆向工厂(一):从hello world开始

    * 本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可禁止转载 前言 从本篇起,逆向工厂带大家从程序起源讲起,领略计算机程序逆向技术,了解程序的运...

    FB客服
  • 滴水逆向初级-C语言(二)

    1、声明变量 变量类型变量名; 变量类型用来说明宽度是多大 int 4个字节 short 2个字节 char 1个字节

    zhang_derek
  • APP逆向神器之Frida【Android初级篇】

    说到逆向APP,很多人首先想到的都是反编译,但是单看反编译出来的代码很难得知某个函数在被调用时所传入的参数和它返回的值,极大地增加了逆向时的复杂度,有没有什么办...

    Python编程与实战
  • [系统安全] 二.如何学好逆向分析及吕布传游戏逆向案例

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏...

    Eastmount
  • 马赛克密码破解——GitHub 热点速览 Vol.50

    “xx”(爆粗口)这个词是最能体现本人看到本周 GitHub 热点的心情。那一天,看到用图片处理技术还原马赛克密码的 Depix 便惊为天人,这个本周特推的项目...

    HelloGitHub
  • [系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏...

    Eastmount
  • [系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏...

    Eastmount
  • Java-初级编码规范

    良好的编码规范和习惯会让你的代码锦上添花,同时也会大大的增加团队协作开发的效率,避免很多细节的问题,从而大大的提高你的代码的可阅读性,同时也是一个优秀开发者的必...

    老九学堂-小师弟
  • s001android逆向安全初级篇之apk逆向常用工具及简单使用一览

    关于apk 逆向中的一些工具的使用,看了不少文章,也使用过有很长一段时间了,今天对此做一总结:

    上善若水.夏
  • [系统安全] 五.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏...

    Eastmount
  • s002android逆向安全初级篇之android smali语法总结

    smali中有两类数据类型:基本类型和引用类型。 引用类型是指数组和对象,其他都是基础类型。

    上善若水.夏
  • 【WP】MOCTF-逆向题-writeup(上)

    之前寒假做 moctf 的逆向题时,是看着网上各位师傅们的 writeup 做的,他们的后三题都是用 IDA 做的,直接 F5 看伪代码分析出来的,最近在用 O...

    yichen
  • 利用蓝牙从FUZE获取信用卡数据测试

    这篇文章主要讨论关于FUZE Card智能卡的安全问题,这是一种带有蓝牙功能的可编程信用卡,它的大小跟普通信用卡一样,但FUZE可以取代至少30张信用卡,也就是...

    FB客服
  • 逆向工厂(二):静态分析技术

    * 本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可禁止转载 前言 [逆向工厂]第一章节中介绍了逆向技术的相关基础知识,其中提到逆向的两种形式:...

    FB客服

扫码关注云+社区

领取腾讯云代金券