IDA 大小端序问题(BUUCTF SimpleRev)

在 BUUCTF 刷题时,遇到下面一个十六进制内容:

1
src[0] = 0x534C43444ELL;

右键转换为字符后,内容如下:

1
src[0] = 'SLCDN';

然后使用 SLCDN 发现解不出来题。后来查资料在知道涉及大小端序问题

什么是大小端序?

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中

下面举个例子

1
int  a  =  0x12345678

在十六进制中,高位在左边,低位在右边

int 占据的类型大小时 四个字节,a 从低位到高位分为 78563412

一共四个字节的地址,假设从 0x1001 ~ 0x1004

![](/img-post/端序.png)

对于小端序,是这样存储的:

地址 存储内容
0x1001 78
0x1002 56
0x1003 34
0x1004 12

小端序**数据的低位存储在低地址位,数据的高位存储在高地址位,小端字节序称为 LSB**

对于大端序,是这样存储的:

地址 存储内容
0x1001 12
0x1002 34
0x1003 56
0x1004 78

大端序**数据的低位存储在高地址位,数据的高位存储在低地址位,大端字节序称为 MSB**

在网络编程中,计算机的 IP 地址,在系统中都是以大端字节序来存储的(网络字节序),以确保不同系统之间的数据一致性。

数据在内存中具体按照小端序还是大端序,取决于架构:

  • 小端序:x86、x86-64(Intel 和 AMD 处理器)等大多数现代桌面和服务器处理器使用小端序。
  • 大端序:一些网络协议和某些处理器(如早期的 PowerPC、SPARC)使用大端序。
  • 双端序(Bi-endian):一些处理器(如 ARM、PowerPC)可以配置为使用小端序或大端序。

解题

die 查壳

操作系统: Ubuntu Linux(ABI: 3.2.0)[AMD64, 64 位, DYN]

所以内存在数据中应该是小端序,也就是数据的低位存储在低地址位,数据的高位存储在高地址位

IDA 中转换为:

1
2
src[0] = 0x534C43444ELL;
src[0] = 'SLCDN';

十六进制对应字符:

hex char
53 S
4c L
43 C
44 D
4E N

IDA 将十六进制按照大端序转换为字符串,和小端序完全相反

所以正确解题需要将SLCDN反转为NDCLS

扩展

在本题的反汇编中还发现了v8[0] = 0x776F646168LL;

在 IDA 转化后为 wodah

十六进制对应字符:

HEX CHAR
77 w
6F o
64 d
64 a
68 h

所以也是按照大端序转换的,使用时候也需要反转为 hadow