hello
and hb
以更易读的方式定义字节串。
The h2bin(x)
函数完成所有工作:
def h2bin(x):
return x.replace(' ', '').replace('\n', '').decode('hex')
因此,十六进制数字字符串已删除所有空格,然后从十六进制解码为字节:
>>> '16 03 02 00 dc'.replace(' ', '')
'16030200dc'
>>> '16 03 02 00 '.replace(' ', '').decode('hex')
'\x16\x03\x02\x00\xdc'
它只是使用十六进制表示法和额外空格指定一系列字节的紧凑方法。
十六进制数据本身只是一个普通数据心跳协议消息 https://www.rfc-editor.org/rfc/rfc6520,以原始字节为单位。这hello
字符串包含一个TLS 1.1 记录消息 https://www.rfc-editor.org/rfc/rfc4346,由第一个字节标识(16
十六进制,十进制22)作为握手记录,发送client_hello
(第六个字节是01
)。这只是建立一个 TLS 会话,告诉服务器客户端支持哪种密码。其中包含什么并不重要,除了它告诉服务器客户端支持 Heartbeat 扩展(a00 0f
消息末尾的字节对)。
它是hb
message这真的很有趣:
hb = h2bin('''
18 03 02 00 03
01 40 00
''')
18
是心跳内容类型记录,03 02
标识 TLS 1.1 协议版本。这00 03
表示消息的有效负载有多大; 3 个字节,或第二行的全部。
消息本身的3个字节由心跳类型(01
,或“请求”),以及消息长度(40 00
,16384 字节),然后是没有实际消息。这会导致损坏的 SSL 服务器发回包含 16kb 内存的心跳响应;不存在的0长度请求消息被回显加上内存以弥补请求长度。