我有一个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]
chr
然后我们找到与该 ascii 值 ( )对应的 ascii 字符:["y", "o", "u", "c", "a", "n", "t", "h", "a", "x", "m", "e"]
然后我们join
一起:"youcanthaxme"