問題ページ
-----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型に変換してからハッシュ化すればすればよいだけである。一応改変したコードを載せておく。