Shibuya.pm #11「no Perl; use x86;」鑑賞してきた。

常々PerlはLLじゃないんじゃないかと思っていたのだが、LLの皮をかぶったアセンブラであることを再確認したのであった。





1. catcher in the int 80h; inside lleval FreeBSD::i386::Ptraceの実装について。

pt_to_sce()でsystemcallを実行直前にフックできる。スタックに積まれた引数を書き換えることができるので、実行したくないオペレーションであればSEGVで死ぬような引数に書き換えることでsandboxを実現。

forkは引数がないのだが、EIPを0に変更することはできるので、それで殺す。アドレス0にmmapされるとSEGVで死ななくなってしまうのでそれも抑止する。

2. Perl sandbox for Linux fork() system() write() epoll()を禁止するためにptrace的なものを用意する。

特定のPerlVMのopcodeをマスクすればよい。

DynaLoaderは任意のXS/DLLを呼べるので禁止したいが、bootstrapだけは他の有用なライブラリをロードするのに使いたい。そのためDynaLoaderをフックして、bootstrap以外の全関数を使用不可にする。

0や空文字にblessするとか予約語にtieするとアレなので（？？）その辺も禁止する。

3. Kindle hacking Kindleをどうにかハックして非DRMのコンテンツが見たい。CPUがFreescaleのmx31（ARM系）のLinux端末でブラックボックス化されてる。

ファームウェアアップデートを待ち、ヘッダを解析することで、任意のファイルを送り込むことに成功。telnetdの起動スクリプトほか、試せる手段を片っ端から試した。Perlのクロスコンパイルにはまる。ARMでセルフコンパイルしたらできた。Xがなく素のフレームバッファしかない。最終的にbusyboxやカーネルを書き換えた結果DMCが読めるようになったよ！というネタ。

4. Capture The Flagって何ぞ？ Forensic問題のWindowsのPDBというのは、VC++で生成される.pdb（program database）ではなく、Page Directory Baseの略のようだ。

5. Native Client Hacks パッチが当たったgcc（nacl-gcc）でELF形式の専用バイナリを生成。system callはjmp命令で、その先でトランポリンで権限昇格とか複雑なことをしてる。

コードセグメントのみ実行可能、jmpは32バイト境界。int80hは静的・動的なチェックではじかれるが、初期リリース版にはいくつか穴があってexploitで電卓起動したりできた。

enjoy sandboxing!だそうな。sandboxingという単語があることに驚き。

7. perlでperl vmを実装 構文木は簡単に取れる。while(op = CALL_FPTR(op))という感じでステップ実行できる。

8. vmのきもち 構文木単位で見るとCスタイルループがなぜ遅いのかとかがわかりやすい。

9. C++で.pmを書く XSを書くためには謎のsugarがいっぱい。

Devel::BindPP::plを使うと#include とするだけでC++で（Cと比べて）簡単にXSが書けるし、Perlのデータ構造の入門にもなる。

私にとってはblessが謎だがPerl mongerにとってはextern "C" __declspec(dllexport)とかがイミフらしい。

10. profiling Devel::NYTProfは行単位とかのプロファイリングができて超便利なのでみんな使おう。

kcachegrind使うとコールツリーや占有率などを可視化できる。DB::enable_profileとDB::disable_profileで部分的なプロファイリングもできる。

11. malware検出 最近のmalwareは動的アップデート機能などを備えているので、setup.exeと挙動がほとんど変わらない。そのため一般のプロセスと区別が難しい。抜本的な防御方法を求む。

12. ブラッディマンディ 作品中のハッキングシーンが実在するexploitなので必要以上にリアル。

NTFSストリームとかtelnet root loginとかIP成りすましとか。