【reverse】逆向5 标志寄存器

1、引言

通过一个creak.exe文件的爆破,引出现阶段需要学习的知识

2、标志寄存器

标志寄存器有上图这么多个

记住这几个寄存器的位置和名称

下面是6个状态标志位

1.进位标志CF(Carry Flag)

如果运算结果的最高位产生了一个进位或者借位,那么其值为1,否则为0

做个实验

我们先给eax一个5555FFFF的数据,然后再加1

然后将c变成0

运行这两句汇编

发现eax虽然进位了,但不是最高位进位,因为eax是32位的

我们再试一试al

把所有标记寄存器归为0

运行这两句汇编

al是FF,加1之后溢出,但是实际上最高位也就是第八位,进位了,所以c为1

所以,一定要注意是最高位

2. 奇偶标志PF(Parity Flag)

奇偶标志PF用于反映运算结果中最低有效字节中“1”的个数的奇偶性

注意是最低有效字节,也就是只看最后两位

如果“1”的个数为偶数,则PF的值为1,反之为0(一定转为二进制来看)

我们运行下面的指令

首先将al赋值0

然后让al+0x3

hex中0+3 = 3

转为2进制,3 = 0011,有两个1,所以p为1

再执行+3的指令

hex中3+3 = 6

转为2进制,6 = 0110,有两个1,所以p为1

再执行+2的指令

hex中6 + 2 = 8

转为2进制,8 = 1000,只有1个1,所以p=0

3.辅助进位标志AF(Auxiliary Carry Flag)

发生下列情况的时候,辅助进位标志AF的值被置为1,否则为0

  • 在字操作时,发生低字节向高字节进位或者借位时
  • 再字节操作时,发生低4位向高4位进位或者借位时

看我绿笔画的圈,这个位置的数进不进位,进位就是1,否则是0

4.零进位标志ZF(Zero Flag)

零标志位ZF用来反映运算结果是否为0

如果运算结果为0,ZF=1,否则为0

mov指令不算运算

看这句指令,让eax和自己异或,两个相同的数字异或=0,所以计算结果为0,所以ZF= 1

5.符号标志SF(Sign Flag)

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同

首先确定一点,mov指令不影响标志寄存器

第一句汇编,让al存0x7F (0111 1111)

第二句汇编,让al+2

0111 1111 + 0000 0010 = 1000 0001

符号位(也就是从左向右第一位)运算后是1,所以SF=1

6.溢出标志OF(Overflow Flag)

溢出标志OF用于反映有符号数加减运算所得结果是否溢出

如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值置为1,否则OF的值被清为0

如何辨别CF和OF?

CF是最高位进位,而OF时有符号数的溢出

有符号数的范围:

  • 正数:0~7F
  • 负数:FF~80

有无符号是程序员代码规定的,不是计算机规定的,计算机内相同的数——FF,如果是有符号,那就是-1,如果无符号,那就是15

举几个例子

8位,无符号范围是0~FF

有符号数的范围:正数:0~7F;负数:FF~80

  • 无符号、有符号都不溢出

    mov al,8
    add al,8
    
  • 无符号溢出,有符号不溢出(-1+2)

    mov al,0xff
    add al,2
    
  • 无符号不溢出(小于FF),有符号溢出(最大的正数还+2,溢出,成为负数)

    mov al,7f
    add al,2
    
  • 无符号(大于FF)、有符号(最小的负数还加负数,两负数相加得到正数)都溢出

    mov al,0xfe
    add al,0x80
    

然后计算机最底层的处理OF标志其实是这样的:

  1. 判断符号位是否有进位,有进位,标志1,无进位,标志0
  2. 判断最高有效数值位向符号位产生进位否,有进位,标志1,无进位,标志0
  3. 将第一步和第二部得到的数字xor一下,得到的数字就是OF标志位的数字

我们看下面这个例子(OF的前提是必须是有符号数

3、指令

1.ADC指令

adc指令就是带**进位的加法(**这个进位就看CF进位标志,是1就进位,0就不进)

格式:adc R/M,R/M/IMM

R是寄存器,M是内存,IMM是立即数

两边不能同时为内存,且宽度要一样

adc al,cl
adc byte ptr ds:[12ffc4],2
adc byte ptr ds:[12ffc4],al

2.SBB指令

sbb就是带借位的减法(借位也是看CF标志,是1就借位,反之不借)

格式:adc R/M,R/M/IMM

R是寄存器,M是内存,IMM是立即数

两边不能同时为内存,且宽度要一样

sbb al,cl
sbb byte ptr ds:[12ffc4],2
sbb byte ptr ds:[12ffc4],al

3.XCHG指令

xchg指令是交换数据的指令

格式:XCHG R/M,R/M 两边不能同时为内存,宽度要一样

xchg al,cl
xchg dword ptr ds:[12ffc4],eax
xchg byte prt ds:[12ffc4],al

4.MOVS指令

movs指令是移动数据的指令,这个指令必须对edi和esi使用

这个指令有点特殊,我们之前学习的指令都是不能两边同时为内存的

但是这个指令,他必须两边都是内存,且都是edi和esi使用的!

movs byte ptr es:[edi],byte ptr ds:[esi] 简写为:movsb
movs word ptr es:[edi],word ptr ds:[esi]    简写为:movsw
movs dword ptr es:[edi],dword ptr ds:[esi]  简写为:movsd

movsb:移动esi中地址数据到edi中,同时esi、edi都加1

movsw:移动esi中地址数据到edi中,同时esi、edi都加2

movsd:移动esi中地址数据到edi中,同是esi、edi都加4

esi和edi的加和减是由DF标志寄存器决定的,DF=0就是加,DF=1就是减

5.STOS指令

stos指令是将al/ax/eax的值存到[edi]指定的内存单元

stos byte ptr es:[edi]       简写为stosb
stos word ptr es:[edi]      简写为stosw
sots dword ptr es:[edi]     简写为stosd

存哪个寄存器由是数据宽度决定的

byte是al

word是ax

dword是eax

同样的

edi的加和减是由DF标志寄存器决定的,DF=0就是加,DF=1就是减。

加减的值也是和位数相关

byte ± 1

word ± 2

dword ± 4

6.REP指令

按计数寄存器 (ECX) 中指定的次数重复执行字符串指令

mov ecx,10
rep movsd
rep stosd

这里给ecx存10是hex形式,所以循环了16次

rep movsd就是循环16次将esi的值赋给edi,当然,因为刚刚我们提到了DF标志位,所以会根据DF的值来自增或自减。这里是dword,所以是±4

rep stosd就是将eax中的值存入edi中16次,这里的edi的±也是通过DF标志位来的。DF=1是减,DF=0是加

4、本节练习

海哥布置的作业,有机会补上!

【reverse】逆向5 标志寄存器相关推荐

  1. 一个奇葩的标志寄存器 flag寄存器

    注意: mov,push,pop等传送指令,执行结果对标志寄存器并无影响! ZF标志:结果为0,则ZF为1:不为0,ZF为0:(zero flag) PF标志:如果1的个数为偶数,pf=1:如果为奇数 ...

  2. 标志寄存器的详细解释

    简介:    CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有三种作用.    (1)用来存储相关指令的某些执行结果.    (2)用来为CPU执行相关指令提供行 ...

  3. 汇编语言随笔(3)-条件转移指令和标志寄存器

    标志寄存器 标志寄存器通常具有以下三种作用:       1,用来存储相关指令的某些执行效果       2,用来为CPU执行相关指令提供行为依据       3,用来控制CPU的相关工作方式     ...

  4. 汇编语言--标志寄存器

    标志寄存器      CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3种作用. 用来存储相关指令的某些执行结果: 用来为CPU执行相关指令提供行为依据: 用 ...

  5. 8086汇编复习3 - 标志寄存器 - 使用emu8086

    1 认识标志寄存器 标志寄存器     CPU内部有一种寄存器,具有三种作用:     1)存储相关指令的某些执行结果:     2)用来为CPU执行相关指令提供行为依据:     3) 用来控制CP ...

  6. 汇编中的通用寄存器、标志寄存器、段寄存器

    通用寄存器: 寄存器和变量差不多,目的都是用于保存一些即将操作的数据 EAX(accumulator) 寄存器:扩展累加寄存器(一般在乘/除中会被主动调用),也可以用于其他用途 ECX(Count) ...

  7. 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示

    pushf 和 popf pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中探出数据,输入标志寄存器. pushf 和 popf,为直接访问寄存器提供了方法. 格式 pushf popf ...

  8. 《汇编语言(第三版)》标志寄存器

    标志寄存器 8086CPU中的flag寄存器包括: CF.PF.ZF.SF.OF.DF. 传送指令不影响标志寄存器 ZF标志寄存器 zf标志寄存器位于flag中的第6为,表示零标志位.(至于flag是 ...

  9. 8086标志寄存器介绍及作用(未完)

    标志寄存器结构: 寄存器分类: 状态标志:CF(无符),PF,AF (无符),ZF,SF (有符),OF (有符) 控制标志:TF,IF,DF 1.CF标志(carry flag) 进位标志位 记录无 ...

最新文章

  1. 太相信书的人,格局不会太大
  2. 什么是SQL 注入?
  3. Golang 为什么不能直接将任意类型数组赋值给 []interface{}完成泛型操作
  4. mysql ndb 关闭_Mysql NDB 常见问题
  5. 阿里P8架构师谈:分布式架构设计12精讲
  6. 我理解的 Java 泛型
  7. Django处理MySQL事物的用法
  8. 用VS开发PHP扩展
  9. Baxter实战 (四)ubuntu14.04安装kinect V2
  10. 【BZOJ5100】[POI2018]Plan metra 构造
  11. 全面讲解在BIOS设置IDE设备的多种组合方式
  12. java jsp网页模板_JSP网页模板
  13. STM32F103 用CS1237 /HX711 芯片制作电子秤
  14. Kubernetes K8s 平台中pod资源配置详解
  15. take apart /ke back等动词词组
  16. 【Unity入门计划】Unity2D动画(2)-脚本与混合树实现玩家角色动画过渡
  17. 找不到工作的测试员一大把,大厂却招不到优秀软件测试员?高薪难寻测试工程师。
  18. 特斯拉和拼多多,到底在「较真儿」什么?
  19. Java习题练习:和尚挑水
  20. 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...

热门文章

  1. 功率放大器模块是什么?哪里可以采购?
  2. 久坐会以何种方式、何种程度伤害你的身体?
  3. 关于PHP 动态实例化可变化类名称
  4. PhpStorm 10 注册码 注册码生成器
  5. 阿托替抗焦虑药的交互式假设检验
  6. MySQL传智测试第四章答案_2020高校邦《MySQL数据库基础》免费答案2020知到《创业管理(浙江财经大学使用)》单元测试答案...
  7. html管理器,HTML5窗口管理器插件WinBox
  8. 搭建本地AOSP Gerrit Server完全指南 (二)
  9. 通俗易懂讲解TCP流量控制机制,了解一下
  10. flash特效原理:倒影效果