某ctf にて writeup

Post on 11-Feb-2017

472 Views

Category:

Internet

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

某 CTF にて古めかしい問題を出題した話

自己紹介• みむら

• Twitter : @mimura1133• Web : http://mimumimu.net/• どっかの会社でほのぼのと生息しています。

ところで・・。私も最近 CTF をやっています

さて。•最近、こんな古めかしい画面の UI を

見た方はいませんか?

ごめんなさい出題者です•Retrospective = 回顧的な .• ちょっと懐かしめの問題を出しても

いいかなと思いまして・・。

• 今日は Write-up があんまり出ていないようなのでこの場でなんとなく Write-up してみようかと。

解き方

キーポイント 1•文字列は

“ SECCON{“ で始まり “ }” で終わる .

• これが満たされないと エラーになる .

キーポイント 2•入力エリアの制約より• 文字数は全部で 28 文字以内 .

キーポイント 3• 文字列は

“ _” で分割される .

• そのうち 1 つめはSECCON{LEGACY_

• これが満たされないと エラーになる .

キーポイント 4• 2 ブロック目 // 仮に s[1]3 ブロック目 // 仮に s[2]• n=0;

for(i=0;i<strlen(s[1]);i++) i+=str[1][i]*(4^i);if(n != 350 OR strlen(s[1]) != 2) break; // ERROR.

• n = n*256;for(i=0;i<strlen(s[2]);i++) i+=str[1][i]*(4^i);if(n != 89686) break; // ERROR.

• 故に 89686-(350*256) = 86 = ‘V’. であり 2 文字目は’ B’ となりSECCON{LEGACY_VB_?_????} ということが分かる .

• また 3 ブロック目は 1 文字ということも分かる .

キーポイント 5

•すべての文字を下記の式で足すと0x620F3671 になる .• n = 0;

for(i=0;i<strlen(text);i++) n += text[i]*(2^i);

キーポイント 6

•8B292F1A-9C4631B3-E13CD49C-64EF7454-0352D0C0 は SHA1 の値 .• 初期ベクトル値と桁数で判定 .

ということでどう解く?

私の場合・・• 2 段階構成のソルバーを書きました。•不明な部分にランダムに初期値を入れて

合計値が一番近くなるように値をランダムに変更していく手法で近似 .

1 段目•既知の文字列である

“ SECCON{LEGACY_VB_”を元にまず 3 セグメント目 を求める .• 文字列合計値が 0x620F3671 になることを利用 .• 合計値がピッタリ合う組み合わせから

最もらしい値を出す “ P” が選択される .

2 段目•ここまでで求まっている文字列

“ SECCON{LEGACY_VB_P_????}”を元に文字列を探索する .• 合計値でマッチしたあとに

SHA1 が合致するかを探索• SECCON{LEGACY_VB_P_CODE} になる。フラグ。

というわけで

某 CTF にて古めかしい問題(Retrospective) を出題した話疑問がありましたらこちらまで:

@mimura1133

top related