株式会社Ninjastars セキュリティエンジニアの一瀬です。
今日は弊社で行っている活動を知っていただくために、また自己紹介を兼ねて私が参加した昨年の「SECCON 2017 x CEDEC CHALLENGE ゲームクラッキング&チートチャレンジ」について書かせていただきます。
まず私は2017年の8月に開催されたこの大会に参加し2位となりました。CTFのチームなどには所属していなかったので、1チーム4人制の中1人で参加しての結果だったので健闘した方であると思います。
私なりにもこの大会を少し振り返ってみたいと思います。
この大会のメインの問題アプリでは私は主に
- プロセスメモリ改変
- ARMアセンブリ改変
を行い攻撃を行いました。
資料:CEDEC2017参加レポート - Google ドライブ
プロセスメモリ改変について
私はAndroidで動的解析を行うときには主にCheatEngineの機能であるceserverを利用して解析を行います。
端末内のceserverとWindows上のCheatEngineで通信を行い、各種プロセスメモリ検索・改変やデバッガによる解析が可能です。
Windows上のアプリケーションを解析するのと同様な感覚で、Android端末上のアプリケーションにアタッチして解析できるので非常に重宝しています。
ARMアセンブリ改変について
ARMアセンブリ改変の基本的な考え方:
検索単語名:Is、Check、get、Add,Sub、Current、Xor、Shuffle...
上記のような単語名を基本として、名前から処理が推測できるような関数をゲームプレイ上有利になるように改変する。
何もしない処理に置き換える。戻り値を常にXに固定する。etc
出来なかったことと、今ならこうする的なこと
通信関連の知識に疎く、通信の復号には至りませんでした。
その当時は出来なかったけど今ならできるということで、別のやり方で通信を解析してみたいと思います。
私は最近は動的解析ツールであるFRIDAを利用するのに少しハマっていて、FRIDAで通信の復号(正確にいうと傍受)とおまけでスピードハック(ゲーム内時間の加速・減速)を行ってみたいと思います。
通信の復号(傍受)
ソーシャルゲームのみに限らず、アプリケーションで暗号化通信を行うとき必ずと言っていいほど暗号化・復号化を担う関数が存在します。
・暗号化関数:暗号化関数が呼び出される直前に関数をフックする。
->暗号化される直前の生データをメモリダンプして取得する。
・復号化関数:復号化関数が呼び出された直後に関数をフックする。
->復号化された直後の生データをメモリダンプして取得する。
通常GDBなどのデバッガで解析することでメモリダンプを取得し通信内容を傍受することができます。
この手法はmitmproxyなどで通信の復号をするより明確に強力な点が一点あり、処理自体乗っ取るので内部的な暗号方式などは一切関係なく復号出来てしまうという点があります。
FRIDAはこういった人の手で行っているような解析を自動化し、更に改変等も行うことができる非常に強力な動的解析ツールです。
SECCON 2017 x CEDEC CHALLENGE 通信復号
スピードハック
GameGurdianなどのチートツールは、通常アプリケーションの時間関連の関数などをフックすることでスピードハックを実現します。
フックするべき関数と原理さえ分かっていればFRIDAでも同等なことが実現できます。
SECCON 2017 x CEDEC CHALLENGE speedhack
またFRIDAではARM改変で行ったようなことをil2cppの各関数をフックすることで同等以上なことがほぼ全て実現できます。ARM改変では難しい複雑な条件分岐や別関数の呼び出しなども出来るので、攻撃手法として非常に強力であるとともに防御的観点からすると今後脅威となる存在であるかもしれません。
注意事項
本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。そのため、記事の内容を試す際には許可されたソフトウェアに対してのみ実施するようにしてください。
本レポートについて
お問い合せ
E-mail:ichise@ninjastars-net.com
株式会社Ninjastarsエンジニア
一瀬健二郎