VolgaCTF 2018 Quals Writeup for Button Spy (250)

最近、pwnにはまっていて、katagaitai勉強会の資料を読み漁ったりhopper買ってバイナリエンジョイしてるDltnです。
バイナリ欲が高まっていたので、過去問だけじゃなくて適当なCTFに参加してバイナリ問題解きたいなと思っていたら、
ちょうど先週末にVolgaCTF 2018のQualsが開催されていたので、少しだけ参加しました。
参加時間は仕事等の都合で少しだけ。なので、ちょうど得点もそれなりでReverseなButton Spyに着手したところ、なんとか解けたので、Writeup書きます。

Button Spy

Sometimes even the most sneaky spy needs an activation...
button_spy 直

まとめ

  • strace等で起動すると、キー入力を監視していることが分かる。
    • 特定のキーシーケンスでフラッグかなと推測
  • gdbで動かしながらread関数から戻ってきたところを追っていく
  • 一定文字数入力すると特定の関数が呼ばれることが分かる (自分の環境では 0x555555565c87でcall 0x5555555667f0が呼ばれる)
  • その関数の中を見ると、文字数分だけ定数cmpが見つかるので、定数をlinux/input.hと照らし合わせて復号する。
    • 一部、linux/input.hと一致しないものがあったので、手動で直した。デバッガでバイナリを読めば、0x00c0d2dあたりに文字テーブルがあるので、それを参考にすればよかったかもしれない。
  • 復号するとフラッグになる。 VolgaCTF{Even_1he_be$t_spy_can_rust1}

解いた時の流れ

  • 起動しても何も起きないが、strace等で見ると、キー入力を監視していることが分かる。
  • gdbで起動すると、メインプロセスがすぐ終了しちゃうのか追えない。
    • set follow-fork-mode parent等で各プロセスを追ってみる
  • /dev/input/event0を読んでいることが分かる
    • 調べたところ、キーボードやマウスなどの操作を読み取ったり偽装したりできるらしい
  • ココらへんで、特定のキーシーケンスを求められていて、それがフラッグになってるのかなーと目星をつける。
  • parent processをgdbで実行中にC-cで中断すると、read関数の中にいる!
    • finishでreadを抜けて、readした情報をどう処理してるのか動かしながらアセンブラを眺めていく。
  • typeやshiftの押下チェックを抜け、カウンタと定数を比較しているコードにたどり着く。
    • 定数がフラッグ文字数だろうと目星をつける。
  • カウンタが定数に達したら、チェック関数らしきものが呼ばれる。
  • 関数内に定数cmpが大量にあり、定数は/dev/input/event0で取得できるキーコードを表してるっぽい。
  • 頑張って復号して、フラッグゲット。

感想

恥ずかしながら、/dev/input/event0などの存在を今まで知らなかったので、勉強になった。
gdbを使う練習にもなって、程よい感触の問題ですた。
(その割に解いてるチーム数が少ないのが結構気になる....)