Stack Pivot
@fmirx0723
2021/5/12
Rits Security Team 1
準備
題材:warmup
2021/5/12
Rits Security Team 2
準備
題材:warmup
2021/5/12
Rits Security Team 3
• vulnのリターンアドレスをflag
に書き換えれば良い
• winをtrueに書き換える必要があ
る
• ret2pltによってgetsを呼び出し,
引数をwinに指定することで書き
換えることができる
Attack Process
2021/5/12
Rits Security Team 4
win = False
data
gets@plt
flag
addr of win
1. ret2pltによってgets
を呼び出す
2. 引数をwinのアドレス
に指定する
3. 2回目の入力でwinを
書き換える
4. flagを呼び出す
“AAAA”
Attack Process
2021/5/12
Rits Security Team 5
win = False
data
gets@plt
flag
addr of win
1. ret2pltによってgets
を呼び出す
2. 引数をwinのアドレス
に指定する
3. 2回目の入力でwinを
書き換える
4. flagを呼び出す
“AAAA”
Attack Process
2021/5/12
Rits Security Team 6
win = True
data
gets@plt
flag
addr of win
1. ret2pltによってgets
を呼び出す
2. 引数をwinのアドレス
に指定する
3. 2回目の入力でwinを
書き換える
4. flagを呼び出す
“AAAA”
2‘nd
input
Attack Process
2021/5/12
Rits Security Team 7
win = False
data
gets@plt
flag
addr of win
1. ret2pltによってgets
を呼び出す
2. 引数をwinのアドレス
に指定する
3. 2回目の入力でwinを
書き換える
4. flagを呼び出す
“AAAA”
Attack Peocess
2021/5/12
Rits Security Team 8
Stacck Pivot
バッファが足りない.RopChainを再構築したい.
このような時に,スタックとは別の領域をあたかもスタックかのように
扱えるようにすることをStackPivotと呼ぶ
データ領域のbssセクションにStack Pivotすることが多い
 書き込み可能で,アドレスが固定であるから
Stack Pivot した場所にRopChainを構築する
2021/5/12
Rits Security Team 9
Stack Pivot 手法(例)
rop chainをこのように構築する
フロー
1. getsなどのinput関数を呼び出す
 引数にpivot先(例えばbss)のアドレスを指定
2. getsの入力で,例えばropchainなどペイ
ロードを送り込む
3. 指定したpivot先に,スタックポインタと
ベースポインタを移行
2021/5/12
Rits Security Team 10
leave
AAA…A
pop ebp
addr of .bss
gets
addr of bss
pop eax; ret;
.bss section
…
…
(1)
Stack Pivot 手法(例)
rop chainをこのように構築する
フロー
1. getsなどのinput関数を呼び出す
 引数にpivot先(例えばbss)のアドレスを指定
2. getsの入力で,例えばropchainなどペイ
ロードを送り込む
3. 指定したpivot先に,スタックポインタと
ベースポインタを移行
2021/5/12
Rits Security Team 11
leave
AAA…A
pop ebp
addr of .bss
gets
addr of .bss
pop eax; ret;
.bss section
…
…
Rop chain
2‘nd
input
(2)
Stack Pivot 手法(例)
rop chainをこのように構築する
フロー
1. getsなどのinput関数を呼び出す
 引数にpivot先(例えばbss)のアドレスを指定
2. getsの入力で,例えばropchainなどペイ
ロードを送り込む
3. 指定したpivot先に,スタックポインタと
ベースポインタを移行
2021/5/12
Rits Security Team 12
leave
AAA…A
pop ebp
addr of .bss
gets
addr of bss
pop eax; ret;
.bss section
…
…
Rop chain
eip
Attack Process (題材:bypass)
$ cat bypass.c
ソースコードを見てみる
2021/5/12
Rits Security Team 13
Attack Process (題材:bypass)
$ file ./bypass
どんなファイルか調べる
32bitのelf
dynamically linked:実行時に,ほかのオブジェクトとリンクする
2021/5/12
Rits Security Team 14
Attack Process (題材:bypass)
$ ldd ./bypass
どのオブジェクトとリンクするか調べる
32bitの標準ライブラリとリンクすることがわかる(2行名)
 今回,libcは与えられているとする
それ以外は今は無視
 一応言及しておくと… 1行目:vdso,3行名:_dl_runtime_resolve
2021/5/12
Rits Security Team 15
Attack Process (題材:bypass)
2021/5/12
Rits Security Team 16
$ checksec ./bypass
有効なセキュリティ機構を調べる
 Partial RELRO → GOT 書き換え可能
 No canary found → スタックオーバフロー攻撃が可能
 NX enabled → 任意のシェルコードを実行させるにはひと工夫必要
 No PIE → ret2plt,ROPが可能
Attack Process (題材:bypass)
2021/5/12
Rits Security Team 17
$ python2 –c ‘print(“A” * 4)’ | ./bypass
実行してみる
文字列”AAAA”を標準入力に渡す
Attack Process (題材:bypass)
2021/5/12
Rits Security Team 18
他にも色々するけど省略
$ nm ./bypass でbypassに存在するシンボルを調べる
→flagとかwinとかのシンボルが存在するか調べることが狙い
$ nm libc でリンクするlibcにも怪しいシンボルが存在しないか調べる
Attack Process (題材:bypass)
2021/5/12
Rits Security Team 19
どうやって解く???
Attack Process (題材:bypass)
2021/5/12
Rits Security Team 20
方針
1. system(“/bin/sh”)を実行させたい
2. libcのベースアドレスがわかればよい
3. putsの引数にgotにおけるあるエントリのアドレス
を与えればその関数本体のアドレスが得られる
4. 得られたアドレスからその関数のオフセットを引け
ばlibcのベースアドレスが得られる (この時点で
systemには飛ばせる)
5. getsよりbssセクションにsystem(“/bin/sh”)を実行
させるROP chainを再度構築する
6. 文字列”/bin/sh”を用意する必要があるが,同じく
bssセクションに送れば,固定的に指定できる
7. ROP chainを送り込んだ先のbssにstack pivotする
Attack Process (題材:bypass)
2021/5/12
Rits Security Team 21
AAA…A
puts@plt
pop1
puts@got
gets@plt
pop1
addr of bss
pop ebp
addr of bss
leave
(3)
方針
1. system(“/bin/sh”)を実行させたい
2. libcのベースアドレスがわかればよい
3. putsの引数にgotのあるエントリのアドレスを与え
ればその関数本体のアドレスが得られる
4. 得られたアドレスからその関数のオフセットを引け
ばlibcのベースアドレスが得られる (この時点で
systemには飛ばせる)
5. getsよりbssセクションにsystem(“/bin/sh”)を実行
させるROP chainを再度構築する
6. 文字列”/bin/sh”を用意する必要があるが,同じく
bssセクションに送れば,固定的に指定できる
7. ROP chainを送り込んだ先のbssにstack pivotする
Attack Process (題材:bypass)
2021/5/12
Rits Security Team 22
AAA…A
puts@plt
pop1
puts@got
gets@plt
pop1
addr of bss
pop ebp
addr of bss
leave
(5)
方針
1. system(“/bin/sh”)を実行させたい
2. libcのベースアドレスがわかればよい
3. putsの引数にgotのあるエントリのアドレスを与え
ればその関数本体のアドレスが得られる
4. 得られたアドレスからその関数のオフセットを引け
ばlibcのベースアドレスが得られる (この時点で
systemには飛ばせる)
5. getsよりbssセクションにsystem(“/bin/sh”)を実行
させるROP chainを再度構築する
6. 文字列”/bin/sh”を用意する必要があるが,同じく
bssセクションに送れば,固定的に指定できる
7. ROP chainを送り込んだ先のbssにstack pivotする
AAAA
system
dummy
addr of /bin/sh
/bin/sh
ポインタ
bss
2‘nd
input
Attack Process (題材:bypass)
2021/5/12
Rits Security Team 23
AAA…A
puts@plt
pop1
puts@got
gets@plt
pop1
addr of bss
pop ebp
addr of bss
leave
(3)
方針
1. system(“/bin/sh”)を実行させたい
2. libcのベースアドレスがわかればよい
3. putsの引数にgotのあるエントリのアドレスを与え
ればその関数本体のアドレスが得られる
4. 得られたアドレスからその関数のオフセットを引け
ばlibcのベースアドレスが得られる (この時点で
systemには飛ばせる)
5. getsよりbssセクションにsystem(“/bin/sh”)を実行
させるROP chainを再度構築する
6. 文字列”/bin/sh”を用意する必要があるが,同じく
bssセクションに送れば,固定的に指定できる
7. ROP chainを送り込んだ先のbssにstack pivotする
(7)
AAAA
system
dummy
addr of /bin/sh
/bin/sh
stack
pivot
bss
問題
bypass (original)
さっきまでの例の続き
pivot (rop emporium)
ヒントを次からのスライドで3段階に分けて述べる
2021/5/12
Rits Security Team 24
pivot ヒント1
pivot先は指定されている(表示されるアドレス)
1回目の入力で実行したいropchain
2回目の入力でバッファオーバーフローを起こし,飛び先を与えられた
アドレスにする
バッファオーバーフローが発生する脆弱関数はgetsでなくfgetsである
よく読むと,fgetsによりバッファオーバーフローは起きるが,ペイロー
ドの長さに制限がある
2021/5/12
Rits Security Team 25
pivot ヒント2
与えられたlibpivotのシンボル情報をnmコマンドで見ると,ret2winと
いう関数シンボルが存在することがわかる(怪しい)
これを実行すればよいことになる(ディスアセンブルすればわかる)が,
実行させるにはこのlibpivotのベースアドレスをリークさせる必要がある
ここで,pivotのpltのエントリを確認すると,libpivotの関数
foothold_functionがある
foothold_functionは文字列を表示するだけの関数
2021/5/12
Rits Security Team 26
pivot ヒント3
一回foothold_functionを呼び出すと,それ以降,そのgotのエントリに
はfoothold_function本体(名前解決後)のアドレスが入る
得られたアドレスからfoothold_functionのオフセットを引けば,
libpivotのベースアドレスが求まる
更に,libpivotのベースアドレスにret2winのオフセットを足せば,その
値がret2win本体のあるアドレスである
2021/5/12
Rits Security Team 27

More Related Content

PDF
MCC CTF講習会 pwn編
PPTX
ret2dl resolve
PDF
RSA暗号運用でやってはいけない n のこと #ssmjp
PDF
Pythonによる黒魔術入門
PDF
初心者向けCTFのWeb分野の強化法
PPTX
DockerコンテナでGitを使う
PDF
マイクロにしすぎた結果がこれだよ!
PPTX
Elasticsearch as a Distributed System
MCC CTF講習会 pwn編
ret2dl resolve
RSA暗号運用でやってはいけない n のこと #ssmjp
Pythonによる黒魔術入門
初心者向けCTFのWeb分野の強化法
DockerコンテナでGitを使う
マイクロにしすぎた結果がこれだよ!
Elasticsearch as a Distributed System

What's hot (20)

PPTX
Redisの特徴と活用方法について
PDF
第二回CTF勉強会資料
PDF
GoによるWebアプリ開発のキホン
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
PPTX
初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話
PDF
Intro to SVE 富岳のA64FXを触ってみた
PPT
Glibc malloc internal
PPTX
世界一わかりやすいClean Architecture
PDF
Binary exploitation - AIS3
PDF
LLVM最適化のこつ
PDF
Rustに触れて私のPythonはどう変わったか
PDF
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
PDF
Marp Tutorial
PDF
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PPTX
MongoDBが遅いときの切り分け方法
PDF
組織にテストを書く文化を根付かせる戦略と戦術
PDF
TLS, HTTP/2演習
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
PDF
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
PDF
Re永続データ構造が分からない人のためのスライド
Redisの特徴と活用方法について
第二回CTF勉強会資料
GoによるWebアプリ開発のキホン
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話
Intro to SVE 富岳のA64FXを触ってみた
Glibc malloc internal
世界一わかりやすいClean Architecture
Binary exploitation - AIS3
LLVM最適化のこつ
Rustに触れて私のPythonはどう変わったか
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Marp Tutorial
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
MongoDBが遅いときの切り分け方法
組織にテストを書く文化を根付かせる戦略と戦術
TLS, HTTP/2演習
なかったらINSERTしたいし、あるならロック取りたいやん?
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Re永続データ構造が分からない人のためのスライド
Ad

Similar to Stack pivot (15)

PPTX
Stack Buffer OverFlow
PPTX
Stager
PPTX
Survey and Analysis of ICS Vulnerabilities (Japanese)
ODP
Buffer overflow
PDF
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
PDF
Python2.x の input 関数に RCE 脆弱性がある話
PDF
“Sliding right into disaster”の紹介
PPTX
No.2 超初心者向け セキュリティ入門
PDF
4章 Linuxカーネル - 割り込み・例外 4
PDF
[CB16] Cyber Grand Challenge (CGC) : 世界初のマシン同士の全自動ハッキングトーナメント by Tyler Nighsw...
PPTX
CVE-2021-3156 Baron samedit (sudoの脆弱性)
PDF
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
PDF
Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)
PPTX
CTF(Capture the Flag)って何?
PDF
Windows をより安全にする SafeSEH on MinGW
Stack Buffer OverFlow
Stager
Survey and Analysis of ICS Vulnerabilities (Japanese)
Buffer overflow
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
Python2.x の input 関数に RCE 脆弱性がある話
“Sliding right into disaster”の紹介
No.2 超初心者向け セキュリティ入門
4章 Linuxカーネル - 割り込み・例外 4
[CB16] Cyber Grand Challenge (CGC) : 世界初のマシン同士の全自動ハッキングトーナメント by Tyler Nighsw...
CVE-2021-3156 Baron samedit (sudoの脆弱性)
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)
CTF(Capture the Flag)って何?
Windows をより安全にする SafeSEH on MinGW
Ad

Stack pivot