LoginSignup
1

More than 3 years have passed since last update.

posted at

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

問題

image.png

解いてみた

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

image.png

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

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

image.png

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

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

image.png

Calculating key...

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

You need a faster machine.

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

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

image.png

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

IDAで見てみます。

image.png

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

image.png

decrypt_flagを見てみます。

image.png

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

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

image.png

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

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

image.png

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

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

image.png

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

image.png

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

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

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

image.png

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

image.png

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

image.png

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

image.png

これで10に変更。

image.png

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

image.png

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1