4

passwordこれを含む文字列があります

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

これらをASCII文字として印刷したい。この文字列は、16 進文字を取り、\xその前に を追加して作成しました。puts(password)動作しません。ただし、次のようなことをすると:

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

それはうまく動作します。私は何を間違っていますか?

4

1 に答える 1

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. \\x( scan(/\\x(..)/))に続く 2 つの文字を使用して、個々のコンポーネントを抽出します。[["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 値に対応する ascii 文字を見つけます ( chr):["y", "o", "u", "c", "a", "n", "t", "h", "a", "x", "m", "e"]

  4. 次に、joinそれらをすべてまとめます。"youcanthaxme"

于 2012-11-25T01:06:10.700 に答える