我有一個字符串password
包含此打印十六進制ASCII
\x79\x6F\x75\x63\x61\x6E\x74\x68\x61\x78\x6D\x65
我想打印這些爲ASCII字符。我通過取十六進制字符並在它們前面加上\x
來創建這個字符串。 puts(password)
不起作用。但是,當我做這樣的事情:
shellcode = "\x65\x61"
puts(shellcode)
它工作得很好。我究竟做錯了什麼?
我有一個字符串password
包含此打印十六進制ASCII
\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的微妙變化而變化,這有點複雜。
如果你有一個字符串,單引號或者創建並從其他來源來(說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"
爲了解釋:
我們通過採取以下的\\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值(chr
)ASCII字符:["y", "o", "u", "c", "a", "n", "t", "h", "a", "x", "m", "e"]
然後我們join
它們放在一起:"youcanthaxme"
你是男人!非常感謝。這是最艱難的時刻。 –