IDA 大小端序问题(BUUCTF SimpleRev)
IDA 大小端序问题(BUUCTF SimpleRev)
在 BUUCTF 刷题时,遇到下面一个十六进制内容:
1 | src[0] = 0x534C43444ELL; |
右键转换为字符后,内容如下:
1 | src[0] = 'SLCDN'; |
然后使用 SLCDN
发现解不出来题。后来查资料在知道涉及大小端序问题
什么是大小端序?
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中
下面举个例子
1 | int a = 0x12345678; |
在十六进制中,高位在左边,低位在右边
int 占据的类型大小时 四个字节,a 从低位到高位分为 78
,56
,34
,12
一共四个字节的地址,假设从 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 | src[0] = 0x534C43444ELL; |
十六进制对应字符:
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
评论