環境変数のバイナリ内容を表示するには?

環境変数のバイナリ内容を表示するには?

私はキャプチャフラグ(CTF)を練習しており、環境変数の内容を見たいです。

MyEnv=`python3 -c 'print(64*"A"+"\x0a\x09\x0a\x0d",end="")'`

hexdump配管を入力すると、次のようになりますecho

$ echo -n $MyEnv | hexdump -Cv
00000000  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
00000010  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
00000020  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
00000030  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
00000040  20 0d                                             | .|
00000042

echoこれは、最後の4つの16進数を印刷するのを気にすることに関連しています。

MyEnvしかし、練習問題を解決したので、最後の4桁が含まれていることを知っています。

環境変数のバイナリの内容を表示するには?

答え1

$MyEnvいいえ、引用符のない変数が分割され、変数の文字[1]を切り取ることに関連していますIFS。デフォルトでは、空白(\x20)、タブ(\x09)、および改行(\x0a)です。次に、スペース接続()echoを使用して分割フィールドを作成します。\x20

これらの文字を表示するには、変数を引用して$MyEnv代わりprintfecho -n[2]を使用してください。

$ printf %s "$MyEnv" | hexdump -Cv
...
00000040  0a 09 0a 0d                                       |....|
00000044

通常、環境変数にバイナリデータを保存することはできません。バイナリデータにはNULバイト(\0)を含めることができ、環境変数の値は0で終わる文字列です。 NULバイトはbash内部(エクスポートされていない)変数には適用されません。

[1] IFSの文字が「空白」でない場合、シェルは実際に単一の文字を分割して空のフィールドを生成できます。完全な説明は次の場所にあります。フィールド分割標準部品

[2]echo標準シェルは、\n変数をより複雑にすることができるいくつかのバックスラッシュエスケープ(たとえば、改行文字など)を解釈できます。

関連情報