开端
刷题遇见了IDA小端序的逆序存储,上网查了很多资料,终于搞懂了大端序顺序以及小端序的逆序存储。
大端序与小端序
在编程语言中,一个字节占8位。在16进制中,一个字节可以表示两个16进制数。因此字节分为高位字节与低位字节。16进制数中越靠近左边的字节越高,越靠近右边的字节越低。
计算机系统中有两种不同的存储方式,大端序与小端序。
- 大端序:
-
大端序系统中,数据的最高有效字节存储在最低地址中,最低有效字节存储在最高地址中。因此数据的字节顺序是从高位到低位,即高位在前,低位在后。
-
大端序类似于将数据按照人类的阅读习惯从左到右进行存储
- 小端序:
-
小端序系统中,数据的最低有效字节存储在最低地址中,最高有效字节存储在最高地址中。因此数据的字节顺序是从低位到高位,即低位在前,高位在后。
-
小端序的设计更加符合硬件设计的需求,因为可以更容易的访问数据的低位和高位部分。
举例
假设一个四字节的整数0x12345678,在大端序与小端序的系统中的存储方式如下。
-
大端序系统
-
地址0:0x12(最高有效字节)
地址1:0x34
地址2:0x56
地址3:0x78(最低有效字节)
-
-
小端序系统
-
地址0:0x78(最低有效字节)
地址1:0x56
地址2:0x34
地址3:0x12(最高有效字节)
-
接下来结合实例进行介绍
上述为IDA反汇编后v10的16进制数据,根据上述的介绍,我们知道计算机系统存储分为大端序与小端序。我们打开数据内存中的16进制数据,发现
刚好与v10存储的数据相反,可以识别出为小端序逆序存储。
我们将数据格式改为8字节64位
发现内存中数据与v10存储数据一致,验证IDA为小端序逆序存储。
我们将v10数据转为字符类型
则v10=‘hadow’。