将十六进制打印为 ASCII



我有一个包含这个的字符串password

x79x6Fx75x63x61x6Ex74x68x61x78x6Dx65

我想将它们打印为 ASCII 字符。 我通过获取十六进制字符并在它们前面添加x来创建此字符串。 puts(password)不起作用。但是,当我执行以下操作时:

shellcode = "x65x61"
puts(shellcode)

它工作得很好。 我做错了什么?

字符串在 Ruby 中是一种奇怪的野兽,它们的处理方式在 Ruby 1.9 中发生了微妙的变化,这让事情变得有些复杂。

如果您使用单引号创建该字符串并且来自其他来源(例如DB),那么如果您inspect它,您将看到:

"\x79\x6F\x75\x63\x61\x6E\x74\x68\x61\x78\x6D\x65"

您可以通过少量列表处理来处理它:

s.scan(/\x(..)/).map{|a| a.first.to_i(16).chr}.join
# => "youcanthaxme" 

解释一下:

  1. 我们通过取一个\xscan(/\x(..)/)):后面的两个字符来提取各个组件[["79"], ["6F"], ["75"], ["63"], ["61"], ["6E"], ["74"], ["68"], ["61"], ["78"], ["6D"], ["65"]]

  2. 对于列表的每个元素(map),我们将其转换为整数(a.first.to_int(16)):[121, 111, 117, 99, 97, 110, 116, 104, 97, 120, 109, 101]

  3. 然后我们找到对应于该 ascii 值 ( chr ) 的 ascii 字符 : ["y", "o", "u", "c", "a", "n", "t", "h", "a", "x", "m", "e"]

  4. 然后我们把它们一起join"youcanthaxme"

最新更新