某Ctf にて writeup

229 views

Published on

ssmjp 12/20/2016

Published in: Internet
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
229
On SlideShare
0
From Embeds
0
Number of Embeds
34
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

某Ctf にて writeup

  1. 1. 某CTF にて 古めかしい問題を 出題した話
  2. 2. 自己紹介 • みむら • Twitter : @mimura1133 • Web : http://mimumimu.net/ • どっかの会社でほのぼのと生息しています。
  3. 3. ところで・・。 私も最近 CTF をやっています
  4. 4. さて。 • 最近、こんな古めかしい画面の UI を 見た方はいませんか?
  5. 5. ごめんなさい出題者です • Retrospective = 回顧的な. • ちょっと懐かしめの問題を出しても いいかなと思いまして・・。 • 今日は Write-up があんまり出ていないようなので この場でなんとなく Write-up してみようかと。
  6. 6. 解き方
  7. 7. キーポイント1 • 文字列は “SECCON{“ で 始まり “}” で終わる. • これが満たされないと エラーになる.
  8. 8. キーポイント2 • 入力エリアの制約より • 文字数は全部で 28文字以内.
  9. 9. キーポイント3 • 文字列は “_” で分割される. • そのうち1つめは SECCON{LEGACY_ • これが満たされないと エラーになる.
  10. 10. キーポイント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文字ということも分かる.
  11. 11. キーポイント5 • すべての文字を 下記の式で足すと 0x620F3671 になる. • n = 0; for(i=0;i<strlen(text);i++) n += text[i]*(2^i);
  12. 12. キーポイント6 •8B292F1A-9C4631B3-E13CD49C- 64EF7454-0352D0C0 は SHA1 の値. • 初期ベクトル値と桁数で判定.
  13. 13. ということでどう解く?
  14. 14. 私の場合・・ • 2段階構成のソルバーを書きました。 • 不明な部分にランダムに初期値を入れて 合計値が一番近くなるように 値をランダムに変更していく手法で近似.
  15. 15. 1段目 • 既知の文字列である “SECCON{LEGACY_VB_” を元にまず 3セグメント目 を求める. • 文字列合計値が 0x620F3671 になることを利用. • 合計値がピッタリ合う組み合わせから 最もらしい値を出す  “P” が選択される.
  16. 16. 2段目 • ここまでで求まっている文字列 “SECCON{LEGACY_VB_P_????}” を元に文字列を探索する. • 合計値でマッチしたあとに SHA1 が合致するかを探索 • SECCON{LEGACY_VB_P_CODE} になる。フラグ。
  17. 17. というわけで
  18. 18. 某CTF にて 古めかしい問題 (Retrospective)を 出題した話 疑問がありましたらこちらまで: @mimura1133

×