2019.04.19
難読化シェル芸の世界 Bashとすてきな難読化③
『難読化シェル芸の世界 Bashとすてきな難読化』。ディープでユーモアあふれる難読化シェル芸の世界に触れてみてください。
『難読化シェル芸の世界』PDF書籍をマイナビブックス・Manateeにて販売中です。
書籍の内容を一部公開! ぜひニッチでディープな世界に触れてみてください。
難読化の基本
アスキーコードを記述して実行
bashでは、16進数、8進数、Unicodeの表現でも文字として認識されます。通常のコマンドを別の表現にするだけでも難読化できます。コマンド置換で文字を生成して実行
コマンド置換の出力結果を実行したいコマンドの文字列になるようにします。 コマンド置換で実行する部分を複雑にすることで、難読化を図ることができます。manに載っていないsedのeオプションを使って実行
sedのeオプションは、引数のコマンドを実行してくれるのでこれを利用する方法です。 eオプションは通常、manに載っていません。sedを熟知していないと何しているかわかりにくくなります。フェイク(無駄な命令)
以下は全て無視されます。コードの間に入れることでより複雑な難読化を図ることができるでしょう。 システムの停止、ファイルの削除などを入れておけば、これを見た人を驚かせることができるかもしれません。 : は何も実行しないbashのビルトインコマンドですが、: があっても条件次第で後続のコマンドが実行されます。解読者を混乱させることができるでしょう。フェイク(前半処理の無視)
処理結果をパイプで渡しても、それを使わなければ実質、無視できる処理と考えることができます。以下は、前半処理を無視して、dateを実行する例です。 より複雑な難読化を考えるなら、処理の後半も無駄な処理にして、間に本当にやりたい処理を間に入れる方法が考えられます。
普通のコマンドの使い方をしない
通常、ファイルの中身を表示したいときはcat、標準出力に文字を表示したいならechoを使いますよね。 本来、目的の処理をするのに一番適したコマンドがあるはずですが、それをあえて使わないことで難読化を図ることができます。[echoの代替] [catの代替] [lsの代替] [tacの代替] 私は普段dc1)を使ったことがありません。dcを読める人は少ないはずです。
古典暗号(ROT13)で難読化する
ROT13という暗号化方式があります。古代ローマで使用されていた方式です。 古典的な暗号化方法で、現在では使われていませんが、難読化するのには有用です。 ROT13はその名のとおり、アルファベットを13文字ずらすことで暗号化しています。 複数の方法でRTO13の暗号化・復号化をすることができます。以下は、dateの文字列を暗号化した例です。複数の方法があります。 同じ処理をもう一度行えば復号化することができます。bashに渡して実行してみましょう。