私はキャプチャフラグ(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
代わりprintf
にecho -n
[2]を使用してください。
$ printf %s "$MyEnv" | hexdump -Cv
...
00000040 0a 09 0a 0d |....|
00000044
通常、環境変数にバイナリデータを保存することはできません。バイナリデータにはNULバイト(\0
)を含めることができ、環境変数の値は0で終わる文字列です。 NULバイトはbash
内部(エクスポートされていない)変数には適用されません。
[1] IFSの文字が「空白」でない場合、シェルは実際に単一の文字を分割して空のフィールドを生成できます。完全な説明は次の場所にあります。フィールド分割標準部品
[2]echo
標準シェルは、\n
変数をより複雑にすることができるいくつかのバックスラッシュエスケープ(たとえば、改行文字など)を解釈できます。