Special instruction challenge チュートリアル

(最後に)

■ 最後に

いかがでしたでしょうか.

今回は,セキュリティ目的などでCPUに特殊命令が追加されていた場合に,その仕様が クローズドであったとしても,入力と出力からその仕様をどの程度推測され得るのか, またどのようにして推測され得るのかということをテーマとしてみました.

結論としては,いくつかのチームが正解していたので,割と推測可能で, しかもCTFという短期間かつ限定された環境で,ある程度推測可能ということです.
十分な時間と環境があれば,(少なくとも,今回出題した「乱数命令」のようなものに 関しては)確実に推測可能だということができるでしょう.
このようなことを体験的・競技的に実施できるのも,CTFの面白いところだと 言えるかと思います.

元々,私の考えとして,エミュレータは実機の代替としてだけでなく, エミュレータでこそできるようなことを利点としてもっと考え,エミュレータの特性を 活かした使いかたをすべきだと思っています.

エミュレータでは,実機と同様に動作すること,高速に動作することなどが重視され がちです.いかに実機に近づけるかという考えです.
しかしそれよりもエミュレータはエミュレータでしかできないようなことにもっと 注目すべきです.とくにデバッグ目的や実験目的で使うときにはそうだと思います.

そのひとつとして,特殊命令を気軽に追加できることがあります. CPUで独自命令を追加して実験しようとしたら,いろんな意味でかなり大変, というか個人では事実上無理な部分が多くあります.
しかしエミュレータならば,そうしたことが簡単にできます.
他にもOSの独自システムコールとか,そうしたものも考えられます.

そこで今回は特殊命令実装というのをテーマにしたいと思い,そこから競技になる ようにアイディア出しをして,なんとか競技に仕上げましたが,内容としては なかなかうまくまとめられたかなあ,と思います.

また実際に特殊命令を検討するとしたら,命令の設計をするだけでなく, 実装や検証のための様々な技術が必要となります.
たとえば既存のエミュレータをいかに改造するか,既存のコンパイラを使いつつも その特殊命令をどのようにしてプログラム中に埋め込んで利用するか,既存の 逆アセンブラによる逆アセンブル結果をどのように見るか,既存のデバッガで どのようにして検証するか,といった技術が必要です.
そうした技術も,この競技の中には盛り込んであります.

こうした技術は実装のための技術ではあるのですが,そうした技術を持ち合わせて いれば,プロトタイプ実装や検証を自身の手元で,スピーディに行えます.
これはこうしたアイディアがあったとき,それを実現性のある,説得力のある形で 提案することが可能になることでもあり,技術者や研究者としての強みになると 思っています.

ただ反省点として,競技の入口のパラメータ調整がちょっと難しすぎたかとは 思います.いきなりBlackfinで,そしてそれをクリアしないと次アーキテクチャが 出ないので,実質 Blackfin をまず解かないと競技の入口のドアが開かない状態で, 入口の敷居がいきなり高かったかと.
最初からARMやMIPSなどのメジャーなアーキテクチャもrunme.xに採用すべきだった かなあと思います.

またGDBの接続制限がちょっと厳しすぎたかなあとも思います.
テーマとしてはエミュレータへの実装がメインなので,GDBに接続することでサーバ側で 解くことができてしまうことを極力防ぎたくてそのように調整したのですが, いずれ命令の実行回数制限などでエミュレータへの実装が避けられなくなるので, GDBの接続制限はもう少し緩くすべきだったかと.
もともと中盤はGDBで解くが,いずれそれではダメになってエミュレータ実装に向かい, 終盤はエミュレータ実装で解く,というくらいのゲームバランス (1日目の夜にエミュレータ実装を頑張ってして,2日目はエミュレータで解く) を考えていたのですが,ちょっと調整ミスだったかと.

ただ競技としては非常によくまとまったと思うので,このあたりをチューニング しなおして,どこかの勉強会とかで,ハンズオンや競技として,再度実施して みたいです.

■ おしまい