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