Shibuya Perl Mongersテクニカルトーク#11 に行ってきた

Shibuya Perl Mongers : Shibuya Perl Mongersテクニカルトーク#11に行ってきた。Shibuya.pm初参加。
テーマは"no Perl; use x86;"と、「低レベル」な内容。
内容についてはYokohama.pmに続きid:hirataraさんのレポートが詳しいです。
今日はShibuya.pm #11の日です - 北海道苫小牧市出身のPGが書くブログ


が、せっかく自分でも手書きでメモをとってみたので、理解できたところと出来なかったところを整理するためにも、全部晒してみます。
色々間違っているところもあると思いますが、ご指摘などいただけると幸いです。

  • 第一部 sandbox特集
    1. バイナリ畑で捕まえて - inside lleval (dankogaiさん)
      • ライ麦畑でつかまえて、から「バイナリ畑で遊んでいる子どもたちを捕まえてあげられるような」
      • lleval
        • Perl, BASIC, PostScriptなど実行可能
        • イヤなコードが実行されないようになっている
          • "while 1"の無限ループ, fork, syscallなど
        • でもLWP::Simpleなんかは通す
      • どうやって実現するか?
        • シンプルなCGI
        • FreeBSDのnullfsでほとんどHDD容量を使わない
        • FreeBSD::i386::Ptraceが監視
          • pt_to_sceシステムコールに入るときにつかまえる
          • が、kazuhookuさんが指摘「FreeBSDではSandBoxを作れない」
            • 実行されてから検出されることになる
            • 正確にはすぐに実行されてしまうわけではない
          • レジスタは書き換えられないが、スタックは書き換えられる
            • espレジスタに8を足したもの、でスタックの2番目の引数を得られる
              • これを書き換えることで危険な関数は防げる
            • でもforkは引数とらない
              • 0番地をナントカすることでSEGVを起こせる
                • Signal Handlerを書き換えられたり、0番地に実行可能コードを埋めたり
                  • これらの操作は引数トラップで防げる
      • まとめ
        • 「子どもたちには思う存分遊んでいただきたい」
    2. 任意のコードを安全に eval する方法の実装方法と、突破方法について (tokuhiromさん)
      • The Perl SandBox
        • LinuxでもSandBoxを動かしたいよね
        • Sys::Protectというものはある。でも全然unsecure
      • IRC botを作りたい
        • 危険なものをつぶす
          • fork, system, etc.
          • SEGVはしょうがない
        • 基本的に新しいプロセスを作って実行
          • VMのOpcodeをmaskする
            • PL_op_mask or PL_ppaddr
          • DynaLoader(XS, DLL用のモジュール)が危険
            • 「一般的な」x86コードをpackして流し込めてしまう
            • wrapperで差し替えてやる
              • でもXSは使いたい
            • レキシカル変数で隠す手法
              • DBパッケージで見ることができてしまう
            • Scalar::Utilのblessedでチェック
              • "0"というパッケージ名で通過してしまう
            • tieも使える
      • まとめ
        • PurePerlでは危険なので全部XSで書きました
      • ぴょんぴょん飛び跳ねながらスクリーンを指さしてたのが面白かったw
    3. How about Kindle hacking? (obraさん)
      • 英語プレゼン
      • kindleという電子書籍リーダー?のhack
      • ほとんど英語が理解できなかった
      • とにかく色々試みてhackした、という話だったらしい
      • 喋りに抑揚があって、プレゼンはすごい上手い、と思った
  • 第二部 x86 binary hacks
    1. 世界のセキュリティコンテスト(Capture the Flag)ってどんなもの? (kenjiさん)
      • スライドは http://07c00.com/a.pdf にあります
      • Capture the Flag (CTF)の紹介
        • ルール:XSSやオーバーフローなどの脆弱性を利用して隠されたパスワードをみつける、など
          • Binary, Exploit, Forensic などのカテゴリ
          • Binary問題:実行ファイルが配布される
            • fileする、stringする。kernelモジュールのようだ、単体ではロードできない
            • 難読化の解除
            • システムコールフック、uprintfからさかのぼる
            • 結果が0x****になるシステムコールの組み合わせを総当たりで探す
            • 難読化は基本
              • jmp命令を色々な組み合わせに変換
              • 純粋な解析社としての能力が試される
          • Forensic問題:物理メモリのダンプから特定文字列の仮想アドレスを求める
            • プロセスの特定
              • 0x03,0xXX,0x1b,0xXX の並びを探し対象プロセスを見つける
            • PDBから物理/仮想メモリへ…?このあたりは全然分からなかった
          • Trivia問題:問題文のみ提示
      • まとめ
        • 世界のエンジニアと切磋琢磨できる
        • 楽しいよ!
    2. Native Client Hacks (Fukumori Daikiさん)
      • ブラウザサンドボックスの崩壊
        • ActiveXが何でも出来てしまう
      • GoogleNativeClient
        • x86バイナリを安全に実行する枠組み
        • ひとつのバイナリが色々な環境で
        • ELFのようでELFでない
        • NaClランタイム int80h, sysenterはない
        • トランポリンと呼ばれる場所に飛んで何らかの処理をしているらしい
        • 自己書き換えでint 80hを隠してみると
          • ロード時のチェックは通る。でも動的チェックで落ちる
        • その他にも制限がいくつか
          • 32バイト境界で関数が置かれる、など
          • 色々試したが成功しなかった
      • それでもhackした
        • 電卓を実行したい!
        • 基礎の基礎(?)、整数オーバーフロー
          • 足し算の結果で確保域を小さくとる
          • もう今は直っている
        • クロスドメインアクセス
          • 他のドメインからのレスポンスをとりたい
          • "http:***"は読めない
          • GoogleApps?の画像をenbedすることで取得できるように
          • 報告してもう直っている
      • まとめ
    3. Perl で学ぶ Win32/FreeBSD/Linux/x86_64 アセンブラ入門 (takesakoさん)
      • もうlleval破られたよ報告w
      • MS-DOS 16bit int 21h
        • .comファイルができる
        • ドットコムバブル時代w
      • 今:32bit
        • Win32APIでHelloWorld
        • 97byteのexeファイル
      • Perlでやろう Win32::API
        • 簡単にWin32APIを叩ける
        • DynaLoaderで直接バイナリを流したり
      • Linux:int 80h
      • JIT compiler
        • \xcd\xc3(?)を使う
        • PERL_SIGNAL="unsafe"を設定
        • INT3はWindowsでは動かない
          • UD2? $SIG{ILL}でナントカする?
      • 64bit
        • CPU ID(processor name)をとったりできる
      • Inline::x86
  • 第三部 Perl Internals
    1. オレオレPerlVM (gfxさん)
      • Acme::Perl::VM
      • BモジュールでPerl構文木にアクセスできる
        • VM作らなきゃ!ということで作った
      • デモ
        • 普通に実行されるので気付かない
        • DEBUGモードにすると確認できる
      • VMの仕組み
        • スタックで手続きの引数、戻り値を管理する
          • opcodeがスタック操作1つ, ppcodeが1ブロック、のようなイメージ
          • push, popで操作
          • Perl実装ではもっと色々やってるけど省略
          • 可変長引数に対しては
            • マーカー?よく分からなかった
          • Opcode:手続きとデータの構造体
            • データは他のOpcodeへのポインタだったりもする
          • 枝を持つLinkedList
            • これが構文木。辿ることで命令を実行していく
          • Opcodeが実行される様子
            • よく分からなかった
          • B::Consiceで構文木を出力したりもできる
      • まとめ
        • 説明していないこと:SVファミリ、スクラッチパッドなど
        • 最適化できそうな部分がある。続きはWebで!
    2. CPUの気持ちは大事だけど、VMの気持ちも考えよう (Yappoさん)
      • 初心者向けセッション(?)です
      • use B
        • B::Consice, B::Terse, B::Deparseなど使える
      • Devel::Peek
        • 変数を解析したりできる
      • ここまでは一般教養ですよね
      • 本題:Devel::RunOpsAnalize
        • 実行しながらOpcodeのステップ実行を見ることができる
        • Iteratorの処理等も見える
        • constな値は既に計算された状態で解釈される
        • function, methodの呼び出し、use, requireなどの動作も読める
      • チューニングは大事。time()をそのまま使わない
    3. Devel::BindPP をつかって簡単に C++Perl の拡張モジュールをつくろう! (tokuhiromさん)
      • XSはCライブラリ使うのに簡単に使いたい
        • でも難しい。簡単って言ったけど、あれ嘘。
      • 書き方覚えるのめんどい、マクロが多くて大変
      • C++でXSを書けるようにDevel::BindPP作った
        • 1ファイルのヘッダです
        • doxygenで作ったドキュメントあります
          • これ見ながら書けば書きやすいと思うよ
  • 第四部 Lightning Talks
    1. Devel::NYTProf (clkaoさん)
      • 台湾から
      • Perlが遅いときは最適化、でもまずはprofileして遅いところを探さないと
      • Devel::DProfというのがある
        • サブルーチン単位でprofilingできる
      • Devel::NYTProf
        • 行単位、ブロック単位でprofilingできる!
        • PHPでcalltreeの可視化の話
          • kcachegrindを使うとできる?
      • google codeにあります
    2. マルウェアの検出 (sonodamさん)
      • マルウェア大好きです
      • 目標:捕捉されないエコなマルウェア
      • ダウンローダー:一般的なsetup.exeとほぼ同じ
      • 検出技術いろいろ
      • ルールベース:危険な動作を捕捉してブロック
        • WinAPIの利用をモニタリングするなど
        • 追加されたモジュールは検知できる
      • 「検出」はできるが、「防御」はどこまで?
        • お手上げ状態。ナイスアイディア求む。
    3. ブラマンのブラックな話 (isidaiさん)
      • ブラッディ・マンディとは
        • 漫画からドラマ化した物語
        • 普段はだらしない主人公がPCの前では最強
        • ハッキングシーンが真面目に作られている
          • 実在する脆弱制が画面に出ている
          • camera_hijack.pl
            • よく分からなかった
      • ハッキングは犯罪です!真似しないでね!!
    4. 5分で danbot server を立ち上げる方法 (Yappoさん)
      • Xenで安全サーバーを立ち上げる
        • 3分くらいでできます
        • koan?
      • Hatetterの紹介
      • そろそろinstall終わったかな
        • できてた。モジュールはlocal::lib使うといいよ
    5. Windowsユーザのための初めてのPerlプログラミング (HASEGAWA Yosukeさん)
      • ものすごくファンシーな可愛らしいスライド
      • 「低レベルな話です」
      • 第1部、第2部、あっっという間に終了
      • シグナルハンドラを使ってバイナリを実行させる?早くてついていけなかった
      • シグナルを使ってプロセス通信
        • バッドシグナル通信
      • Win32::API::Callback
        • 他で出来ない使い道あるよ
  • まとめ

「今日の内容は、わからなくて普通です」

  • 感想
    • バイナリ、深い。正直言って全然わからない。
    • これだけバイナリのことを深く知っているヒトたちがいるのか、と。
      • どこでどういうことしていてそういった知識がついたのか知りたいところ
    • 終了後にTAKESAKOさんとご挨拶できた!やった!!