跳转至

Hex(十六进制编码)

什么是16进制编码?

16 进制编码就是用十六进制(0–9 + A–F) 来表示数据的一种方式。CTF 中经常会利用 Hex 来隐藏字符串、Payload、Shellcode 或文件内容。

16 进制编码的基本原理

文本转16进制的原理是首先将文本中的每个字符根据其在特定字符集(如ASCII码、Unicode等)中的编码转换为二进制,然后将二进制数转换成十六进制数。具体来说,一个字符在计算机中通常占用一个或多个字节(例如,英文字符占一个字节,汉字通常占两个或更多字节),然后将这些字节的二进制值按顺序转换为十六进制表示形式。

16进制与ASCII

ASCII 是一种字符编码方式,每个字符用 1 个字节(8 bit) 表示。

例如:

  • 字符 A ⇒ ASCII 十进制 65
  • 二进制:01000001

一个字节 = 8 bit = 恰好可以用两个十六进制数字表示

因为:

  • 一个十六进制数字 = 4 bit
  • 所以 两个十六进制数字 = 8 bit = 1 字节

即:

1 字节  <=>  2 个 Hex 字符  <=>  1 个 ASCII 字符

举例:

ASCII 字符 ASCII 十进制 二进制 16 进制
A 65 01000001 41
B 66 01000010 42
a 97 01100001 61
0 48 00110000 30
空格 32 00100000 20

所以 Hex 和 ASCII 的关系可以这样理解:

Hex 是 ASCII 字节的十六进制表示方式。

例子

16进制转换10进制

16进制到10进制的转换,其实和2进制到10进制的转换方式一致,都是按位的权值展开。

在2进制的情况下,位权值是2的幂次,16进制的情况下,就是16的幂次,从右往左依次排列如下:

\[ 16^0, 16^1, 16^2, \ldots, 16^{15},\quad \text{其中 } A=10, B=11, \ldots, F=15 \]

例如:66(f)和6c(l)

\[ \begin{aligned} 66 &= 6 \times 16^1 + 6 \times 16^0 \\ &= 6 \times 16 + 6 \\ &= 96 + 6 \\ &= 102 \end{aligned} \]
\[ \begin{aligned} 6c &= 6 \times 16^1 + 12 \times 16^0 \\ &= 6 \times 16 + 12 \\ &= 96 + 12 \\ &= 108 \end{aligned} \]

字符串:"CTF"

ASCII 字节为:

C → 43
T → 54
F → 46

十六进制写成:

435446

也就是:

"CTF" = 0x43 0x54 0x46

字符串:"Hello"

ASCII → Hex:

H e l l o
48 65 6C 6C 6F
48656c6c6f

字符串:"flag"

66 6C 61 67