狠狠撸

狠狠撸Share a Scribd company logo
マシン语によるコード実行
              みむら (@mimura1133)




マシン语によるコード実行 - @mimura1133        1
こんなひと。
 ?   みむら ( @mimura1133 / Satoshi Mimura )
 ?   http://mimumimu.net/

 ?   セプキャン 2011 参加したり、
     U-20 プロコン出たりとか、いろいろ活動中。

 ?   Phi16 さん誘った(遺伝的てとりす。)けど、
     ぼく、すごくないですごめんなさい。

 ? .net とか C# とかいいよね!!
 ? WP7 もやるけど、ネタがかぶるのでやめた。
 ? このまえ Console Twitter が窓の杜のった!

マシン语によるコード実行 - @mimura1133                  2
さっそく、本題。
マシン语によるコード実行 - @mimura1133   3
Cのプログラムなら読めるよね!




マシン语によるコード実行 - @mimura1133   4
要はどういうこと
  1.   マシン語コードをメモリ上に格納。
  2.   実行可能にする。
  3.   実行させる。




マシン语によるコード実行 - @mimura1133   5
で、結局何に使えるの。
  ?   x86 プロセッサならば、
      マルチプラットフォーム! (すばらしい)

  ?   .net Framework や Java などの、
      JIT コンパイラの仕掛けで使える。

  ?   ひとまずかっこいいコードが書ける。


マシン语によるコード実行 - @mimura1133         6
作り方。
  ?   自分でいきなり書く。

  ?   バイナリエディタで
      EXE ファイルの .text セクションとかを
      持ってくる。

  ?   コンパイラにいい感じに吐いてもらう。
      (推奨)

マシン语によるコード実行 - @mimura1133       7
作り方 for Visual C
  1.   コードをかく。
       (リンクとかするやつだとめんどいので、めん
       どくないやつにするとヨイ。)

  2.   cl /c test.c
       とかやって、 obj ファイルをつくる。

  3.   dumpbin /rawdata /out:test.txt test.obj
       とかやって、テキストファイルに出力する。

マシン语によるコード実行 - @mimura1133                       8
作り方。
  4.   x86 プロセッサは 「リトルエンディアン」なの
       で、格納順を考えてコードに書く。

  5.   読みやすさを考えて、
       NOP (何もしない : 0x90) を入れて、
       見栄えを整えればできあがり。




マシン语によるコード実行 - @mimura1133        9
技術的なところについて。
マシン语によるコード実行 - @mimura1133   10
動きをみてみる。
  ?   まずはこやつで、動きを確認してみる。




マシン语によるコード実行 - @mimura1133   11
動きをみてみる。
  ?   どう見ても普通に値をスタックに入れている
      だけ??




マシン语によるコード実行 - @mimura1133   12
動きを見てみる。
  ?   スタックに書き込みが終わった後、
      書き込みはじめの位置 (EBP - 0x88)
      の場所にサブルーチンコール(CALL)を掛ける。




マシン语によるコード実行 - @mimura1133       13
動きを見てみる。
  ?   スタックの中のデータを実行し始める。




マシン语によるコード実行 - @mimura1133   14
適当に技術面。
  ?   リトルエンディアンの格納順に注意!

      dumpbin で出てくるのは、1バイトごとの値。
      WORD, DWORD 単位などで格納する場合は、
      気をつける。

  ?   00000000: 8B 44 24 04
      -> dat[0] = 0x0424448b;


マシン语によるコード実行 - @mimura1133        15
適当に技術面。
  ?   Mac X (without Power PC)とか
      Linux, UNIX で、作ったコードを動かす時は、

      gcc -m32

      というように、 32bit であることを示すのを
      忘れずに。

  ?   ?? Windows でも gcc では必要なのかも。


マシン语によるコード実行 - @mimura1133          16
適当に技術面。
  ? 普通に配列に入れたバイトコードは実行で
    きない。( CALL 時にエラーで落ちる )
  ? 下記のAPIを使って実行可能状態にする。
    OS        API
    Windows   VirtualProtect
              http://msdn.microsoft.com/ja-jp/library/cc430214.aspx

    Mac OS X vm_protect
              http://www.gnu.org/software/hurd/gnumach-doc/Memory-Attributes.html
              http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_protect.html

    Linux     mprotect
              http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/mprotect.2.html




マシン语によるコード実行 - @mimura1133                                                            17
適当に技術面
  ?   参考資料:

      自分のブログの該当記事:
        http://go.mimumimu.net/rtYMKr


      Mono Project のソースコード:
        http://download.mono-project.com/sources/




マシン语によるコード実行 - @mimura1133                          18
最後に。
  ?   クリスマスですんで、
      かっこいいところを見せたかった。

  ?   あとクリスマスぼっちもいやなので、
      ぜひよろしければ、
      Twitter とかフォローお願いします。

  ?   Twitter: @mimura1133

  ?   そのほか : http://mimumimu.net/


マシン语によるコード実行 - @mimura1133          19
マシン语によるコード実行
            みむら (@mimura1133)




マシン语によるコード実行 - @mimura1133      20

More Related Content

マシン语によるコード実行

  • 1. マシン语によるコード実行 みむら (@mimura1133) マシン语によるコード実行 - @mimura1133 1
  • 2. こんなひと。 ? みむら ( @mimura1133 / Satoshi Mimura ) ? http://mimumimu.net/ ? セプキャン 2011 参加したり、 U-20 プロコン出たりとか、いろいろ活動中。 ? Phi16 さん誘った(遺伝的てとりす。)けど、 ぼく、すごくないですごめんなさい。 ? .net とか C# とかいいよね!! ? WP7 もやるけど、ネタがかぶるのでやめた。 ? このまえ Console Twitter が窓の杜のった! マシン语によるコード実行 - @mimura1133 2
  • 5. 要はどういうこと 1. マシン語コードをメモリ上に格納。 2. 実行可能にする。 3. 実行させる。 マシン语によるコード実行 - @mimura1133 5
  • 6. で、結局何に使えるの。 ? x86 プロセッサならば、 マルチプラットフォーム! (すばらしい) ? .net Framework や Java などの、 JIT コンパイラの仕掛けで使える。 ? ひとまずかっこいいコードが書ける。 マシン语によるコード実行 - @mimura1133 6
  • 7. 作り方。 ? 自分でいきなり書く。 ? バイナリエディタで EXE ファイルの .text セクションとかを 持ってくる。 ? コンパイラにいい感じに吐いてもらう。 (推奨) マシン语によるコード実行 - @mimura1133 7
  • 8. 作り方 for Visual C 1. コードをかく。 (リンクとかするやつだとめんどいので、めん どくないやつにするとヨイ。) 2. cl /c test.c とかやって、 obj ファイルをつくる。 3. dumpbin /rawdata /out:test.txt test.obj とかやって、テキストファイルに出力する。 マシン语によるコード実行 - @mimura1133 8
  • 9. 作り方。 4. x86 プロセッサは 「リトルエンディアン」なの で、格納順を考えてコードに書く。 5. 読みやすさを考えて、 NOP (何もしない : 0x90) を入れて、 見栄えを整えればできあがり。 マシン语によるコード実行 - @mimura1133 9
  • 11. 動きをみてみる。 ? まずはこやつで、動きを確認してみる。 マシン语によるコード実行 - @mimura1133 11
  • 12. 動きをみてみる。 ? どう見ても普通に値をスタックに入れている だけ?? マシン语によるコード実行 - @mimura1133 12
  • 13. 動きを見てみる。 ? スタックに書き込みが終わった後、 書き込みはじめの位置 (EBP - 0x88) の場所にサブルーチンコール(CALL)を掛ける。 マシン语によるコード実行 - @mimura1133 13
  • 14. 動きを見てみる。 ? スタックの中のデータを実行し始める。 マシン语によるコード実行 - @mimura1133 14
  • 15. 適当に技術面。 ? リトルエンディアンの格納順に注意! dumpbin で出てくるのは、1バイトごとの値。 WORD, DWORD 単位などで格納する場合は、 気をつける。 ? 00000000: 8B 44 24 04 -> dat[0] = 0x0424448b; マシン语によるコード実行 - @mimura1133 15
  • 16. 適当に技術面。 ? Mac X (without Power PC)とか Linux, UNIX で、作ったコードを動かす時は、 gcc -m32 というように、 32bit であることを示すのを 忘れずに。 ? ?? Windows でも gcc では必要なのかも。 マシン语によるコード実行 - @mimura1133 16
  • 17. 適当に技術面。 ? 普通に配列に入れたバイトコードは実行で きない。( CALL 時にエラーで落ちる ) ? 下記のAPIを使って実行可能状態にする。 OS API Windows VirtualProtect http://msdn.microsoft.com/ja-jp/library/cc430214.aspx Mac OS X vm_protect http://www.gnu.org/software/hurd/gnumach-doc/Memory-Attributes.html http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_protect.html Linux mprotect http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/mprotect.2.html マシン语によるコード実行 - @mimura1133 17
  • 18. 適当に技術面 ? 参考資料: 自分のブログの該当記事: http://go.mimumimu.net/rtYMKr Mono Project のソースコード: http://download.mono-project.com/sources/ マシン语によるコード実行 - @mimura1133 18
  • 19. 最後に。 ? クリスマスですんで、 かっこいいところを見せたかった。 ? あとクリスマスぼっちもいやなので、 ぜひよろしければ、 Twitter とかフォローお願いします。 ? Twitter: @mimura1133 ? そのほか : http://mimumimu.net/ マシン语によるコード実行 - @mimura1133 19
  • 20. マシン语によるコード実行 みむら (@mimura1133) マシン语によるコード実行 - @mimura1133 20