将十六进制打印成ASCII

4

我有一个字符串 password,它包含以下内容

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

我希望将这些内容打印为ASCII字符。我通过在十六进制字符前面添加\x来创建这个字符串。puts(password)无法正常工作。但是,当我执行以下操作时:

shellcode = "\x65\x61"
puts(shellcode)

它正常工作。我做错了什么吗?

1个回答

5

在Ruby中,字符串是一个奇怪的东西,它们的处理在Ruby 1.9中略微改变,这使得事情有些复杂。

如果你有由单引号创建并来自其他源(比如数据库)的字符串,那么如果你使用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. 我们提取个别组件,方法是获取一个\\x后面的两个字符(scan(/\\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值的ASCII字符 (chr): ["y", "o", "u", "c", "a", "n", "t", "h", "a", "x", "m", "e"]

  4. 最后我们把它们都连接在一起: "youcanthaxme"


你太棒了!非常感谢。那个问题真的让我很头疼。 - Jaron Bradley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接