我有一个字符串 password
,它包含以下内容
\x79\x6F\x75\x63\x61\x6E\x74\x68\x61\x78\x6D\x65
我希望将这些内容打印为ASCII字符。我通过在十六进制字符前面添加\x
来创建这个字符串。puts(password)
无法正常工作。但是,当我执行以下操作时:
shellcode = "\x65\x61"
puts(shellcode)
它正常工作。我做错了什么吗?
在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"
解释如下:
我们提取个别组件,方法是获取一个\\x
后面的两个字符(scan(/\\x(..)/)
): [["79"], ["6F"], ["75"], ["63"], ["61"], ["6E"], ["74"], ["68"], ["61"], ["78"], ["6D"], ["65"]]
对于列表的每个元素 (map
),我们将它转换为整数 (a.first.to_int(16)
): [121, 111, 117, 99, 97, 110, 116, 104, 97, 120, 109, 101]
然后找到对应于该ASCII值的ASCII字符 (chr
): ["y", "o", "u", "c", "a", "n", "t", "h", "a", "x", "m", "e"]
最后我们把它们都连接在一起: "youcanthaxme"