【reverse】逆向5 标志寄存器
【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,无进位,标志0
- 判断最高有效数值位向符号位产生进位否,有进位,标志1,无进位,标志0
- 将第一步和第二部得到的数字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 标志寄存器相关推荐
- 一个奇葩的标志寄存器 flag寄存器
注意: mov,push,pop等传送指令,执行结果对标志寄存器并无影响! ZF标志:结果为0,则ZF为1:不为0,ZF为0:(zero flag) PF标志:如果1的个数为偶数,pf=1:如果为奇数 ...
- 标志寄存器的详细解释
简介: CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有三种作用. (1)用来存储相关指令的某些执行结果. (2)用来为CPU执行相关指令提供行 ...
- 汇编语言随笔(3)-条件转移指令和标志寄存器
标志寄存器 标志寄存器通常具有以下三种作用: 1,用来存储相关指令的某些执行效果 2,用来为CPU执行相关指令提供行为依据 3,用来控制CPU的相关工作方式 ...
- 汇编语言--标志寄存器
标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3种作用. 用来存储相关指令的某些执行结果: 用来为CPU执行相关指令提供行为依据: 用 ...
- 8086汇编复习3 - 标志寄存器 - 使用emu8086
1 认识标志寄存器 标志寄存器 CPU内部有一种寄存器,具有三种作用: 1)存储相关指令的某些执行结果: 2)用来为CPU执行相关指令提供行为依据: 3) 用来控制CP ...
- 汇编中的通用寄存器、标志寄存器、段寄存器
通用寄存器: 寄存器和变量差不多,目的都是用于保存一些即将操作的数据 EAX(accumulator) 寄存器:扩展累加寄存器(一般在乘/除中会被主动调用),也可以用于其他用途 ECX(Count) ...
- 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示
pushf 和 popf pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中探出数据,输入标志寄存器. pushf 和 popf,为直接访问寄存器提供了方法. 格式 pushf popf ...
- 《汇编语言(第三版)》标志寄存器
标志寄存器 8086CPU中的flag寄存器包括: CF.PF.ZF.SF.OF.DF. 传送指令不影响标志寄存器 ZF标志寄存器 zf标志寄存器位于flag中的第6为,表示零标志位.(至于flag是 ...
- 8086标志寄存器介绍及作用(未完)
标志寄存器结构: 寄存器分类: 状态标志:CF(无符),PF,AF (无符),ZF,SF (有符),OF (有符) 控制标志:TF,IF,DF 1.CF标志(carry flag) 进位标志位 记录无 ...
最新文章
- 太相信书的人,格局不会太大
- 什么是SQL 注入?
- Golang 为什么不能直接将任意类型数组赋值给 []interface{}完成泛型操作
- mysql ndb 关闭_Mysql NDB 常见问题
- 阿里P8架构师谈:分布式架构设计12精讲
- 我理解的 Java 泛型
- Django处理MySQL事物的用法
- 用VS开发PHP扩展
- Baxter实战 (四)ubuntu14.04安装kinect V2
- 【BZOJ5100】[POI2018]Plan metra 构造
- 全面讲解在BIOS设置IDE设备的多种组合方式
- java jsp网页模板_JSP网页模板
- STM32F103 用CS1237 /HX711 芯片制作电子秤
- Kubernetes K8s 平台中pod资源配置详解
- take apart /ke back等动词词组
- 【Unity入门计划】Unity2D动画(2)-脚本与混合树实现玩家角色动画过渡
- 找不到工作的测试员一大把,大厂却招不到优秀软件测试员?高薪难寻测试工程师。
- 特斯拉和拼多多,到底在「较真儿」什么?
- Java习题练习:和尚挑水
- 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...
热门文章
- 功率放大器模块是什么?哪里可以采购?
- 久坐会以何种方式、何种程度伤害你的身体?
- 关于PHP 动态实例化可变化类名称
- PhpStorm 10 注册码 注册码生成器
- 阿托替抗焦虑药的交互式假设检验
- MySQL传智测试第四章答案_2020高校邦《MySQL数据库基础》免费答案2020知到《创业管理(浙江财经大学使用)》单元测试答案...
- html管理器,HTML5窗口管理器插件WinBox
- 搭建本地AOSP Gerrit Server完全指南 (二)
- 通俗易懂讲解TCP流量控制机制,了解一下
- flash特效原理:倒影效果