picoCTF 2018 be-quick-or-be-dead-1 - Points: 200

#問題

https://2018game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9aa33993-e04b-2415-da08-d8966b11faac.png)

#解いてみた

リンクが2つあるのでまずはthisの方から。
youtubeにつながりましたよ。
https://www.youtube.com/watch?v=CTt1vk9nM9c

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fd5f8e25-0f5c-20b3-46d3-c3f8338d7d06.png)

アイアンメイデンの歌ですね。
曲名と問題のタイトルが同じですが、それ以上はよくわかりません。

もう一つのリンクはファイルのダウンロードでした。
拡張子がなかったのでBzで開いてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f1f3174c-1c8a-d518-c33c-92e712d4b1ab.png)

ELF（Linuxの実行ファイル）ですね。
一応文字列検索とかでpicoCTFを探してみましたが、ありませんでした。

とりあえずUbuntu上で動かしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7ad77456-2e68-4d92-f32f-ca98fdb8cce2.png)

```
Calculating key...
```

という文字が出てから1秒くらい止まって、そのあと

```
You need a faster machine.
```

と言われてしまいます。
ここで時間でも計っているのでしょうか。

引数が必要なのか試してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/42d32788-f431-7c42-6ddd-766d11ceaa9f.png)

引数とかヘルプとか何も起こりませんね。

IDAで見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b72f12c3-6753-c13a-787a-3360b99338d2.png)

mainです。
print_flagに何かありそうなので見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/eb760a74-d05a-18c1-2667-913b35fc6de6.png)

decrypt_flagを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/41755013-06b2-e9a9-9737-56838f27e739.png)

ちょっと長いので全部載せられませんが、ループしながらxorで復号しているようです。
なのでここでは出力の制御は行っていないようです。
ここの関数に来る前に制御がされているんだと思います。

mainから呼ばれているprint_flagの前に呼ばれているget_keyを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e5f1fc91-d4b3-411f-ada1-09eed7374776.png)

「Calculating key...」という文字列と「Done calculating key」を出力しています。
さっき実行したときに1つ目は出ましたが、2つ目は出ませんでした。
つまりその間で何かしら制御が行われていて処理が終了してしまったんだと思います。

間にあるcalculate_keyを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7d976dc1-b1c1-a12e-eb7b-f807f77c0686.png)

ループしてるだけ？
どうやって終了処理をしてるんでしょう？

mainから呼ばれているget_keyの前のset_timerを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/14d4acc4-8ba1-b82e-d7e9-12843693ac3d.png)

alarm_handlerが登録されていてその直前に1が設定されています。
alarm_handlerの中身を見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9e129e48-2538-0e90-fe0d-5412c60596f5.png)

You need a faster machine. Bye bye.
が書かれているので、1秒経つとシグナルが送られて終了するみたいです。

ここを100秒とかに伸ばしてみたくなりました。
有料版があればこのままデバッグできるのですが。。。

gdb使います。
set_timerを表示させます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f22d991e-ac41-dfaa-6414-d8918ea93150.png)

そして1を設定する0x40074aと直後の0x400751にブレークポイントをセットします。
そして実行。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3ffb510d-b4f0-6a12-3cdb-a8f5c546499d.png)

直前と直後でrbpより少し前を確認してみると0xffが0x01になってるところがあります。
ここに1秒が入ったようなのでこの値を10とかに変えてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f1912772-1394-cd6c-acb3-b8b35639cc83.png)

Enter何回も押すとちょっとずつ中身が見れるのでこれで0x7fffffffdd84を変えればいいことがわかりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/865d89f7-7993-05dc-c58f-a8fce5067ded.png)

これで10に変更。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ba93f4ad-ae04-85e6-28ab-6254a2974c64.png)

0x0aに変わったことが確認できました。
これで続きを実行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c6ac3a18-10c6-5112-0b45-301918b751fe.png)

やりました！
ところでyoutubeはどういう意味だったのか？タイトルが一緒なだけ？