ebCTF 2013 – Bin400 – md5collidingのWriteupです。
とりあえずMD5のハッシュ値が同じで、出力は異なる5つのPEファイルを作るのが課題なので、まず出力をハッシュ値と関係ないデータを使って変化させなければなりません。そこで、実行ファイル名を使って分岐させます。c言語ではargv[0]に入っている筈です。
次にMD5の性質について調べてみます。
なので、1つのファイルから2つのMD5のハッシュ値が同じファイルを作り、それと最初のファイルの差分を取ってほかのファイルにつけていくという動作を行えば、倍々ゲームでMD5のハッシュ値が同じファイルが増えていきます。
というわけで、C++でコードを書きます。
#include <iostream>
using namespace std;
int main(char *argv[]) {
if (argv[0][0] == '1') {
//ファイル名が1で始まるとき
cout << "All Eindbazen are wearing wooden shoes" << endl;
return 0;
}
else if (argv[0][0] == '2') {
//ファイル名が2で始まるとき
cout << "All Eindbazen live in a windmill" << endl;
return 0;
}
else if (argv[0][0] == '3') {
//ファイル名が3で始まるとき
cout << "All Eindbazen grow their own tulips" << endl;
return 0;
}
else if (argv[0][0] == '4') {
//ファイル名が4で始まるとき
cout << "All Eindbazen smoke weed all day" << endl;
return 0;
}
else {
//ファイル名が5で始まるとき
cout << "All Eindbazen are cheap bastards" << endl;
return 0;
}
return 0;
}
これをコンパイルしてPEファイルに変換した後、
というツールを使ってMD5の値を衝突させます。
ファイルと一緒に実行すると、MD5が同じ値になっている2つのファイルが生成されるはずです。
あとはそれと元のファイルとの差分を取ってそれをほかのファイルにつけていけば、1 -> 2 -> 4 -> 8 とファイルが増やせ、結果5個のファイルを作ることができます。そして、ファイル名を適切に変更してサーバーに送信すればFLAGがゲットできます。(現在はサーバーは停止しています)