本を読む

読書やコンピュータなどに関するメモ

Shibuya.pm TT #11に参加した

 Perl開発者の集まりであるShibuya.pmのテクニカルトーク#11というイベントに行ってきました。あいかわらず、濃い技術話をテンポよくノリよく話していて、楽しく勉強できました。

 Perlといいつつ、今回はシステムコールとかレジスタとかjmpとかNOPとかそんな単語が主に飛びかっていたような…というわけで、内容はわからなかったけどがんばってメモとりました ><

 以下、そのメモのまとめです。間違いなどありましたらご指摘ください。

バイナリ畑で捕まえて - inside lleval (dankogai)

 「サリンジャーは、いま生まれたらPerl Mongerになっていたにちがいない」ということで、ブログで書いていたllevalを紹介。そのこころは、崖っぷちで止める。llevalはLLをWeb上から実行する仕組み。Perlとか、Perl 6とか、みんな大好きBASICとか。

 危ないのでサンドボックスで実行。無限ループは1分でタイムアウト、fork爆弾はすぐ止まる、syscall(&SYS_fork)とかも止まる。グロブ展開してもファイル名をとれない。LWP::Simple::getは許す。

 chroot環境で動く。インタプリタとそれを動かすファイルのみ用意し、あとはnullfsでマウント。

 システムコールを止める仕組みはFreeBSD::i386::Ptrace。奥一穂さんに「つかまえても実行されてしまうはず」と指摘を受けた。で、つかまえたシステムコールそのものではなく、スタック上の引数を書き換える方法を採用。forkは引き数をとらないのでアドレス0に飛ばして落とす。0番地に動くコードを書き込まれる心配は、mmapをトラップする。

 ということだけど、Perl Hackerたちが日夜クラックにいそしんでいるらしいw

任意のコードを安全にevalする方法の実装方法と、突破方法について (tokuhirom)

 evalできるIRC botが作りたい。llevelはいいけどportableじゃない。Sys::Protectは非常にアンセキュアで知られている。ということで、いろいろな方法を検討した話。

 Perl VMはOP_systemやOP_execでsystemやexecを実行する。それをPL_op_maskやPL_ppaddrでマスクする。Opcode.pmもある。

 でもXSやDLLを読み込むDynaLoaderが危険。DynLoader::dl_install_xsub。でも、これを使っていて許可したいライブラリもある。で、ラッパーのDevel::SafeEvalを開発。dl_install_xsubを別の変数に入れて隠してフックし、確認してから実行。が、DB::DBを使うと1つ上のスコープが見える、overloadを使うと文字列化をフックされる、ScalarUtil::blessedでチェックしても'0'にblessするとか空文字列にblessするとかいう手も、@INCや%SIGをtieするという手も、といろいろ突破方法が。

 で、結論は、結局XSで書きました、とw

How about Kindle hacking? (obra)

 英語だったので、聞きとりは自信なし。

 AmazonのKindleはナイスなデバイスだよ(実物見せる)。新聞とか本とかブログとか読めるよ。NetFront 3.5も乗ってて、JavaScriptとかxmlHttpRequestも使えるよ。あとminesweeprもあるよw

 でも、AmazonのDRMにlockされているし、いろいろログがAmazonに送られているみたい。GPS情報は大丈夫?

 俺は本を読みたかっただけなんだけど、Kindleが "Hack me" と呼んでいるw そこでハック。

 (emasaka注:以下、特に理解があやしいので、ブツ切りで)

 ネットワークやUSBをつかまえてMacに接続してproxy。Kindleはいくつかのポートをリッスンしている。busyboxをつっこむ。telnetdを動かしたり。rootでログインしたが、login incorrectなので、/bin/shを実行。カーネルをリビルド。nfsがある。

 Perlを入れたかったけど、ARMなので、クロスコンパイルはやりたくない。そこで、gPhoneでコンパイルw

 QtにはPythonバインディングのPyQtがあるけど、KindleにはXがない。フレームバッファならQtEmbeddedが使えるけど、Pythonにバインディングがない。

 KindleのHTMLサポートは貧弱。

世界のセキュリティコンテスト(Capture the Flag)ってどんなもの? (kenji)

 サーバー攻略競技の「Capture the Flag」の紹介。パスワードを発見したり、XSSやSQLインジェクションをしかけたり、バッファオーバーフローをしかけたり。チームを組んで得意な分野を分担。http://07c00.com/a.pdf

 たとえば、謎のバイナリファイルを手掛りにパスワードを探る。fileやstringsで調べるとFreeBSDの.koファイルらしい。が、単体ではロードできないのでIDAProで解析し、解析結果をもとにExploitを作成。アセンブラを見ると、難読化がされている。へんなアドレスにジャンプしていて実はNOPというもので、IDAProや人間をだますもの。

 カーネル空間のIDTを書き換えてシステムコールフック。Ring0の関数をフックしているので、ユーザー空間からはINT 80hをすべてフックしているように見せる。

 パスワードを表示するuprintf関数の呼び出しをさかのぼる。条件がそろえば呼び出すらしい。そこで、システムコールの呼び出しを総当たりし、値が条件に合う全パターンを出力するコードを作成。

 このように、IDAProをだますような難読化は基本。jmpをpushとretに置きかえるとか、jmpをstcとjbに置きかえるとか。これで、IDAProの能力に頼れず、人間の能力の勝負に。

 次の例として、Forensic問題。OSのダンプファイルから「forensics challenge」の仮想アドレスを求める。まずOSを特定。次にプロセス先頭のパターンを探す。あとは物理/仮想メモリの対応表を求める。

 Trivia問題もある。x86の命令と同じPowerPC命令を答えるとか。試す環境がその場になかったりして、最後はリファレンス。でもPS3でも試せるよw

Native Client Hacks (Fukumori Daiki)

 ブラウザ上でx86コードを実行するGoogle Native Clientの攻略話。いろいろ攻略を見つけてGoogleに報告し、修正されたんだとか。

 Google Native Clientは、Firefoxの上でランタイムが動き、そこでコードが動く。ELFのようだがELFでない専用のコード。nacl-gccでコンパイル。

 まずシステムコール。ダンプしてもINT 80hやsysenterは見あたらない。静的に埋め込んでもエラーになる。トランポリンに一度とばして、そこでチェックしてから実行するらしい。自己書き換えコードを試すと、ロード時のチェックは通過しても、動的にもチェックされていて、エラーで落ちる。

 jmpにも制限があり、32バイト境界のところでないとダメ。解析済みコードから到達可能かもチェックされる。

 コードセグメント以外は実行できず、スタックは実行できない。モジュールごとにセグメントレジスタを切り替えている。

 整数オーバーフローは、教科書どおりの脆弱性があった。今は直っている。

 クロスドメイン脆弱性はどうか。file://で動くのだけど、画像をエンベッドするとGoogleのサーバーに置かれるので、クロスドメインアクセス成功。今は直っている。

 あと、環境変数領域は読める。

 まとめは、みんなでサンドボックスを破って、強くなってもらいましょう、とw

Perlで学ぶWin32/FreeBSD/Linux/x86_64アセンブラ入門 (takesako)

 さまざまな機械語の話なので、箇条書きで。

  • MS-DOSのINT 21H
    • .comファイル(ヘッダのない実行ファイル)
    • 「.comバブル時代」w
  • Windows PE
    • 32bit
    • Win32APIを呼ぶ
    • MessageBoxを表示
    • PEヘッダのGolf
      • 92BのHello World
  • PerlのWin32::APIで
    • PerlのDynaLoaderで
    • Windows XP XP2以降はDEPで禁止されるので、オフにすると実行できる(危険)
  • Linux 32bit
    • EAXレジスタにセット
    • 省略
  • Perl x86でJIT compiler
    • DynaLoader::dl_install_xsub()にコードを指定して実行
    • 実行している間にコードを書き換えられるか
    • 環境変数でPERL_SIGNALS=unsafe
    • SIGTRAPはWindowsでは使えない
      • $SIG{ILL}トラップ
  • 64bit Linux
    • syscall命令
  • CPUIDをとってくるプログラム
    • 3回くりかえすループアンローリングw
  • Inlinde/x86.pm
    • Perlでアセンブラコードを書いてdoで動く
    • Linuxではmprotectで書き込みフラグをたてる必要

オレオレPerlVM (gfx)

 Pure PerlでPerl VMを実装した話。Acme::Perl::VM(APVM)。パーサーはなくて、Perlの作った構文木を実行する。デバッグ出力もできる。

 スタックで手続きの引き数や戻り値を管理。Perlの実装ではPL_stack_baseだけど、APVMの実装では@PL_stack。Perlなので管理かんたん。可変長引き数はスタックマーカーで。

 Opcodeは手続きとデータを持った構造体。連結リストになっていて、全体で木構造になる(=構文木)。

 PerlのB::Conciseで木構造を出力できることを知って衝撃だけど、Acmeだからいいや。

 これを作って、サブルーチン呼び出しやループが遅いわけがわかった、と。

CPUの気持ちは大事だけど、VMの気持ちも考えよう (Yappo)

 先に結論を書くと、「VMの気持ちを考えてもキリがない」w。やるならプロファイルで。Devel::NYTProfileいいよ。

  • use Bとか標準モジュールで
    • B::Concise
      • VMコードを表示する
      • 文字列リテラルの連結は、コンパイル時に解決されるので、連結されて表示される
    • B::Deparse
      • warn (1+2) * (2-1)がwarningになるわけ
        • warn(3)が先に結合される
    • Devel::Peek
      • 内部情報を出力
  • もっとやるにはほかのモジュール
    • Scope::Upper
      • スコープから上の要素を書き換える
    • Devel::RunOpsAnalyze
      • 実行しながら解析
      • ループや、myのスコープなどを解析する例
      • 定数畳み込みはやってくれている
      • &foo、foo()、fooは同じように解析
      • メソッドコールの処理
        • ふつうの関数、メソッドコール、can
      • いろいろなループのステップ数比較
        • Cスタイルはステップ数が多い

Devel::BindPPをつかって簡単にC++でPerlの拡張モジュールをつくろう! (tokuhirom)

 XSを使う目的でいちばん多いのはCライブラリのバインドなので、C++で書きやすいようにした、という話。

 まずXSは難しい。外部DSLで、インデントや改行に意味があるし、Cのマクロの山でエラーのときにわけがわからない。毎日XSをやってるような人ではないと覚えきれない。

 以下、実際の利用方法を紹介。1つのヘッダファイルなので改造もできるよ、とか。

Devel::NYTProf (clkao)

 ここからLT。まずは台湾から来た高さんが、ちかごろ流行りのプロファイラのDevel::NYTProfを紹介。

 まず、How do you speed upってことで、それはProfileだと。それにはDevel::Dprofがあるのだけど、sub単位のプロファイリングだし、セグフォしたりw

 で、Devel::NYTProf。DBIの作者の人が作った。HTML出力だし、行単位のプロファイングもできる。みんな使おう!

 このあいだOSDC.TWというのがあって、PHPのcalltreeがいいなー、Perlほしいと思った。そこで、Devel::NYTProfの結果をKcachegrindに食わせるようにするツールを使うと、ほらcalltreeが。ほかにもいろいろDevel::NYTProfの関連ツールがあって便利だよ、と。

マルウェアの検出 (sonodam)

 サイバー大学のセキュリティ研究家の人で、「私はマルウェアが大好き」とw

 最近のトレンドは「捕捉されないエコなマルウェア」。ダウンローダー式で、HTTPのGETで本体をとってくる。コンパクトなうえ、一般的なsetup.exeと変わらないので捕捉しづらい。

 まとめは、捕獲はできても検知は難しく、業界的にはお手あげ状態なので、アイデアお待ちしています、と。

ブラマンのブラックな話 (isidai)

 先月まで本当に高校生だったセキュリティの人が、ドラマ「ブラッディ・マンデイ」を語る話。プレゼンの画面エフェクトに凝っていて、ちょっとゲームっぽい感じが面白かった。

 突っ込みどころは、なぜか攻撃先のサーバー情報を事前に知っていること。それ以上に、実際に存在する脆弱性や攻撃手法が出ていて、TVで放送していいのかとw

5分で danbot server を立ち上げる方法 (Yappo)

 evalのIRC botを作る話。Cobbler Koanでその場でさっくりXen環境を作成。

 …を待ってる間、Hatetterの話。はてなお気に入りアンテナを使ってPOST時間を捕捉するというストーキングツールw。HTTP::Engineをベースに、ワーカーをQ4Mで動かし、データはmemcached。「mashupサイトはデータベースを使ったら負け」、と。

Windowsユーザのための初めてのPerlプログラミング (HASEGAWA Yosuke)

 x86バイナリとPerlの呼び合いの話を、5分の間に次から次へと披露。

  • ActivePerlをインストール
  • Win32::API
  • Perlからシグナルハンドラでx86コードを実行
  • Perlから実行したx86からPerlを呼び出す
    • シグナルがややこしい
  • 「それWin32::API::CallBackでできるよ」
    • 引数のうけわたしが自然。グローバル変数を使わなくていい
    • シグナルハンドラのまともな利点としては、stdcall以外のDLL関数も呼べること(Win32::APIはstdcallのみ)

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/597-c75c211f

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad