バランスを取りたい

よくCTFの記事を書きます

CSAW CTF 2013 Reversing 150 Write-up

f:id:xrekkusu:20130923123414p:plain

見た感じ.NETのアセンブリだからとりあえずILSpyで開いてみます。


f:id:xrekkusu:20130923123205p:plain



あっ…(察し)



なんて騒いでないで.NETの知識を使ってガンガン進んでいきましょう。


Submitボタンを押すとClickイベントが走るのでそこに何かがあるはずです。

Clickイベントといえば (object sender, EventArgs e)ですね。

private void eval_ᜀ(object obj, EventArgs eventArgs)
{
	string strB = null;
	Assembly executingAssembly = Assembly.GetExecutingAssembly();
	ResourceManager resourceManager = new ResourceManager(executingAssembly.GetName().Name + ".Resources", executingAssembly);
	DateTime now = DateTime.Now;
	string arg_65_0 = this.eval_ᜀ.Text;
	string value = string.Format("{0}", now.Hour + 1);
	string text = "NeEd_MoRe_Bawlz";
	this.eval_ᜀ(text, Convert.ToInt32(value), ref strB);
	if (string.Compare(arg_65_0.ToUpper(), strB) == 0)
	{
		this.eval_ᜂ.Text = "";
		this.eval_ᜀ(this.eval_ᜀ(107));
		this.eval_ᜁ();
		this.eval_ᜂ.Text = string.Format(this.eval_ᜂ.Text, this.eval_ᜀ(resourceManager));
		this.eval_ᜃ.Image = (Bitmap)resourceManager.GetObject("Sorry You Suck");
	}
	else
	{
		this.eval_ᜃ.Image = (Bitmap)resourceManager.GetObject("Almost There");
		this.eval_ᜀ();
	}
}


if(string.Compare(...))なんてのが見えます。
この条件をtrueにすればフラグが表示されそうです。


ifの1行前を見ると、ref付きで何かの関数に処理を投げています。

private void eval_ᜀ(string text, int num, ref string ptr) {
  int num2 = 0;
  if (0 < text.Length) {
    do {
      char c = text[num2];
      int num3 = 1;
      if (1 < num) {
        do {
          c = Convert.ToChar(this.eval_ᜀ(Convert.ToInt32(c), num3));
          num3++;
        }
        while (num3 < num);
      }
      ptr += c;
      num2++;
    }
    while (num2 < text.Length);
  }
  ptr = this.eval_ᜀ(ptr);
}

中盤、終盤のevalはそれぞれこんな感じになってます。

private int eval_ᜀ(int num, int num2) {
  return (new int[] {
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113
  })[num2] ^ num;
}
private string eval_ᜀ(string s) {
  byte[] bytes = Encoding.ASCII.GetBytes(s);
  return BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(bytes)).Replace("-", "");
}


NeEd_MoRe_Bawlzを暗号化した文字列と、ユーザーから入力された文字列が一致してればいいみたいな空気です。
しかもそれは1時間ごとに変わるらしい。


ということなので手っ取り早く上のコードをうまく繋ぎあわせて入力すべき文字列が表示されるようなプログラムを作ります。



そしてフラグをゲットします。

f:id:xrekkusu:20130923131456p:plain



でもこのフラグは通りませんでした…


というのも、途中に出てくるNeEd_MoRe_BawlzをGoogleで検索すると大量のideoneがヒットして、そこを見るだけで解けてしまうっぽいです。


[追記]

実際は元の文字列が文字化けして????????...なってたのをコンバートした結果?????...のハッシュ値になってしまっていたという情報。

通らないからここからもう一捻りかと思って調べたら?????...のハッシュであることは理解してたんだけどねえ…。

======


なので"If your key isn't working PM ColdHeat on IRC"に従ってPMを送ってみると、


"how did you get the key?"


あっ…あっ…(英語ができない)


"i used ILSpy"

"describe more. go in depth"


あっ…あっ…



ってな感じで時間かけてやりとりした結果30分後にフラグを入手、150ポイントが手にはいりました。



というわけで "how did you get the key?" に対する答えでした。