前編はこちら
cryptoの問題を解き始める。まずは暗号化に使われたコードが書かれたファイルをダウンロードして調べる。なるほど。ここ数日ちょっと勉強していた形式の暗号っぽい。ふむふむ。何をやっているかは理解できるぞ。
問題となっているのは、RSA暗号と呼ばれる暗号の解読。公開鍵暗号の1種で、暗号化は簡単だが復号は難しいという都合のいい条件を、クソでかい素数とクソでかい素数を掛け算するのは簡単だが、そのクソでかい積だけからノーヒントで素因数分解する(何と何を掛けたのか調べる)のは難しいという現象を利用して実現している暗号だ。クソでかい積と、それを使って暗号化されたデータも添えられていた。
普通に考えたら、ちゃんとした暗号技術を使って暗号化されているのでどうしようもなさそうなのだが、与えられたコードをよく見てみるとクソでかい2つの素数の関係性に特徴があった。1つの素数をpとすると、もう1つの素数を2p+1で表すことができるのだ。なんかここが怪しそう。
そうは言ったものの、どうすればいいのか分からず、考えていくうちに時間が過ぎていく。ちょっと分からないし別の問題に行くか。
その後別のcryptoの問題に取り組むも、これもまた難しくて全然解けない。うーーー。
そうこうしていると、チームメンバーの1人がさっきの問題を解いてしまった。すげえ。どうやって解いたのか一応聞いたがちょっと僕には分からなかった。地力が足りない。
集中しているとあっという間に夜になり、雨が降り始めた。自転車で部室まで来ていたので、雨が降っていると帰れなくて困る。音がはっきり聞こえるほどの激しい雨だ。
仕方がないので別の問題に取り組むことにした。今度はcryptoではなくreversingの問題で、アセンブリ言語という、より機械語に近い文法の言語を操って指定された処理を行う問題だ。アセンブリ言語はほとんど知らないが、ctf用の対策本が部室にあったのでそれを見ながら見よう見まねでやっていく。
いくつかのステップに分かれていて、最初の方は基本的なことができるかどうかが調べられる。step3まで来て、関数っぽいものを使うのだが、これがなかなか曲者だった。機械語に近い分、メモリやレジスタといったハードウェア上のどこにデータを置くのかといったところまで考えなければならないのだが、そのせいかこんな感じかと作ったコードにエラーが出てしまうのだ。アセンブリ言語なので扱う人が少ない分なかなか資料もネット上で見つからず、かなり困った状況だ。エラーの原因が分からない。色々悩みながらあーでもないこーでもないと試行錯誤しているうちに12時になり、雨も止んだのでここで帰ってしまうことにした。続きはまた明日。諦めも大事。
翌日、再び部室へ向かい、9時過ぎに到着した。やることは定まっているので再びアセンブリ言語の中に深く潜っていく。cryptoの問題を解いてくれたメンバーが見つけたサイトの情報からなんとかstep3を突破できた。あとは最後、step4だ。ファイルを読み込み、内容を出力するコードを書けとのこと。なんだかできそうな気がする。
しかし、またもエラーに悩まされ、なかなか解ける気配も見えない。いつも見るエラーの説明のありがたさが身にしみてわかる。なぜエラーなのかを教えてくれ…。
少しずつ前進し、それっぽいコードは書けたのだが、なぜかうまくいかないというのが続き、悩んでいるうちに無惨にも14時のタイムリミットがやってきた。
結局、僕は1問も解くことができないまま終了してしまった。難しいよう…。
悩んでいた問題の解法を見てみると、なんだか値をメモリ上に入力する時にちょっとした手続き的な処理が必要だったっぽくて、そんなの知らねーよと憤りを感じた。そこさえできていればなんとかなっていただけに悔しい。
チームとしての成績は、他のメンバーが頑張ってくれていたのもあって上の下ぐらい。
238位/962チーム、だった。メンバーがマジですごい人だ。
実力不足を痛感した。何もできない。もっと精進が必要だ。地力をつけたい。そのためにはいろんな開発の経験を積んでいかないといけない。こっから先頑張っていこうという思いが強くなったコンテストだった。