password
これを含む文字列があります
\x79\x6F\x75\x63\x61\x6E\x74\x68\x61\x78\x6D\x65
これらをASCII文字として印刷したい。この文字列は、16 進文字を取り、\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(..)/)
)に続く 2 つの文字を使用して、個々のコンポーネントを抽出します。[["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"]
次に、join
それらをすべてまとめます。"youcanthaxme"