問題ページ

-----BEGIN MESSAGE-----から-----END MESSAGE-----にあるメッセージをSHA512でハッシュ化し、https://ringzer0team.com/challenges/13/[ここ] にいれてアクセスすれば良いみたい。さっそく、適当なツールサイトでハッシュ化を行いアクセスしてみたところ

と、言われた。どうやら2秒で送り返さないとならないようだ。人力では無理そうなのでプログラミングをするしかなさそうである。今回は「Python」を用いてプログラムを作成する。プログラムの流れは次のようにする。

最後のフラッグゲットは実際どのようにフラッグが送られてくるのかわからないため少し変更があるかもしれない。とりあえず上からどのように実装していけばいいのか考える。調べてところ、requestsとlxml.htmlを使う方法が出てきた。のでその方法で少しコードを書いてみた

requests.get(URL)でウェブページが取得でき、ウェブページのHTML文章はtextメゾットに入っているのでこれを取得することでソースが全て見ることができる。しかし、取得できたソースを一度htmlファイルを作成し、そこにコピーをしてブラウザで開くと困ったことになっていた。

ログインページに戻されているわけである。なので一度ログインをしなければいけないのであろう。
このウェブページのソースの一部を見ると、

送信形式はPOSTで、usernameとpasswordを送り付ければ良いと考えれれる。ログインをした後に問題ページに移動して動作を行うため、問題ページに移動後もログイン状態が保たれるようにしなければならないため、同じセッションで行う必要がある。そこで書き直したコードは次のようになる。

requests.session()でSessionのインスタンスが作成され、ハッシュや連想配列と呼ばれるものに似た機能を持つdictでkey=valueのようにPOSTで送信するデータを設定し、その設定したデータをLogin_URLに添付し、ログインさせる。同じセッションなのでログイン情報は保たれ、問題のURLにアクセスすることができる。
あとは、r2.textからメッセージの部分を抜き出せば良い。さて、どうしよう。とりあえず、パッと思いついた方法でやって書いてみた。

説明はコメントで書いておいた。これでmessageにメッセージの部分だけが入った。
messageをSHA512でハッシュ化する方法は、まず、importの部分にhashlibを追加する。

次に、追加したhashlibを用いて、次のようにすれば良い。

ちなみに、.encode('utf-8')は、Unicode-objects must be encoded before hashingとエラーが出るので必要である。hexdigest()は名前にとおり、16進数にしてくれる。

ここまで、できた。あとはハッシュ化したメッセージanswerを送り付ければよい。

実行して、r3.textの内容をブラウザで見てみる。

駄目らしい。ハッシュ化が間違ってるとは思えないので、URLの書き方が悪かったのだろうか、[ ]を除いてリトライしてみる。

同様に、実行してブラウザで見てみる。

フラッグを手に入れた。
同じ要領でこれとほぼ同じ問題「Hash me reload」も少し改変すれば解ける。この問題は、メッセージが2進数で送られてくるので、8bitごとに区切ってchar型に変換してからハッシュ化すればすればよいだけである。一応改変したコードを載せておく。