Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
某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...
キーポイント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
Upcoming SlideShare
Loading in …5
×

某Ctf にて writeup

976 views

Published on

ssmjp 12/20/2016

Published in: Internet
  • Be the first to comment

某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

×