汚いなさすがPerlきたない

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問題のWindowsPDBというのは、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という単語があることに驚き。

6. no perl; use x86;

Win32::APIやDynaLoaderでHello worldを書く話。
WindowsではDEPをoffに、Linuxではmprotectでページをアンロックする必要がある。

7. perlperl 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成りすましとか。

13. irc bot server立ち上げ

xen+cobra+koanで三分でVMができる。なぜかユーザ名がdankogaibot名がdanbot。
余談(こっちの方が長い)HTTP::Engine+Data::Model::Driver::Queue::Q4M+memcachedで、DB(っぽい?)だけどノンブロッキング

14. win32api入門

無理やりcdeclの関数を呼ぶhackなど。
Windowsではint3の代わりにSetConsoleCtrlHandlerとか何とか。
ある意味わかりやすかったが、Perlには普通の入門はないのかと思った春の夕暮れ。
しかしながら、普通でない方法で書くことに大きな喜びを感じる、というのはとても共感できる。