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を使う練習にもなって、程よい感触の問題ですた。
(その割に解いてるチーム数が少ないのが結構気になる....)

スプラトゥーン2のスコア(戦績)管理サービスを作ってみた

こんなの


経緯

前作はPC向けで作っていましたが、今作はスマホ向けに作りました。
Nintendo Switchアプリからスプラトゥーン2の戦績を見れますが、50試合分しか見れません。
おそらくいろいろな都合があって、この件数なのでしょう。
せっかくなので、全試合分を保存したいと思い、イカスコア2を作りました。主に自分用に。
誰か作ってくれるかなーと思って待ってたんですが自分の検索力が低いのかまだないのか見つからなかったので作りました。

2017/08/09追記: イカスコア2で取得できる戦績の件数は、最新の50試合だけです。なので、全試合を保存しておきたい場合は、50試合プレイする前に、改めて取得する必要があります。

内部 (2017/09/16加筆修正)

データの登録方法は、以下の2種類を用意しています。

JSONファイルで登録

  • results/{battle number}.json をアップロードして登録

iksm_sessionを使って登録

  • サーバが勝手にAPIを叩いて登録
  • (サーバへのアクセス負荷を下げるために、1人につき一定時間に1回しか取得できないようにしています。既にDBに登録されてるデータは取得しません。)
  • プレイしてもいないのに一定時間ごとに自動でアクセスする、みたいな相手先のサーバの負荷が上がりそうなことは行わないでください。
  • iksm_sessionは有効期限がありますが、自動で更新する機能を付ける予定は一切ありません。iksm_sessionを使っての登録方式は、そのうち廃止する予定です。

JSONファイルを手軽に保存できるソフトを作りました。

こちらからどうぞ。Mac, Windows対応しています。作りは雑ですが、iksm_sessionの値さえ間違えていなければ取得できるはず.... PRも歓迎します。Macは 【~/Library/Application Support/iksm-fetcher/results】 に保存されます。

(そのうちイカスコア2にもJSONファイルのまとめて登録機能をつける予定....)

使ってみたい人へ

今のところ、戦績はこんな感じで公開されます。公開されるのが嫌な人は、そのうち公開設定つけるので、それまでお待ち下さい。 2017/08/09に公開設定つけました。


2017/08/23追記: JSONファイルでの登録に対応したので、iksm_session無しでも利用できるようになりました。その上でiksm_sessionを使って戦績を登録する人は、以下の内容を10回ぐらい読んで、リスクがあるんだなということをちゃんと頭に入れてください。


iksm_sessionは、大事なセッション情報なので、外部に漏れると、勝手にスプラ2の情報を見られたり、ゲソタウンで注文される可能性があります。
任天堂とは全く関係がないサービスですので、勝手にiksm_sessionを利用すると、アカウント停止などの処置がなされる可能性もあります。
できる限り、そういうことが起こらないように配慮はしているつもり(通信の暗号化、iksm_sessionの暗号化等)ですが、何が起こるかは分かりません。
「セッションハイジャック」の意味が分からない人は、JSONで登録した方が無難です。


アカウント登録に使うメールアドレスは、パスワードを忘れたとき用にしか使ってません。
なので、パスワード忘れてもいいや、って人や、忘れることがない人は、
hogehoge@example.comとか好きなアドレスで登録して使ってもらったらいいと思います。

それでも使いたい人はこちらからどうぞ

使用は自己責任でお願いします。
アクセスの様子を見て、あまりにアクセス数が多い場合は、ユーザ数やiksmの取得に制限をつけるかもしれません。
結構しょぼいサーバに置いてあるので、人が押しかけたら落ちるかもしれません。
(そのうち新規登録は止める予定です。)

そのうちつけたいもの(妄想)
  • 戦績の公開設定
    • 試合ごとの結果は、公開設定がまだないので、自分以外の人が表示するとプレイヤー名が伏せ字になります。 2017/08/09 実装しました。
  • マイページ
    • 統計表示(連勝記録 実装済、武器、マップ、ルール、K/D、塗p、他 何か面白そうなのあればコメントください)
  • 別の人との比較機能
  • 登録者内でのランキング的な何か(塗りp、試合数、勝利数、etc)
  • 今日の戦績的なものをTwitter等に貼れるような何か 実装済

OS Xでgpg2ではなくgpg1を使うための手順

MacBookを新調したのですが、brew install gpgすると、gpg2がインストールされるようになっていました。
gpg2でしばらく使っていたんですが、何故か突然、pinentry-macがパスフレーズの入力を受付けない状態になってしまいました....
そもそも、terminal上で完結させたいので、いちいちウィンドウ上で入力するのも辛い。
調べてみると、素直にgpg1に戻した方が手っ取り早そうだったので、gpg1にダウングレードすることにしました。


brew install gpg1 だけだと、gpgコマンドへのパスが貼られず、
brew link gpg1 としても、

Warning: Already linked: /usr/local/Cellar/gnupg@1.4/1.4.21

と出るだけ。
なので、

ln -s /usr/local/Cellar/gnupg@1.4/1.4.21/bin/gpg1 /usr/local/bin/gpg

としてやることで、無事にgpgコマンドを認識してくれました。
皆さんはgpg2で頑張ってらっしゃるのでしょうか.... (自分は1日でギブでした。)

個体値を厳選するためにポケモンGOのレベル確認用の分度器をWebで作った。


個体値の測り方を探していたら、次の記事を見つけました。
【ポケモンGO】個体値厳選のやり方 〜レベル確認用分度器作成のススメ〜 - bohemia日記
この記事を読んで、個体値の測り方は分かったんですが、
分度器・・・が、手元にない・・・(ノД`)シクシク
なので、iPhoneでアップしたら重ねて表示してくれるやつを作りました。


縦表示


横表示


こちらから使えます。


iPhone5やiPhoneSEは位置調整ナシで使えますが、
他の解像度だと微妙にボタンで位置調整しないといけません。


弧の描画は https://jackhumbert.github.io/poke-rater/ のコードを使ってます。

CTFの問題の作り方

この記事はSLP KBIT Advent Calendar 2015の25日目です。
昨日はなおすけくんが書きました。


本当はFluxのアーキテクチャと実装について書こうと思ったんですが、
さんっざん分かりやすい資料も出まくってて、今更話すこともないかなと思ったので、
CTFの問題の作り方を紹介することにしました。
あまり難しい問題の作成には当てはまらないかも。


問題の作り手が全員同じように作っているとは限らないですが、
極端なエスパー問題を防いだり、参加する側にとっては、
よりストーリーや背景を楽しめるようになれば幸いです。

続きを読む

SECCON 2015 Online CTF Writeup(WebQR)

TMCTFに引き続き、ガッツリCTF参加しました。
あまりWriteupが見当たらないWebQRだけWriteup書きます。
(と言っても、ただ「やる」だけの問題なのですが、、)

続きを読む

スプラトゥーンのスコア管理サービスをリニューアル

前回の記事に記載してある、スプラトゥーンのスコア管理サービスをリニューアルしました。

  • サイト名を「イカスコア」に変更
  • レイアウトを一新
  • ガチエリアについてはKD比による分析を行いやすいようにグラフ等を追加
  • ガチホコ対応
  • 武器・マップごとの安定度を追加

http://splatoon.iruca.cc