Slide 1

Slide 1 text

Pwn 入門 Maru(@GmS944y) 2019/08/10

Slide 2

Slide 2 text

2 準備 (1/2) ● Pwntools ● https://github.com/arthaud/python3-pwntools より ● $ apt-get update ● $ apt-get install python3 python3-dev python3-pip git ● $ pip3 install --upgrade git+https://github.com/arthaud/python3- pwntools.git ● gdb + peda ● $ git clone https://github.com/longld/peda.git ~/peda ● $ echo "source ~/peda/peda.py" >> ~/.gdbinit

Slide 3

Slide 3 text

3 準備 (2/2) ● 問題,サンプルプログサンプルプログラムのクローンのクローンクローン ● $ git clone https://github.com/m412u/classic ● ディレクトリ構成構成 ● classic ● classic ・・・バイナリ構成ファイル ● libc-2.23.so ・・・Cライブラリ構成 ● example ・・・解答例集 ● exp_step{0..5}.py ・・・演習用プログラムプログラムのクローン

Slide 4

Slide 4 text

4 はじめに ● 目的 ● Pwnを解くフローを体解くフローを体験すフローを解くフローを体体験する.する. ● 題材 ● SECCON 2018 Online CTF ● Classic Pwn (121 pt, 197 solves) ● Pwnでよくフローを体験す用プログラムいられる手法を一度に学べるを解くフローを体一度に学べる問題に学べる問題学べる問題べる問題 ● 質問等はその都度してはそのクローン都度に学べる問題してもらって大丈夫です.です.

Slide 5

Slide 5 text

5 問題を解く流れを解く流れ解く流れく流れ流れれ 1.静的解析 2.動的解析 3.脆弱性を探すを解くフローを体探すす 4.処理の奪取のクローン奪取 5.エクスプロイトのクローン組み立てみ立て立てて 6.シェルのクローン起動

Slide 6

Slide 6 text

6 静的解く流れ析 ● fileコマンド ● checksec.sh

Slide 7

Slide 7 text

7 動的解く流れ析 ● 実行権限の付与のクローン付与 ● $ chmod +x classic ● 動作させてみるさせてみ立てる ● 標準入力から入力を受けから入力から入力を受けを解くフローを体受け付けて終了.け付けて終了.付け付けて終了.て終了.

Slide 8

Slide 8 text

8 脆弱性を探すを解く流れ探すす ● 大量のデータを入力のクローンデータを入力してみるを解くフローを体入力から入力を受けしてみ立てる ● Segmentation faultで異常終了.

Slide 9

Slide 9 text

9 ディスアセンブリしてみるしてみる ● IDA, radare2, objdump… ● 大まかな処理をつかむ.処理の奪取を解くフローを体つかむ. ● 使用プログラムされている関数 ● 分岐処理の奪取な処理をつかむ.どな処理をつかむ.ど... ● 気になった点が重に学べる問題な処理をつかむ.った点が重要.点が重要.が重要.重要.

Slide 10

Slide 10 text

10 問 . オフセットの計算の計算計算 ● ripまでのクローンオフセットを解くフローを体計算してみる.してみ立てる. ● リ構成タを入力してみるーンアドレスに学べる問題到達するまで入力すするまで入力から入力を受けするデータを入力してみる数.

Slide 11

Slide 11 text

11 解く流れ . オフセットの計算の計算計算 ● ripを解くフローを体書き換えるまでのき換えるまでのオ換えるまでのオフえるまでのクローンオフセットを解くフローを体計算してみる.してみ立てる. ● A. 72byte ● “A”*72+(任意のアドレスのクローンアドレス)でripを解くフローを体書き換えるまでのき換えるまでのオ換えるまでのオフえ可能

Slide 12

Slide 12 text

12 exploit を解く流れ書いてみるいてみる ● (参考)exp_step0.py ● Python3系用プログラムに学べる問題作させてみる成しています. ● 通常モード ● $ python3 exp_step{0..5}.py ● デバッグモード ● $ python3 exp_step{0..5}.py d

Slide 13

Slide 13 text

13 処理の移行の計算移行 ● どこに学べる問題処理の奪取を解くフローを体飛ばせばよいか?ばせばよいか? ● プログラムのクローン内部にに学べる問題flagファイルを解くフローを体表示したり,シェルした点が重要.り,サンプルプログシェルを解くフローを体 起動するような処理をつかむ.機構はみ立てられな処理をつかむ.い. ● な処理をつかむ.に学べる問題か使えそうな処理をつかむ.ものクローンはな処理をつかむ.いか...?

Slide 14

Slide 14 text

14 注目すべきポイントすべきポイントポイントの計算 ● 配布されたもう一つされた点が重要.もう一つのクローンファイルに学べる問題注目してみ立てる. ● classic ● libc-2.23.so ← こっち ● fileコマンドで調べてみる.べてみ立てる.

Slide 15

Slide 15 text

15 libc とは? (1/3) ● よくフローを体験す利用プログラムされるC言語の関数が集めらのクローン関数が重要.集められた点が重要.ものクローン. ● printf, fgets, read, write, system... ● プログラムのクローン実行時にメモリへマッに学べる問題メモリ構成へマッピングされマッピングされる.

Slide 16

Slide 16 text

16 libc とは? (2/3) ● オフセットごとに学べる問題関数のクローン処理の奪取が重要.記述されている.されている. ● バージョンごとでオフセットは異な処理をつかむ.る.

Slide 17

Slide 17 text

17 libc とは? (3/3) ● libcはプログラムのクローン内で以下にマッピングさに学べる問題マッピングされている.

Slide 18

Slide 18 text

18 ASLR(1/2) ● libcが重要.マッピングされるアドレスを解くフローを体実行毎に変化させるに学べる問題変化させるさせる (stackのクローンアドレスも変化させるさせる). ● ある時にメモリへマッ点が重要.でのクローンアドレスが重要.わからな処理をつかむ.い.

Slide 19

Slide 19 text

19 ASLR(2/2) ● バイナリ構成はASLRで生成された点が重要.ランダムのクローンな処理をつかむ.アドレス+関関 数へマッピングされのクローンオフセットでlibc内のクローン関数に学べる問題アクセスしている. ASLR で生成された点が重要.値 0x7fc21fb15000 system 0x7fc21fb64440 printf 0x7fc21fb79e80 read 0x7fc21fc25070

Slide 20

Slide 20 text

20 PLT と GOT(1/2) ● libcに学べる問題存在する関数へのアする関数へマッピングされのクローンアドレスを解くフローを体呼び出す度に計算び出す度に計算す出す度に計算すす度に学べる問題に学べる問題計算してみる.す るのクローンは効率が悪い.が重要.悪い.い. ● 関数のクローン初回呼び出す度に計算び出す度に計算す出す度に計算すし時にメモリへマッに学べる問題アドレスを解くフローを体計算してみる.して保存してお け付けて終了.ば処理の奪取が重要.少なくてすむ.な処理をつかむ.くフローを体験すてすむ. ● GOT(Global Offset Table) ● 解決済みアドレスを保み立てアドレスを解くフローを体保存しておくフローを体験すテーブル ● PLT(Procedure Linkage Table) ● プログラムのクローンとGOTを解くフローを体つな処理をつかむ.ぐジャンプ台ジャンプ台

Slide 21

Slide 21 text

21 PLT と GOT(2/2) ・ plt セクションのクローン一部に ・処理の奪取のクローンイメージ

Slide 22

Slide 22 text

22 ret2plt ● PLTに学べる問題存在する関数へのアする関数な処理をつかむ.ら GOTを解くフローを体経由するので,するのクローンで,サンプルプログASLRを解くフローを体 気になった点が重に学べる問題せず呼び出すことが呼び出す度に計算び出す度に計算す出す度に計算すすことが重要.でき換えるまでのオる. ● libcに学べる問題関するアドレスが重要.手に学べる問題入れば,サンプルプログlibc内のクローン関数を解くフローを体呼び出す度に計算 び出す度に計算す出す度に計算すすことが重要.可能. ● リ構成ークでき換えるまでのオそうな処理をつかむ.アドレス,サンプルプログそのクローンた点が重要.めに学べる問題使えそうな処理をつかむ.関数 はな処理をつかむ.いか...?

Slide 23

Slide 23 text

23 ROP(1/2) ● x64で関数が重要.呼び出す度に計算び出す度に計算す出す度に計算すされる場合,サンプルプログ引数は決められた点が重要.レジ スタを入力してみるに学べる問題格納される.される. ● 第1引数・・・rdi ● 第2引数・・・rsi ● 第3引数・・・rdx ● 引数に学べる問題渡したいデータをした点が重要.いデータを入力してみるを解くフローを体レジスタを入力してみるに学べる問題値を解くフローを体格納される.しな処理をつかむ.け付けて終了.れば な処理をつかむ.らな処理をつかむ.い. → gadgetと呼び出す度に計算ばれるコードのクローン断片を使用する.を解くフローを体使用プログラムする.

Slide 24

Slide 24 text

24 ROP(2/2) ● (例)引数が重要.1つのクローン関数を解くフローを体呼び出す度に計算び出す度に計算す出す度に計算すす場合. ● popはスタを入力してみるックからレジスタを入力してみるへマッピングされ値を解くフローを体格納される.する命令.

Slide 25

Slide 25 text

25 libc に関するアドレスのするアドレスの計算リしてみるーク ● (参考)exp_step1.py ● 値が重要.”0”のクローン部に分を解くフローを体埋めてみる.めてみ立てる. ● アドレス等はその都度してのクローン調べてみる.べ方(例) ● objdump -d -M intel classic -j .plt --no ● rp-lin-x64 --file=classic --rop=1 --unique

Slide 26

Slide 26 text

26 実行結果の確認の計算確認 ● 整形前 ● 整形後

Slide 27

Slide 27 text

27 ベースアドレスを解く流れ求めるめる (1/2) ● 得られたアドレスられた点が重要.アドレスからputsのクローンオフセットを解くフローを体引くフローを体験すとlibcのクローン ベースアドレスを解くフローを体求めることができめることが重要.でき換えるまでのオる. ● (参考)exp_step3.py ● オフセットのクローン求めることができめ方 ● nm -D /lib/x86_64-linux-gnu/libc.so.6

Slide 28

Slide 28 text

28 ベースアドレスを解く流れ求めるめる (2/2) ● putsのクローンオフセットは0x809c0 ● puts@gotのクローンアドレスから引くフローを体験すと…

Slide 29

Slide 29 text

29 ret2vuln ● libcのクローンアドレスを解くフローを体リ構成ークさせることはでき換えるまでのオた点が重要.. ● しかし,サンプルプログプログラムのクローンは終了してしまう. ● 再起動するとアドレスは変わってしまう. ● 脆弱性を探すのクローンある部に分を解くフローを体再び出す度に計算す呼び出す度に計算び出す度に計算す出す度に計算すして2回目のクローン攻撃を行う.を解くフローを体行う. ● exp_step4.py

Slide 30

Slide 30 text

30 ret2libc ● libc内のクローンsystemを解くフローを体呼び出す度に計算び出す度に計算す出す度に計算すしてみ立てる. ● exp_step5.py ● 引数は“/bin/sh” ● 文字列のオフセットののクローンオフセットのクローン調べてみる.べ方 ● strings -tx /lib/x86_64-linux-gnu/libc.so.6

Slide 31

Slide 31 text

31 シェルの起動の計算起動 ● シェルのクローン起動に学べる問題成功 ● 当時にメモリへマッのクローン様子

Slide 32

Slide 32 text

32 別解く流れ (+α)α)) ● One-gadget RCE ● x64のクローンlibc内に学べる問題はそこに学べる問題処理の奪取を解くフローを体飛ばせばよいか?ばした点が重要.だけ付けて終了.でシェルを解くフローを体 起動してくフローを体験すれる美味しい処理が存在しい処理の奪取が重要.存在する関数へのアする. ● one_gadget ● One-gadget RCE のクローンアドレスを解くフローを体探すしてくフローを体験すれるツール ● https://github.com/david942j/one_gadget