汇编基础知识六

0x01 简介

这里开始熟悉汇编的指令格式

X64dbg界面一

下图为X86版本的指令格式,X64的指令格式和X86差不多后面有需要的话再详细写

image
中文版

0x02 Istruction Prefixes 前缀指令

Istruction Prefixes: 可选项

默认二进制文件是前缀和内容混杂在一起只有机器才能识别区别

人工区分方法:

  • 逆向:debug工具打开程序 前面有冒号的就是带前缀的操作指令
示例

前缀指令分组

X86格式图已经给我们提示,有四个组,一次最多使用一个组

1.LOCK 和 REPEAT

指令 硬编码
LOCK F0
REPNE/PEPNZ F2
REP/REPZ F3

2.段前缀指令:

段寄存器 硬编码
ES 26
CS 2E
SS 36
DS 3E
FS 64
GS 65

段前缀指令的作用:修改使用段寄存器

不加提示默认使用DS

如果有栈寄存器的话会使用SS

默认寻址使用的段寄存器

3.操作数宽度前缀指令

硬编码 效果
66 改变默认寄存器宽度
程序运行头

push ebp是设置程序为X86位下的16位模式情况下运行

CPU是如何判断程序有关系:

CS中有一个DB位如果CS中DB位为0则16位1位32

现在默认的CPU模式是32位,所以汇编指令就算是使用epb(16位寄存器)最少也是32位

如何使用16位的

只需要在硬编码前面加上前缀 66:即可

4.地址宽度前缀指令

效果如上面

硬编码 效果
67 改变地址宽度

当CPU使用32位模式选址方式就会使用32位进行

当DB位为0的时候16位,使用16位寻址方式,当DB为1的时候使用32位寻址方式

0x03 Opcode 修改通用寄存器

决定 硬编码长度是由( Opcode ModR/M SIB)决定。前缀指令只会影响到他自己。

然后,ModR/M 由Opcode决定 SIB由ModR/M决定

定长指令&变长指令

Intel 白皮书 one-by Opcode Map 00H-F7H
Intel 白皮书 one-by Opcode Map 08H-FFH

虽然这个是叫做One-byte但是都是从这个表里面展开的

image

由这个图例查找,55,push rbp/13

然后 0F-3F都有两个操作符,前面的是Opcode,后面跟着是ModR/M

如果Opcode跟着 ModR/M的话就是变长,没有则定长

Zz查表

所有两个操作符的就判定前面的是Opcode,ModR/M

这是要理解这个我们可以查询他相关的问题操作符解释

在Intell白皮书里面有Codes for addressing method

image

可以查到操作符大写解释

下面的Codes for Operand Type

有操作符小写解释

例如大写E前面很明显的写了A ModR/M byte follows the opcode

表中寄存器带个r表示可以随着系统变化而变化,可以是64位的RAX,也可以是32位的EAX,也可以是AX 表中会显示最大的修改位数,带E开头的表示只能修改32位和16位

0x04 Opcode 定长指令之修改ERX

ERX=EAX or ECX or EDX 等通用寄存器

PUSH/POP INC/DEC

硬编码 4开头是 INC/DEC 5开头的是push/pop

0-7是 INC PUSH

8-F是DEC POP

40开头的都两行格式,上面的一行表示32位,下面的是64位的。

mov rb,lb mov ERX ,Iv

在b开头的是mov指令

他的写法又不一样,mov AL\R8L,Ib

这样能够很好的解释定长指令不是只有一个字节的

I是Immedlate立即数

b是bate 字节

v是 word doubleword quadword三种情况之一,他取决于你采用数据宽度

所以:

0-7 是 mov rb,lb

8-F 是 mov ERX,Iv

XCHG EAX,ERX

9开头 就是XCHG指令是两个寄存器之间交换而且都是放到EAX中

例:

91 XCHG EAX,ECX
92 XCHG EAX,EDX

但0是表示EAX 用EAX放到EAX中所以汇编中把

90作为nop 不做任何操作。

我们通常使用Nop的时候是遇到花指令这个下次有时间再写。

90-97是有规则的,但8-F单独说

表格中如果带有

I64 指令表示这个指令在64位下单独表示,例如INC和DEC

o64 只能在64位系统下使用。

d64 这个指令默认是64位,且不支持32位

f64 在64位操作系统下强制使用64位宽度

0x05 Opcode 定长指令之修改EIP

能够修改EIP的指令有JCC,call,ret三类

jcc

从上表中可以查到JCC的指令可以从 0x70~0x7F,八个指令。

image

上图是JCC指令示例

不论是70-7F中哪一个都会带有一个字节的数据,那个数据被称为偏移地址。

所以JCC普通跳转地址最大位一个字节(FF/2),80以下往下跳转,80以上往上跳转

条件跳转,后面跟一个字节立即数的偏移(有符号),共两个字节

如果条件成立调到当前指令地址+当前指令长度+LB

最大值:向前跳转7F,向后跳转80

而且当你要跳转的字节超过一个字节就会跳转到两个字节,

0F80 者就是两个字节,0F上会让你去看两字节的表同样书中会有这个表格

E

因为E指令有多个指令包含JMP,CALL,LOOP

硬编码 汇编解释 字节数
E0 LOOPNE/LOOPNZ lb(Jb) 2
E1 LOOPE/LOOPZ lb(Jb) 2
E2 LOOP Ib(Jb) 2
E3 JrCXZ Ib(Jb) 2
E8 CALL Id (Jd) 5
E9 JMP Id(Jd) 5

J是 带偏移地址

上面的是常用的不常用的先不写了

0x06 变长指令 ModR/M

MODR/M 只占一个字节八个位拆开就是下面:

image

经典的边长指令:

地址 汇编指令 特殊字符含义
0x88 MOV Eb,Gb G:通用寄存器
0x89 MOV Ev,Gv E:寄存器/内存
0x8A MOV Gb,Eb b:字节
0x8B MOV Gv,Ev v:Word doubleWord quadword

G(寄存器)是由ModR/M 中3,4,5位Reg/Opcode 决定的表格如下

寄存器宽度 000 001 010 011 100 101 110 111
32 EAX ECX EDX EBX ESP EBP ESI EDI
8 AL CL DL BL AH CH DH BH

E(寄存器)是由ModR/M中的0,1,2,6,7位Mod和R/M共同决定的:

image

注:

  • Disp是(Displacement)地址偏移的意思
  • 当查表查到--时,就表示ModR/M不能完全确定寄存器需要再跟一个字节来确定,这个字节就是SIB

现在我们查一下一些不常用的指令的指令

0x80~0x83 首先是Imediate Grp 1^1A

image

1A的意思是下面的表格

image

1A就是 3,4,5不再代表通用寄存器,而是通用寄存器

所有的带有这些角标的都可以看扩展

Grp 1是下面的表格

image

变长指令实例

具体的所有变长指令的表基本介绍完了,我们试试查找一下

81 22 08 FF

81 Ev,Iz

72 拆成字节是

0111 0010

根据ModR/M

01 110 010

结合 81 MOD 和 R/M 三个可以查出

XXX WORD ptr ds:[EDP+disp8],[immediate]

再用 reg查完整的就是

XOR WORD PTR DS:[EDP+disp8],Iz

这里还有两个未知数不知道 就是后面的数据

disp8是08 Iz就是FF

0x07 变长指令 SIB

上面有提过:

当查ModR/M表查到--时,就表示ModR/M不能完全确定寄存器需要再跟一个字节来确定,这个字节就是SIB

例如:

88 84 48

Mov [--][--]+disp32,AL

image

SIB计算是这下面计算的
Base +Index*2^{Scale}(Scale描述2^{Scale}所以只能*1,*2,*4,*8)

image

然后根据上面的数据可以查出

48

0100 1000

01 001 000

base 000 index 001 Scale 01
base=000=EAX,index=001=ECX, Scale=01=*2 \\带入公式 \\ SIB=[EAX+ECX*2] \\ 整个结果就是

MOV BYTE PTR DS:[EAX+ECX*2+disp32],AL

0x08 总结

硬编码整个过程来说,就是简略的通过查表了解CPU将数据转化成汇编指令的过程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容