CTF Writeup SECCON 2016 » 履歴 » バージョン 1
kanata, 2025/04/13 15:13
| 1 | 1 | kanata | # CTF Writeup SECCON 2016 |
|---|---|---|---|
| 2 | |||
| 3 | {{toc}} |
||
| 4 | |||
| 5 | # 結果&感想 |
||
| 6 | |||
| 7 | 某チームでSECCON2016に参加しました。 |
||
| 8 | 今年は全体的に難易度が高かったですね。。ExploitとCryptoが多めでした。 |
||
| 9 | |||
| 10 | どっちも専門知識や職人芸的な技能が試されるので、全体的に苦戦されたんじゃないかと思います。 |
||
| 11 | |||
| 12 | |||
| 13 | いちおう200点問題ができたのと、ちょっとアシストできたと思われる100点の問題について、writeupを書きます。 |
||
| 14 | |||
| 15 | # Vigenere |
||
| 16 | Crypto問 100点 777チーム回答 |
||
| 17 | |||
| 18 | 以下、問題前文 |
||
| 19 | |||
| 20 | ~~~ |
||
| 21 | k: ???????????? |
||
| 22 | p: SECCON{???????????????????????????????????} |
||
| 23 | c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ |
||
| 24 | |||
| 25 | k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe |
||
| 26 | |||
| 27 | |ABCDEFGHIJKLMNOPQRSTUVWXYZ{} |
||
| 28 | -+---------------------------- |
||
| 29 | A|ABCDEFGHIJKLMNOPQRSTUVWXYZ{} |
||
| 30 | B|BCDEFGHIJKLMNOPQRSTUVWXYZ{}A |
||
| 31 | C|CDEFGHIJKLMNOPQRSTUVWXYZ{}AB |
||
| 32 | D|DEFGHIJKLMNOPQRSTUVWXYZ{}ABC |
||
| 33 | E|EFGHIJKLMNOPQRSTUVWXYZ{}ABCD |
||
| 34 | F|FGHIJKLMNOPQRSTUVWXYZ{}ABCDE |
||
| 35 | G|GHIJKLMNOPQRSTUVWXYZ{}ABCDEF |
||
| 36 | H|HIJKLMNOPQRSTUVWXYZ{}ABCDEFG |
||
| 37 | I|IJKLMNOPQRSTUVWXYZ{}ABCDEFGH |
||
| 38 | J|JKLMNOPQRSTUVWXYZ{}ABCDEFGHI |
||
| 39 | K|KLMNOPQRSTUVWXYZ{}ABCDEFGHIJ |
||
| 40 | L|LMNOPQRSTUVWXYZ{}ABCDEFGHIJK |
||
| 41 | M|MNOPQRSTUVWXYZ{}ABCDEFGHIJKL |
||
| 42 | N|NOPQRSTUVWXYZ{}ABCDEFGHIJKLM |
||
| 43 | O|OPQRSTUVWXYZ{}ABCDEFGHIJKLMN |
||
| 44 | P|PQRSTUVWXYZ{}ABCDEFGHIJKLMNO |
||
| 45 | Q|QRSTUVWXYZ{}ABCDEFGHIJKLMNOP |
||
| 46 | R|RSTUVWXYZ{}ABCDEFGHIJKLMNOPQ |
||
| 47 | S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR |
||
| 48 | T|TUVWXYZ{}ABCDEFGHIJKLMNOPQRS |
||
| 49 | U|UVWXYZ{}ABCDEFGHIJKLMNOPQRST |
||
| 50 | V|VWXYZ{}ABCDEFGHIJKLMNOPQRSTU |
||
| 51 | W|WXYZ{}ABCDEFGHIJKLMNOPQRSTUV |
||
| 52 | X|XYZ{}ABCDEFGHIJKLMNOPQRSTUVW |
||
| 53 | Y|YZ{}ABCDEFGHIJKLMNOPQRSTUVWX |
||
| 54 | Z|Z{}ABCDEFGHIJKLMNOPQRSTUVWXY |
||
| 55 | {|{}ABCDEFGHIJKLMNOPQRSTUVWXYZ |
||
| 56 | }|}ABCDEFGHIJKLMNOPQRSTUVWXYZ{ |
||
| 57 | ~~~ |
||
| 58 | |||
| 59 | 問題タイトルから[ヴィジュネル暗号](https://ja.wikipedia.org/wiki/%E3%83%B4%E3%82%A3%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%AB%E6%9A%97%E5%8F%B7)であることが解る。暗号の仕組みとしては難しくない。 |
||
| 60 | |||
| 61 | 暗号文、平文、キーの内、2つが分かっていれば暗号化・復号化ができる。 |
||
| 62 | |||
| 63 | ## 基本的な考え方 |
||
| 64 | |||
| 65 | 1文字目を例にキーを求めてみよう。 |
||
| 66 | |||
| 67 | 平文の1文字目(p):S |
||
| 68 | 暗号文も1文字目(c):L |
||
| 69 | |||
| 70 | 上の表のSの行を抜き出してみる |
||
| 71 | |||
| 72 | ~~~ |
||
| 73 | |ABCDEFGHIJKLMNOPQRSTUVWXYZ{} |
||
| 74 | -+---------------------------- |
||
| 75 | S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR |
||
| 76 | ~~~ |
||
| 77 | |||
| 78 | 表の中のLの位置を確認、対応する列はVになっている。 |
||
| 79 | ということで、1文字目のキー(k)は、Vとなる。 |
||
| 80 | |||
| 81 | これを繰り返すと、ここまで解る。 |
||
| 82 | |||
| 83 | ~~~ |
||
| 84 | k: VIGENER?????VIGENER?????VIGENER?????VIGENER |
||
| 85 | p: SECCON{?????BCDEDEF?????KLMNOPQ?????VWXYYZ} |
||
| 86 | c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ |
||
| 87 | ~~~ |
||
| 88 | |||
| 89 | ## 残り5文字について |
||
| 90 | |||
| 91 | 正解時のMD5ハッシュが問題にあるので、総当りすればよい。 |
||
| 92 | この手の古典案号のキーは、だいたい4~5文字だったら、現実的な時間で解けると考えてよさげ。 |
||
| 93 | |||
| 94 | >あとヴィジュネル暗号の英語の綴りは"VIGENERE"なので、キーの次の文字は"E"であろうという予想がつきます。 |
||
| 95 | |||
| 96 | CTF時はチームメイトがJavaScriptで総当りプログラムを作ってくれました。 |
||
| 97 | |||
| 98 | ちょっと勉強がてらPythonで書いてみました。5文字の総当りだと、それなりに時間がかかります。 |
||
| 99 | |||
| 100 | ~~~python |
||
| 101 | #!/usr/bin/python |
||
| 102 | # -*- coding: utf-8 -*- |
||
| 103 | |||
| 104 | import hashlib |
||
| 105 | from itertools import combinations |
||
| 106 | |||
| 107 | charset= "ABCDEFGHIJKLMNOPQRSTUVWXYZ{}"*5 |
||
| 108 | chiper = "LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ" |
||
| 109 | itr = combinations(charset,5) |
||
| 110 | |||
| 111 | def decode(c, key): |
||
| 112 | return charset[(charset.index(c)-charset.index(key))%28] |
||
| 113 | |||
| 114 | for i in itr: |
||
| 115 | print i[0],i[1],i[2],i[3],i[4] |
||
| 116 | a0 = decode('E',i[0]) |
||
| 117 | a1 = decode('D',i[1]) |
||
| 118 | a2 = decode('O',i[2]) |
||
| 119 | a3 = decode('E',i[3]) |
||
| 120 | a4 = decode('E',i[4]) |
||
| 121 | b0 = decode('K',i[0]) |
||
| 122 | b1 = decode('J',i[1]) |
||
| 123 | b2 = decode('W',i[2]) |
||
| 124 | b3 = decode('M',i[3]) |
||
| 125 | b4 = decode('N',i[4]) |
||
| 126 | c0 = decode('V',i[0]) |
||
| 127 | c1 = decode('U',i[1]) |
||
| 128 | c2 = decode('F',i[2]) |
||
| 129 | c3 = decode('W',i[3]) |
||
| 130 | c4 = decode('Y',i[4]) |
||
| 131 | |||
| 132 | # 不明なキーの最初の1文字目をEと決めつけて実施(VIGENEREの最後のE) |
||
| 133 | # 以下3行をコメントアウトすれば5文字の総当たりになる |
||
| 134 | a0 = decode('E','E') |
||
| 135 | b0 = decode('K','E') |
||
| 136 | c0 = decode('V','E') |
||
| 137 | |||
| 138 | flag = 'SECCON{'+a0+a1+a2+a3+a4+'BCDEDEF'+b0+b1+b2+b3+b4+'KLMNOPQ'+c0+c1+c2+c3+c4+'VWXYYZ}' |
||
| 139 | |||
| 140 | md5 = hashlib.md5(flag).hexdigest() |
||
| 141 | if md5 == "f528a6ab914c1ecf856a1d93103948fe": |
||
| 142 | print 'Hit!',flag,md5 |
||
| 143 | exit() |
||
| 144 | ~~~ |
||
| 145 | |||
| 146 | ## ちなみに |
||
| 147 | |||
| 148 | 以下にヴィジュネル暗号のソルバを事前に準備しておいたんだけれど、今回はアルファベットの他に"{}"が入っているという仕様のため、使えなかった。 |
||
| 149 | (あと英文じゃないので、復号結果が正しいか判断ができないとかある) |
||
| 150 | |||
| 151 | [CTF Crypto Vigenere暗号(ヴィジュネル暗号)](https://raintrees.net/projects/a-painter-and-a-black-cat/wiki/CTF_Crypto#Vigenere%E6%9A%97%E5%8F%B7%E3%83%B4%E3%82%A3%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%AB%E6%9A%97%E5%8F%B7) |
||
| 152 | |||
| 153 | # pppppoxy |
||
| 154 | |||
| 155 | Web問 200点 43チーム回答 |
||
| 156 | |||
| 157 | ダウンロードしたexeを実行すると、ローカル限定で接続できるWebサーバとブラウザが立ち上がり、idとpasswordの入力を求められる。 |
||
| 158 | 正しいパスワードを入力するのが今回の問題。 |
||
| 159 | |||
| 160 | 失敗すると「username or passwaord was incorrect!」が表示される。 |
||
| 161 | |||
| 162 |  |
||
| 163 | |||
| 164 | ぶっちゃけ力技で解いた。 |
||
| 165 | [うさみみハリケーン](http://hp.vector.co.jp/authors/VA028184/#TOOL)を使い起動中のpppppoxyのメモリ内容を参照。こちらから入力したパスワードの近辺を検索して参照し、怪しい文字列を見つけた。 |
||
| 166 | |||
| 167 |  |
||
| 168 | |||
| 169 | という訳で、以下を入力してフラグ取得 |
||
| 170 | |||
| 171 | ~~~ |
||
| 172 | -40.01.6102 ,ikazamaY ogieK? thgirypoC |
||
| 173 | ~~~ |
||
| 174 | |||
| 175 |  |
||
| 176 | |||
| 177 | と、言葉にするとすぐ終わるんだけど、実際この手法に行き着くまでに |
||
| 178 | |||
| 179 | * SSHトンネルして外に繋がるようにして、[hydra](http://sectools.org/tool/hydra/)でブルートフォース |
||
| 180 | →制限時間内に明らかに終わらない事がわかり諦める。 |
||
| 181 | |||
| 182 | * [ILSpy](http://ilspy.net/)でデコンパイルしてソースコードを眺める。 |
||
| 183 | →難読化(?)とか文字化けとかに遭遇して諦める。 |
||
| 184 | |||
| 185 | という苦労をして時間を溶かしている。 |
||
| 186 | |||
| 187 | # その他の問題のWriteup |
||
| 188 | |||
| 189 | あのTomoriNaoさんのページが、とても詳しいです。 |
||
| 190 | |||
| 191 | TomoriNao SECCON 2016 Online |
||
| 192 | https://hackmd.io/s/HkGx_btmx# |