no Perl; use x86; *1ですので、Perlにそんなに興味がない方でも楽しめると思います!!(笑)
今日はユニバーサルアクセスを兼ねて内容を細か目に書いたのですが、書いてる本人もあまり理解してないので雰囲気だけ読み取って下さい・・・。誤りの指摘は大歓迎ですorz
4/23追記: 内容の補完のために、すぎゃーんメモさんとこのメモも合わせてどうぞ。
第一部 sandbox特集
バイナリ畑で捕まえて - inside lleval / dankogaiさん
- バイナリ麦畑で捕まえて → lleval というサービス
- デモ
- 動かすのは簡単 → 不正なコードを動かされると困る → 捕まえて欲しい
- Inside lleval
- forkさせないテクニックは?? → FreeBSD::i386::Ptrace を利用
- kazuhookuさんによる指摘
- ファイルの書き込みができないようにしたい
- pt_getregsによってレジスタを見る。
- スタックの2番目の引数をチェックする
- スタックにnull pointerを書けば、ファイルが開かれずに済む
- 課題 → forkは引数をとらない・・・
- SEGVで落とす
- →$SIG{SEGV}を拾える
- sigactionで止める。こちらは引数をとるので止めれる
- SYS_mmapで0x00000000 に値を突っ込まれると困る(ぬるぽなので)
- mmap も引数をとるので、OK
- まとめ: 子供達には、思う存分遊んで頂きたい
The Perl Sandbox / tokuhiromさん
- llevalはいいけど、FreeBSD専用(どこでも動く物が欲しい)
- Sys::Protect →安全じゃないことが知られている
- 動機: evalができるIRCが欲しい
- 危険なシステムコールを潰しまくればいい
- segvは起きてよい
- 新しいプロセスを作って動かす作戦
- DynaLoaderが非常に危険
- JSON::XSやautoboxは安全、PadWalkerとかは危険
- Devel::SafeEval / DynaLoaderのloadを、置き換える。
- レキシカル変数に隠すのはあまりよくない
- → DB::DBやtieやoverloadで突破できる
- overload のstringfy は危険
- Scalar::Util::blessedでチェック??
- → 0や空文字列にblessすると、上記チェックは偽となる*2
- tieで、@INCや%SIGとかtieすると非常に危険
- tiedでチェック?
- まとめ: Pure perlで書くと危険なので全てXSで書きました
How about Kindle hacking? / obraさん
英語で聞き取れませんでした・・・。
- マインスイーパーが動く
- いろんなフォーマットの文書を読みたい
- GPSがある
- ネットワーク で Mac Book につなげる
- busybox の telnetを使える
- Kindle2とKindle1は少し違う
- login prompt → root はだめ・・・
- Kernelを再構築
- NFSがあった
- クロスコンパイルしなきゃ?? ARM build
- apt-get で gccを入れる
- PerlよりPythonのほうが楽っぽい
- CPANがない → easy_installがあるが、全然easyじゃない
- QtとPyQT → でもX11じゃない
- HTMLサポートが、貧弱
- Pythonコード書いた
- 時間切れ(まだスライド結構あったみたいです)
第二部 x86 binary hacks
世界のセキュリティコンテスト(Capture the Flag)ってどんなもの? / kenjiさん
- サーバを守ったり攻撃したり。戦争ゲーム
- WEBアプリならXSSやSQLインジェクション
- バイナリならオーバフローや脆弱性
- 問題
- Binary、Exploit、Web、Forensic、Trivia
- Binary
- 難読化はよく使われる
- 難しい問題だと、逆アセンブラを失敗させる
- jmpをpush,retや stc, jbに変換。無意味な命令を追加等
- →jmp命令一個で済むものを、たくさんの命令にする。
- 難読化によって、解析者を試す
- Forensic問題
- Trivia問題
- まとめ: 世界のエンジニアと切磋琢磨できる
Native Client Hacks / Fukumori Daikiさん
- ブラウザのサンドボックスが壊れている
- Active X → なんでもあり。電卓起動とか
- プログラムミスによって、脆弱性がつかれている
- Google Native Client
- 静的解析でintコールはできないので、自己書き換えコードで試してみる
- ロード時のチェックは通る。
- 動的チェックできちんと引っかかる
- jmpは32バイト強制。中途半端なアドレスへのジャンプは封じられている
- jmp先のコードも動的チェック(到達可能か)
- スタックの制御
- オーバフローが出て、実行できなくしている
- 攻撃への耐性が強い → 色んな攻撃が失敗した
- でも、電卓を実行してみる(計算は大事!)
- 整数オーバフローを利用 →電卓実行できた
- ↑今はもう直っている
- 他のドメインからの情報を読みたい
- 環境変数の情報の取得
- まとめ: サンドボックスは破られる。みんなで破れば強くなる。みんなで破りましょう!
Perl で学ぶ x86 アセンブラ入門 / takesakoさん
- 16bit時代: MS-DOSの.comファイル形式
- 非常にコンパクト
- .comバブル!
- 逆アセンブルでHello Worldの文字が読める
- Win32API時代
- Hello Worldのメッセージボックスが出るデモ
- GOLFすると90byte程度のものが作れる
- Win32::APIを使ってPerlで書く
- 簡単にできる。デモ。
- DynaLoaderを使ってやってみよう!
- マシン語を直接指定
- h(\x68)はpushの意
- 後はpack使いまくりで
- デモ → 動くよ!
- マシン語を直接指定
- DEP → リードオンリーの領域で実行できない制限。解除しとくこと*3。
- PerlベースのJITコンパイラを作ろう
- 0xc3を使う
- JIT化
- TRAPを使う。PERL_SIGNALS=unsafeを指定して実行しないと実行できない
- INT3はWindowsでは動かない
- UD2を利用 → ILLをトラップする
- 64bit OSでは?
- syscall命令が使われるようになった
- CPUID CPUの名前を得られる
- Inline::x86 → Linuxでは工夫が必要
- x86_sub にコードを渡すだけ
- 64bit判別法など
第三部 Perl Internals
use Acme::Perl::VM; / gfxさん
- 復習
- デモ
- Perl VM概要
- スタックでやりとり
- PPcode と呼ぶ
- opコードを、 pushで実装
- C実装は、PL_Stack_base ← @PL_stackで済む
- 可変長引数 → マーカーを利用
- Opcode → 手続きとデータを持った構造体
- 例: OP_CONST: スタックに積む / 定数
- 例: OP_COND_EXPR: 分岐 / 他の経路
- Opcodeは連結リスト。木構造。構文木。
- 説明してないこと → SVファミリ、スクラッチパッド、ブロック、コンテキスト、スコープ、一次変数とか
- ソースを読んだ感想
- 自動最適化とかはできそう
- ByteLoaderは再考の余地がある
- デモ
- 関数呼び出しの例
- まだshiftは実装してない
- printだけなら簡単
CPUの気持ちは大事だけど、VMの気持ちも考えよう / Yappoさん
- 申し込もうとしたら、すでに発表することが決まっていたらしい
- B::Concise で、構文木が見れる
- 文字列連結は、コンパイル時に最適化されている
- B::TerseはConciesにterseオプションでも同等
- B::Deparse : Perlがどう解釈をしてるか
- 例: warn (1+2) * (2-1) は、warn(3) * 1
- Devel::Peek: Perlの世界の変数の中身
- CURが実際に使われてる量。LENが確保されてる量(by dankogaiさん)
- Scope::Upper : 上のスコープをいじれる
- Devel::RunOpsAnalize : 実行しながらopコードの呼び出し回数を解析
- デモ : print文、for文
- 99 * 99 とかも、コンパイル時に展開してくれる
- &foo、foo()、fooの違い → 同じ
- メソッド呼び出し: $self, $class, can経由とか → canはやっぱりコスト高いね
- use, require, do の違い
- loopの違い → Cスタイルは明らかに遅い
- まとめ: VMのことを考えるときりがない。それでもプロファイリングするならDevel::NYProfを使おう
Devel::BindPP をつかって簡単に C++ で Perl の拡張モジュールをつくろう! / tokuhiromさん
- 初めに: SysProtectがなぜ駄目かを言い忘れてた → 全部脆弱
- XSを使う理由 : Cのライブラリが使いたい。他、変態的hackとか
- XSは簡単ってのは嘘
- XSは外部DSLなので、覚えるのは大変
- XS = C + macro + シュガー
- Cのマクロが多過ぎる。暗号的
- my_perl undefinde this functionとか。どうすればいいのかわからナイ
- dTHXとかaTHX_ とかで直るけど、初心者はわからないでしょう
- newSVpvのSVとpvは何の略??わかりにくい
- SvREFCNT_inc_・・・とか覚えられない
- v8の拡張は書きやすい。C++の学習コストは安価
- XS()がエントリポイント。::は__に直す
- pl::BootStrapCtx、pl::Package、とか書ける
- newはxs_new
- pl::Pointerとかクラスで書ける。
- pl::Ctx c(1); → 引数を一個とる
- キャストはas_pointer とか
- BindPPは1ファイル。ヘッダファイル。
- ドキュメントはdoxy。読んで下さい。
- pl::Hashとか、わかりやすいメソッド名になってる
- BindPPのソースを読んでも参考になる。
- XSの書き方とか。Perlのドキュメントよりわかりやすいでしょう
第四部 Lightning Talks
Devel::NYTProf / clkaoさん
マルウェアの検出 / sonodamさん
ブラマンのブラックな話 / isidaiさん
5分で danbot server を立ち上げる方法 / Yappoさん
閉会の挨拶
今日の内容は、わからなくて普通です(id:TAKESAKOさん談)。