2012-11-25 131 views
2

我有一个字符串password包含此打印十六进制ASCII

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

我想打印这些为ASCII字符。我通过取十六进制字符并在它们前面加上\x来创建这个字符串。 puts(password)不起作用。但是,当我做这样的事情:

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

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

回答

4

字符串在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"

+0

你是男人!非常感谢。这是最艰难的时刻。 –