web-dev-qa-db-ja.com

16進入力の端末エスケープ文字

私の通常のgnome-terminalでは、

netcat -u somewhere 1234

どこかにUDPパケットの送信を開始します。 16進数で書かれた次の5バイトを送信する必要があります: "01 00 af 0fe1"。では、これらの正確な5バイトをnetcatのstdinに送信するエスケープシーケンスを端末に入力するにはどうすればよいですか?

更新: 明確にするために。プログラムに必要なバイトを実際に入力する方法はいくつか知っています。それは問題ではありません。問題は、プログラムの起動後に、キーボードに表示されていない16進文字を入力するために、端末にどのようなキーストロークのシーケンスを入力するかです。 (0x00、0x01、0x0fなど)

それは不可能だと思い始めていますが、それが結論だとしたら少し驚きます。

echo -eを使用できます(これは、richardhoskinsが意味すると私が思うものです)。次のようになります。

/bin/echo -n -e "\x01\x00\xaf\x0f\xe1" | netcat -u somewhere 1234
# -n: no newline at end, -e: interpret escapes

エコーの実装が古い場合(または単にGNUがちりばめられていない場合)、昔ながらの方法は8進数を使用することです。

/bin/echo -n -e "\001\000\257\017\341" | netcat -u somewhere 1234

はい、8進数は昔ながらの方法です。 ibaseの男性のobasebcを見てください。 od( "octal dump") "od -tx1"(16進数の場合)、 "od -to1"(8進数の場合)を使用して、echoが正しい動作をするかどうかを確認します。

8
Anders Eurenius

単純なアプローチですが、探しているものとは異なります...

16進エディターを使用して、送信するバイトを含むファイルを作成します(gnomeについて言及しているため、すでにghexを使用している可能性がありますが、どの16進エディターでも問題ありません)。短い16進シーケンスの場合、通常、名前の一部として16進を含めます(例:test0x0100af0fe1)。

次に、コンテンツをnetcatにリダイレクトします。例:

mas@voco:~$ nc -o testout 127.0.1.1 80 < test0x0100af0fe1
^C
mas@voco:~$ cat testout
> 00000000 01 00 af 0e 10                                  # .....
mas@voco:~$ 

これには、別のファイルを準備する必要があるという欠点がありますが、テストの複製と文書化が容易になります。

3
mas

ターミナルの例ではPerlを使用する必要があります。

./program Perl -e' print "\x41\x60\x34\x45"'

この16進アドレスをプログラムに送信します。これは、バッファオーバーランでヘキサアドレス入力としてよく使用されます。このページには、入力したものがすべて表示されているわけではありません。グーグルでバッファオーバーフローを探してください。それらのページはあなたにすべてを示しています。入力全体の最後にあるPerlの1番目と2番目の前に一重引用符がありません。

1
Alcapone

バイトの先頭に\ xを追加します。例えば"\ x01\x00\xaf\x0f\xe1"。

0
Richard Hoskins