Hash me if you can[RingZer0]


[問題ページ](https://ringzer0team.com/challenges/13)
![SnapCrab_NoName_2017-7-8_22-48-25_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/13a63cfa-37dd-f349-07be-8e7966ef7101.png)
`-----BEGIN MESSAGE-----`から`-----END MESSAGE-----`にあるメッセージをSHA512でハッシュ化し、`https://ringzer0team.com/challenges/13/[ここ] `にいれてアクセスすれば良いみたい。さっそく、適当なツールサイトでハッシュ化を行いアクセスしてみたところ
![SnapCrab_NoName_2017-7-8_22-53-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/da37bbf0-b8d4-baf5-920e-b78f9f913c00.png)
と、言われた。どうやら2秒で送り返さないとならないようだ。人力では無理そうなのでプログラミングをするしかなさそうである。今回は「Python」を用いてプログラムを作成する。プログラムの流れは次のようにする。
![SnapCrab_NoName_2017-7-8_23-1-47_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/cd0e871a-bf22-6201-a601-0586a66c512f.png)
最後のフラッグゲットは実際どのようにフラッグが送られてくるのかわからないため少し変更があるかもしれない。とりあえず上からどのように実装していけばいいのか考える。調べてところ、`requests`と`lxml.html`を使う方法が出てきた。のでその方法で少しコードを書いてみた
![SnapCrab_NoName_2017-7-8_23-56-55_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/8e44702e-3735-334a-2290-7e9c63a52d3f.png)
 `requests.get(URL)`でウェブページが取得でき、ウェブページのHTML文章は`text`メゾットに入っているのでこれを取得することでソースが全て見ることができる。しかし、取得できたソースを一度htmlファイルを作成し、そこにコピーをしてブラウザで開くと困ったことになっていた。
 ![SnapCrab_NoName_2017-7-8_23-9-56_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/03984803-cedc-a874-6499-e4162738fc71.png)
 ログインページに戻されているわけである。なので一度ログインをしなければいけないのであろう。
 
　このウェブページのソースの一部を見ると、
 ![SnapCrab_NoName_2017-7-8_23-18-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/30d87e3b-dd0f-b0ab-10dd-07257bb65996.png)
 送信形式は`POST`で、`username`と`password`を送り付ければ良いと考えれれる。ログインをした後に問題ページに移動して動作を行うため、問題ページに移動後もログイン状態が保たれるようにしなければならないため、同じセッションで行う必要がある。そこで書き直したコードは次のようになる。
![SnapCrab_NoName_2017-7-9_1-4-55_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/5c2af60d-1b18-0e60-f6e8-2dd181d74197.png)
 `requests.session()`で`Session`のインスタンスが作成され、ハッシュや連想配列と呼ばれるものに似た機能を持つ`dict`で`key=value`のようにPOSTで送信するデータを設定し、その設定したデータを`Login_URL`に添付し、ログインさせる。同じセッションなのでログイン情報は保たれ、問題の`URL`にアクセスすることができる。
 
 あとは、`r2.text`からメッセージの部分を抜き出せば良い。さて、どうしよう。とりあえず、パッと思いついた方法でやって書いてみた。
![SnapCrab_NoName_2017-7-9_1-5-10_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/ff171602-dfd5-733a-0ad6-41fd169abb59.png)
説明はコメントで書いておいた。これで`message`にメッセージの部分だけが入った。

`message`を`SHA512`でハッシュ化する方法は、まず、importの部分に`hashlib`を追加する。
![SnapCrab_NoName_2017-7-9_0-37-13_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/d2ed4477-84b7-6259-6e21-63801ec695f8.png)
次に、追加した`hashlib`を用いて、次のようにすれば良い。
![SnapCrab_NoName_2017-7-9_0-45-39_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/b0ba7838-cc82-70ab-d977-ec71e863ab1a.png)
ちなみに、`.encode('utf-8')`は、`Unicode-objects must be encoded before hashing`とエラーが出るので必要である。`hexdigest()`は名前にとおり、16進数にしてくれる。
![SnapCrab_NoName_2017-7-8_23-1-47_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/13584e35-2da5-94f8-d055-1c0a7156b305.png)
ここまで、できた。あとはハッシュ化したメッセージ`answer`を送り付ければよい。

![SnapCrab_NoName_2017-7-9_0-53-51_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/a810c2d4-713b-ffbf-d5cc-c33498093c2a.png)
実行して、`r3.text`の内容をブラウザで見てみる。
![SnapCrab_NoName_2017-7-9_0-54-56_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/d9c16056-d074-2585-9242-524100cb763b.png)
駄目らしい。ハッシュ化が間違ってるとは思えないので、URLの書き方が悪かったのだろうか、`[ ]`を除いてリトライしてみる。
![SnapCrab_NoName_2017-7-9_0-57-12_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/7bfde40b-146d-a258-dfda-75392d81464a.png)
同様に、実行してブラウザで見てみる。
![SnapCrab_NoName_2017-7-9_0-58-31_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/1f410b5f-099d-282e-bf18-93bec9c75691.png)
フラッグを手に入れた。

同じ要領でこれとほぼ同じ問題「Hash me reload」も少し改変すれば解ける。この問題は、メッセージが２進数で送られてくるので、8bitごとに区切ってchar型に変換してからハッシュ化すればすればよいだけである。一応改変したコードを載せておく。![SnapCrab_NoName_2017-7-9_1-45-55_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/16935337-30af-b285-13da-bc6cdc036b10.png)