汚いなさすが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問題の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という単語があることに驚き。
6. no perl; use x86;
Win32::APIやDynaLoaderでHello worldを書く話。
WindowsではDEPをoffに、Linuxではmprotectでページをアンロックする必要がある。
9. C++で.pmを書く
XSを書くためには謎のsugarがいっぱい。
Devel::BindPP::plを使うと#include
私にとってはblessが謎だがPerl mongerにとってはextern "C" __declspec(dllexport)とかがイミフらしい。
10. profiling
Devel::NYTProfは行単位とかのプロファイリングができて超便利なのでみんな使おう。
kcachegrind使うとコールツリーや占有率などを可視化できる。DB::enable_profileとDB::disable_profileで部分的なプロファイリングもできる。
11. malware検出
最近のmalwareは動的アップデート機能などを備えているので、setup.exeと挙動がほとんど変わらない。そのため一般のプロセスと区別が難しい。抜本的な防御方法を求む。