前回の記事同様、きっかけはCTF。
先日参加した社内のCTFに.NETファイルを取り扱った問題がありました。
「.NETファイルならdnSpyでデコンパイルしてコードを眺めればすぐ解けそう!」と思い勇んで挑戦しました。
ファイルをdnSpyで開いてコードを眺めていたところ、怪しげなXOR演算を行う関数を発見。関数の引数に渡された値と関数内でハードコードされている配列内の値をXORする模様。
さらに解析を続けたところ、件のXOR関数を呼び出している箇所を発見したのですが。。。
internal static readonly string MyFlag = <SuspiciousXOR>.cs("OÊõÍ\u001dØ2xUY\"^\u009a&Ðô°dC/Ò\u0082®±-\u0080£m4»÷\u001b\u0005\u0017ê)Ø@\u009f\u009c¦x");
なにやら文字化けのような感じになっており、XOR演算を試みようにも元の値が判読できない。結局解けないまま時間切れ。
後日、ほかの正答者に聞いてみたところ、de4dotを使って難読化を解除すれば解けるとのこと。
ちなみにDetect It Easy (DIE)を使うとファイルに難読化が施されているか手っ取り早く確認できる。
de4dotは.NETファイルのアンパックおよび難読化解除を行うオープンソース・ツールです。
アドバイスに従い、de4dotを使ってみました。
de4dot.exe Challenge.dll -o out.dll
out.dllをdnSpyで開いてみたところ難読化が解除されていました。
internal static readonly string MyFlag = "FLAG{ko_no_flag_ha_dummy_desu_yoooooooooo}";
※Flagの値はオリジナルの問題から変更してあります。
以上。