Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
大和セキュリティ勉強会
@potetisensei
じこしょうかい
じこしょうかい
● 小池 悠生
– @potetisensei
– 私立灘高等学校 1年
– パソコン研究部 部長
– EpsilonDeltaのバイナリ担当
● 主にpwn
● CTF歴: 1年9ヶ月ほど
じこしょうかい
● 戦績
– CSAW 2013 Quals 33位
– Facebook CTF Finals 6位
– 30c3 Quals 16位
– PHDays Quals 28位
– SECCON 2013 Finals 2位
– ...
はなすこと
はなすこと
● CTFのバイナリ入門?
はなすこと
● CTFのバイナリ入門?
– 自分で(ある程度)やってくれ
はなすこと
● CTFのバイナリ入門?
– 自分で(ある程度)やってくれ
– microcorruption, ksnctf etc...
はなすこと
● CTFのバイナリ入門?
– 自分で(ある程度)やってくれ
– microcorruption, ksnctf etc...
– バイナリ書籍も最近は多い
バイナリしょせき
バイナリしょせき
● x86アセンブラ入門
– 読めないと話にならないので...
バイナリしょせき
● リバースエンジニアリングバイブル
– 解析特化
– 体系的に解析の基本がまとまってる
– CTFのReversing問題も
バイナリしょせき
● Hacking: 美しき策謀
– めずらしいExploitation寄りの本
● C言語の基礎からShellcodeまで
– ネットワーク、暗号理論も少し
– 書式指定子攻撃を扱う数少ない本
バイナリしょせき
● たのしいバイナリの歩き方
– 基本を抑えた上でかなり幅広い
● 解析
● Exploit
● 実装
● ツールの利用
– 近状に則した新しい話題が多い
バイナリしょせき
● 他にも
– ハッカープログラミング大全
– Art Of Reversingシリーズ
– ももいろテクノロジー(サイト)
● http://inaz2.hatenablog.com/
で、何するの?
(再掲)
バイナリの走り方(pwn)
バイナリの走り方(全力疾走)
バイナリの走り方(全力疾走)
● 基本は掴んだ、簡単な物は解けるという人向け
バイナリの走り方(全力疾走)
● 基本は掴んだ、簡単な物は解けるという人向け
– 少し難しい問題を解くには?
バイナリの走り方(全力疾走)
● 基本は掴んだ、簡単な物は解けるという人向け
– 少し難しい問題を解くには?
● CTFは過去問をやり込むしか無い
バイナリの走り方(全力疾走)
● 基本は掴んだ、簡単な物は解けるという人向け
– 少し難しい問題を解くには?
● CTFは過去問をやり込むしか無い
– 泥臭いですが、それしかない
● (Writeup見てるだけじゃダメ)
バイナリの走り方(全力疾走)
● 基本は掴んだ、簡単な物は解けるという人向け
– 少し難しい問題を解くには?
● CTFは過去問をやり込むしか無い
– 泥臭いですが、それしかない
● (Writeup見てるだけじゃダメ)
– いくつかの良問、難...
バイナリの走り方(全力疾走)
● ただし
– microcorruptionやってる間も勝手に話します
– 解きたい人、聞きたい人ご自由に
– 休憩目的なので、小話を幾つかする感じです
– 質問があればすぐに止めて頂いて構いません
一旦中断?(microcorruptionタイム)
CSAW 2013 Exp300
fil_chal
http://bit.ly/1hpuvpG
● CSAW CTF
– 比較的簡単なので入門にオススメ
– 基本ジャンル + Recon, Trivia, Misc
– 今年も9月にあるので皆さん出ましょう
http://bit.ly/1hpuvpG
● Exp300 fil_chal
– オーソドックスな問題
– バッファーオーバーフローの基本
– あらゆる問題はこの形に落とし込めば勝ち
http://bit.ly/1hpuvpG
● 環境(重要)
http://bit.ly/1hpuvpG
● 環境(重要)
– Full RELRO
● GOT Overwriteなどの攻撃は不可
– No canary found
● stack overflowのmitigationがない
– NX ...
http://bit.ly/1hpuvpG
● 基本挙動
http://bit.ly/1hpuvpG
● 基本挙動
– とりあえず動かしてみる癖を付ける(demo)
● malwareには注意...
http://bit.ly/1hpuvpG
● 基本挙動
– とりあえず動かしてみる癖を付ける(demo)
● malwareには注意...
– 初めにユーザー名とパスワードを求められる
● 特に難読化はないのでstringsで対応
– csa...
http://bit.ly/1hpuvpG
● 静的解析
http://bit.ly/1hpuvpG
● 静的解析
– “ある程度手で確かめた上で”静的解析に移る
● 「動かした時に起こった挙動」を確認しつつ
● 怪しいと思った所を見てみる
http://bit.ly/1hpuvpG
● 静的解析
– “ある程度手で確かめた上で”静的解析に移る
● 「動かした時に起こった挙動」を確認しつつ
● 怪しいと思った所を見てみる
– ここら辺は勘、あるいは経験
● 全てに静的解析行うのは次...
http://bit.ly/1hpuvpG
● 怪しい箇所?
– バッファーオーバーフローがないか調べたい
– 初めに文字数を入力した上で文字列を入力するっぽい
– そもそも入力サイズの上限は?
● 0x400で適正っぽいなあ
– このチェック...
0x08048F09 ~ 0x08048F36
mov eax, [ebp+arg_4]
mov [ebp+var_4AC], ax
movsx eax, [ebp+var_4AC]
mov [ebp+n], eax
mov eax, [ebp...
0x08048F09 ~ 0x08048F36
mov eax, [ebp+arg_4] ; string size
mov [ebp+var_4AC], ax ; short
movsx eax, [ebp+var_4AC] ; cast t...
short size;
if ((unsined int)(size+1) <= 0x400) {
・
・
・
http://bit.ly/1hpuvpG
http://bit.ly/1hpuvpG
● size = -1の時?
http://bit.ly/1hpuvpG
● size = -1の時?
– 「(-1 + 1) <= 0x400」 ⇔ 「0 <= 0x400」は成立
http://bit.ly/1hpuvpG
● size = -1の時?
– 「(-1 + 1) <= 0x400」 ⇔ 「0 <= 0x400」は成立
– 入力サイズには-1(0xffffffff)が用いられる
● 明らかな整数値オーバーフロ...
http://bit.ly/1hpuvpG
● 利用する脆弱性が決まったら
– exploit構築フェーズ
– 本質ではないここに時間がかかってはいけない
● 慣れれば5分程度でexploitは書けるようになります
http://bit.ly/1hpuvpG
● 唯一考えなければならない事
http://bit.ly/1hpuvpG
● 唯一考えなければならない事
– 今回exploitに必要なアドレスは何か?
http://bit.ly/1hpuvpG
● 唯一考えなければならない事
– 今回exploitに必要なアドレスは何か?
● stack(shellcodeさえ配置できれば良い)
http://bit.ly/1hpuvpG
● 唯一考えなければならない事
– 今回exploitに必要なアドレスは何か?
● stack(shellcodeさえ配置できれば良い)
– それに対して利用できるアドレスは?
http://bit.ly/1hpuvpG
● 唯一考えなければならない事
– 今回exploitに必要なアドレスは何か?
● stack(shellcodeさえ配置できれば良い)
– それに対して利用できるアドレスは?
● ASLRはdisb...
http://bit.ly/1hpuvpG
● 唯一考えなければならない事
– 今回exploitに必要なアドレスは何か?
● stack(shellcodeさえ配置できれば良い)
– それに対して利用できるアドレスは?
● ASLRはdisb...
http://bit.ly/1hpuvpG
● Address leak
– 出力系関数によってメモリ領域のアドレスを知ること
http://bit.ly/1hpuvpG
● Address leak
– 出力系関数によってメモリ領域のアドレスを知ること
– 大きく分けて2タイプ
● 出力するアドレスを決め打ち
– 有効なアドレスであれば返ってくる
● 既知のアドレスの...
http://bit.ly/1hpuvpG
● 出力するアドレスを決め打ち
– 有効なアドレスであれば返ってくる
今回はこちらが妥当
http://bit.ly/1hpuvpG
● 根拠
http://bit.ly/1hpuvpG
● 根拠
– 出力関数がsendであること
● アドレスさえ当ててしまえば無限長読み出せる
http://bit.ly/1hpuvpG
● 根拠
– 出力関数がsendであること
● アドレスさえ当ててしまえば無限長読み出せる
– ASLRは無効である = アドレスは固定
● 一度でも当てれば良い
http://bit.ly/1hpuvpG
● 根拠
– 出力関数がsendであること
● アドレスさえ当ててしまえば無限長読み出せる
– ASLRは無効である = アドレスは固定
● 一度でも当てれば良い
– ASLRなしのスタックの大体の位...
http://bit.ly/1hpuvpG
● これらを踏まえて書いたexploit fil_chal.py
http://bit.ly/1hpuvpG
● これらを踏まえて書いたexploit fil_chal.py
– search_fd
● バッファーオーバーフローによりfdを上書きしてしまう
● 大体のfdの値を求める必要がある
http://bit.ly/1hpuvpG
● これらを踏まえて書いたexploit fil_chal.py
– search_fd
● バッファーオーバーフローによりfdを上書きしてしまう
● 大体のfdの値を求める必要がある
– searc...
http://bit.ly/1hpuvpG
● これらを踏まえて書いたexploit fil_chal.py
– search_fd
● バッファーオーバーフローによりfdを上書きしてしまう
● 大体のfdの値を求める必要がある
– searc...
http://bit.ly/1hpuvpG
● これらを踏まえて書いたexploit fil_chal.py
– search_fd
● バッファーオーバーフローによりfdを上書きしてしまう
● 大体のfdの値を求める必要がある
– searc...
http://bit.ly/1hpuvpG
● 実行してみる...
– (demo)
http://bit.ly/1hpuvpG
● 実行してみる...
– (demo)
– 遅くない...?
http://bit.ly/1hpuvpG
● 実行してみる...
– (demo)
– 遅くない...?
– Flag: signness_oh_what_a_world_we_live_in!
– とりあえずFLAGが手に入ったので良しとし...
http://bit.ly/1hpuvpG
● 余談
http://bit.ly/1hpuvpG
● 余談
– 総当りは美しくない
● 上手く行ったが時間がかかる
● ASLRが有効ならば通用しない
http://bit.ly/1hpuvpG
● 余談
– 総当りは美しくない
● 上手く行ったが時間がかかる
● ASLRが有効ならば通用しない
– ASLR有効な場合ではどうすればよかったのか
http://bit.ly/1hpuvpG
● 余談
– 総当りは美しくない
● 上手く行ったが時間がかかる
● ASLRが有効ならば通用しない
– ASLR有効な場合ではどうすればよかったのか
● わざわざstackに置かなくても、より良い場...
一旦中断?(microcorruptionタイム)
Hacklu 2012 Bin300
braincpy
http://bit.ly/1hpuvpG
● Hacklu CTF
– バイナリ寄りなCTF
– かなり質の良い問題しか出ない
http://bit.ly/1hpuvpG
● Bin300 Braincpy
– 典型ROP問題
– Stack PivotとROPの基本が集約された良問
– ssh接続 + setgidされたバイナリ
http://bit.ly/1hpuvpG
● 環境(重要)
http://bit.ly/1hpuvpG
● 環境(重要)
– Partial RELRO
● GOT Overwrite可能
– No canary found
● Stack Canaryは存在しない
– NX enabled
● NX ...
http://bit.ly/1hpuvpG
● 基本挙動
– とりあえず動かしてみる癖を付ける(demo)
● malwareには注意...
http://bit.ly/1hpuvpG
● 基本挙動
– とりあえず動かしてみる癖を付ける(demo)
● malwareには注意...
– よく分からん
http://bit.ly/1hpuvpG
● 基本挙動
– とりあえず動かしてみる癖を付ける(demo)
● malwareには注意...
– よく分からん
● argc != 2ならNO!
● argc == 2 && strlen(arg...
http://bit.ly/1hpuvpG
● 静的解析
– “ある程度手で確かめた上で”静的解析に移る
● 「動かした時に起こった挙動」を確認しつつ
● 怪しいと思った所を見てみる
– ここら辺は勘、あるいは経験
● 全てに静的解析行うのは次...
http://bit.ly/1hpuvpG
● 怪しい箇所?
– envpを全てNULLで上書きしている
● envpは使って欲しくない問題みたい?
– seteuid, setegidが呼び出されている
● exploit中で権限を設定し直す...
http://bit.ly/1hpuvpG
● 8byteしかオーバーフロー出来ないっぽい?
– 書き換えられるのはebp, return addressのみ
– ROPは(そのままでは)構築出来ない....
http://bit.ly/1hpuvpG
● 通常のROP
http://bit.ly/1hpuvpG
local variables2
stack saved ebp
return address
● 通常のROP
local variables1
arguments1
http://bit.ly/1hpuvpG
local variables2
stack saved ebp
return address
local variables1
overwritten
● 通常のROP
BufferOverflow...
http://bit.ly/1hpuvpG
local variables2
stack saved ebp
return address
func1 args[n]
local variables1
junk
● 通常のROP
BufferO...
http://bit.ly/1hpuvpG
● 通常のROP
function1の呼び出し
function1の引数分popを行うgadgetへのreturn
function2の呼び出し
・
・
・
http://bit.ly/1hpuvpG
● 今回の場合
local variables2
stack saved ebp
return address
local variables1
arguments1
http://bit.ly/1hpuvpG
● 今回の場合
local variables2
stack saved ebp
return address
local variables1
overwritten
local variables...
http://bit.ly/1hpuvpG
● 思考
http://bit.ly/1hpuvpG
● 思考
– ROPを行うには“下に”十分な書き込みが必要
http://bit.ly/1hpuvpG
● 思考
– ROPを行うには“下に”十分な書き込みが必要
– すなわち、espの指すアドレスの下に入力を与えたい
http://bit.ly/1hpuvpG
● 思考
– ROPを行うには“下に”十分な書き込みが必要
– すなわち、espの指すアドレスの下に入力を与えたい
– 2通りの方法
http://bit.ly/1hpuvpG
● 思考
– ROPを行うには“下に”十分な書き込みが必要
– すなわち、espの指すアドレスの下に入力を与えたい
– 2通りの方法
● 入力系関数で更に読み込む
● espそのものの値をいじってしまう
http://bit.ly/1hpuvpG
● espそのものの値をいじってしまう
今回はこちらが妥当
http://bit.ly/1hpuvpG
● 根拠
– そもそも引数をいじれないので入力関数は呼べない
– 入力自体は96byteも与えている
● espをいじってどうにか利用できないか
http://bit.ly/1hpuvpG
local variables1
overwritten
local variables2
arguments1
esp
returnする時点での位置
http://bit.ly/1hpuvpG
local variables1
overwritten
local variables2
arguments1
esp
これをreturn後に上手くずらせれば...
http://bit.ly/1hpuvpG
local variables1
local variables2
arguments1
esp
ROPは実行可能になる!
functon1 addr
・
・
・
http://bit.ly/1hpuvpG
● espをいじる
– このような手法をstack pivotという
http://bit.ly/1hpuvpG
● espをいじる
– このような手法をstack pivotという
– 一度のreturnだけでespをいじれるgadgetを探す
● gadgetの列挙にはrp++を使用(demo)
http://bit.ly/1hpuvpG
● 探したいgadget
http://bit.ly/1hpuvpG
● 探したいgadget
– sub esp, n
● 良いのがなさそう...
http://bit.ly/1hpuvpG
● 探したいgadget
– sub esp, n
● 良いのがなさそう...
– add esp, n(負数)でもいいのでは?
http://bit.ly/1hpuvpG
● 探したいgadget
– sub esp, n
● 良いのがなさそう...
– add esp, n(負数)でもいいのでは?
● add esp, dword [ebp+0x0A] ; ret
–...
http://bit.ly/1hpuvpG
● IDAで0xffffffa0を指す固定アドレスを探す(demo)
– sequence of bytesが便利
http://bit.ly/1hpuvpG
● IDAで0xffffffa0を指す固定アドレスを探す(demo)
– sequence of bytesが便利
– 0x08086C1C
http://bit.ly/1hpuvpG
● Exploit: braincpy.py, braincpy2.py
– braincpy.py
● 実際に/home/braincpy/braincpyを起動
● freadを呼び出し、入力をb...
http://bit.ly/1hpuvpG
● 実行してみる...
– (demo)
http://bit.ly/1hpuvpG
● 実行してみる...
– (demo)
– 良さだ
– Flag: ROP_GOLF_IS_A_NICE_GAME!
http://bit.ly/1hpuvpG
● 実行してみる...
– (demo)
– 良さだ
– Flag: ROP_GOLF_IS_A_NICE_GAME!
– freadによる読み込みは最高
一旦中断?(microcorruptionタイム)
SECUINSIDE 2013 Pwn750
Pwnme!!
http://bit.ly/1hpuvpG
● SECUINSIDE CTF
– 韓国のCTF
– CODEGATEと性質が似ていて、バイナリが重たい
http://bit.ly/1hpuvpG
● Pwn750 Pwnme
– 難問中の難問
● 感じだけでも掴んでもらえれば
http://bit.ly/1hpuvpG
● 環境(重要)
http://bit.ly/1hpuvpG
● 環境(重要)
– Partial RELRO
● GOT Overwrite可能
– No canary found
● Stack Canaryは存在しない
– NX enabled
● NX ...
http://bit.ly/1hpuvpG
● 基本挙動
– とりあえず動かしてみる癖を付ける(demo)
● malwareには注意...
http://bit.ly/1hpuvpG
● 基本挙動
– とりあえず動かしてみる癖を付ける(demo)
● malwareには注意...
– 名前を入力するだけっぽい
● server側で、clientが入力した名前を出力
● バッファーオ...
http://bit.ly/1hpuvpG
● 静的解析
– “ある程度手で確かめた上で”静的解析に移る
● 「動かした時に起こった挙動」を確認しつつ
● 怪しいと思った所を見てみる
– ここら辺は勘、あるいは経験
● 全てに静的解析行うのは次...
http://bit.ly/1hpuvpG
● 怪しい箇所?
– 明らかにバッファーオーバーフローしている
● braincpyと同様、ROPには足りてない...
● またespをズラしてやればいいだけっぽい?
http://bit.ly/1hpuvpG
● 探したいgadget(demo)
http://bit.ly/1hpuvpG
● 探したいgadget(demo)
– sub esp, n
● !!!そもそも存在しなかった!!!
http://bit.ly/1hpuvpG
● 探したいgadget(demo)
– sub esp, n
● !!!そもそも存在しなかった!!!
– add esp, n(負数)は?
● 負数のnは存在してないですね...
● braincp...
http://bit.ly/1hpuvpG
● 思考
http://bit.ly/1hpuvpG
● 思考
– CTFは必ず解けるようになってる
http://bit.ly/1hpuvpG
● 思考
– CTFは必ず解けるようになってる
● 問題不備もたまにあるけど、絶対に解法があるはず
http://bit.ly/1hpuvpG
● 思考
– CTFは必ず解けるようになってる
● 問題不備もたまにあるけど、絶対に解法があるはず
– stack pivotは必ず使う
● ROPの本質は自分の入力をstackに持ち込むこと
● p...
http://bit.ly/1hpuvpG
● 勘、あるいは経験則
http://bit.ly/1hpuvpG
● 勘、あるいは経験則
– stack pivotは絶対に必要
http://bit.ly/1hpuvpG
● 勘、あるいは経験則
– stack pivotは絶対に必要
● ただし、espを相対的にいじるgadgetはなかった
● leaveなどで絶対的なアドレスを代入するしかない
http://bit.ly/1hpuvpG
● 勘、あるいは経験則
– stack pivotは絶対に必要
● ただし、espを相対的にいじるgadgetはなかった
● leaveなどで絶対的なアドレスを代入するしかない
● PIEがネック
http://bit.ly/1hpuvpG
● 勘、あるいは経験則
– stack pivotは絶対に必要
● ただし、espを相対的にいじるgadgetはなかった
● leaveなどで絶対的なアドレスを代入するしかない
● PIEがネック
–...
http://bit.ly/1hpuvpG
● 勘、あるいは経験則
– stack pivotは絶対に必要
● ただし、espを相対的にいじるgadgetはなかった
● leaveなどで絶対的なアドレスを代入するしかない
● PIEがネック
–...
http://bit.ly/1hpuvpG
● 勘、あるいは経験則
– stack pivotは絶対に必要
● ただし、espを相対的にいじるgadgetはなかった
● leaveなどで絶対的なアドレスを代入するしかない
● PIEがネック
–...
http://bit.ly/1hpuvpG
● 勘をまとめる
http://bit.ly/1hpuvpG
● 勘をまとめる
– stack pivotは使う
● ただし絶対的なアドレス代入のみ
http://bit.ly/1hpuvpG
● 勘をまとめる
– stack pivotは使う
● ただし絶対的なアドレス代入のみ
● stack領域はPIEなので総当りきつそう
http://bit.ly/1hpuvpG
● 勘をまとめる
– stack pivotは使う
● ただし絶対的なアドレス代入のみ
● stack領域はPIEなので総当りきつそう
● 他に入力を保存してるバッファないかな...
http://bit.ly/1hpuvpG
● 勘をまとめる
– stack pivotは使う
● ただし絶対的なアドレス代入のみ
● stack領域はPIEなので総当りきつそう
● 他に入力を保存してるバッファないかな...
– printf...
http://bit.ly/1hpuvpG
● 勘をまとめる
– stack pivotは使う
● ただし絶対的なアドレス代入のみ
● stack領域はPIEなので総当りきつそう
● 他に入力を保存してるバッファないかな...
– printf...
http://bit.ly/1hpuvpG
● 実験
http://bit.ly/1hpuvpG
● 実験
– 領域によってASLRのエントロピーに差はあるか(demo)
http://bit.ly/1hpuvpG
● 実験
– 領域によってASLRのエントロピーに差はあるか(demo)
● stack領域 ・・・ 16^3 = 4096
● glibc領域 ・・・ 16^2 = 256
● 総当りとはいえ、かな...
http://bit.ly/1hpuvpG
● 実験
– 領域によってASLRのエントロピーに差はあるか(demo)
● stack領域 ・・・ 16^3 = 4096
● glibc領域 ・・・ 16^2 = 256
● 総当りとはいえ、かな...
http://bit.ly/1hpuvpG
● 実験
– 領域によってASLRのエントロピーに差はあるか(demo)
● stack領域 ・・・ 16^3 = 4096
● glibc領域 ・・・ 16^2 = 256
● 総当りとはいえ、かな...
http://bit.ly/1hpuvpG
● これらを踏まえて exploit pwnme.py
– daemon型なのでアドレスは変化しない
● 256回の総当りを行う
– libcのアドレスのみでexploitを構成する事が重要
● sy...
http://bit.ly/1hpuvpG
● 実行してみる...
– (demo)
http://bit.ly/1hpuvpG
● 実行してみる...
– (demo)
– Excellent
– Flag: yeah you got a key!
– 非常に良い問題だった
まとめ
まとめ
● Exploitation問題は、ここ数年の難化が激しい
まとめ
● Exploitation問題は、ここ数年の難化が激しい
– ROPが前提条件となってきている
まとめ
● Exploitation問題は、ここ数年の難化が激しい
– ROPが前提条件となってきている
– もはや初心者が簡単に入って来れるものではない...
まとめ
● Exploitation問題は、ここ数年の難化が激しい
– ROPが前提条件となってきている
– もはや初心者が簡単に入って来れるものではない...
● 何を学んで欲しいか
まとめ
● Exploitation問題は、ここ数年の難化が激しい
– ROPが前提条件となってきている
– もはや初心者が簡単に入って来れるものではない...
● 何を学んで欲しいか
– exploit構築の上で何が必要なのかを考える力
まとめ
● Exploitation問題は、ここ数年の難化が激しい
– ROPが前提条件となってきている
– もはや初心者が簡単に入って来れるものではない...
● 何を学んで欲しいか
– exploit構築の上で何が必要なのかを考える力
● ...
まとめ
● Exploitation問題は、ここ数年の難化が激しい
– ROPが前提条件となってきている
– もはや初心者が簡単に入って来れるものではない...
● 何を学んで欲しいか
– exploit構築の上で何が必要なのかを考える力
● ...
まとめ
● Exploitation問題は、ここ数年の難化が激しい
– ROPが前提条件となってきている
– もはや初心者が簡単に入って来れるものではない...
● 何を学んで欲しいか
– exploit構築の上で何が必要なのかを考える力
● ...
ご静聴ありがとうございました
Yamatosec-2014/05/31
Prochain SlideShare
Chargement dans…5
×

Yamatosec-2014/05/31

4 065 vues

Publié le

Publié dans : Technologie
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici

Yamatosec-2014/05/31

  1. 1. 大和セキュリティ勉強会 @potetisensei
  2. 2. じこしょうかい
  3. 3. じこしょうかい ● 小池 悠生 – @potetisensei – 私立灘高等学校 1年 – パソコン研究部 部長 – EpsilonDeltaのバイナリ担当 ● 主にpwn ● CTF歴: 1年9ヶ月ほど
  4. 4. じこしょうかい ● 戦績 – CSAW 2013 Quals 33位 – Facebook CTF Finals 6位 – 30c3 Quals 16位 – PHDays Quals 28位 – SECCON 2013 Finals 2位 – CODEGATE 2014 Quals 39位 – DEFCON 2014 Quals 31位
  5. 5. はなすこと
  6. 6. はなすこと ● CTFのバイナリ入門?
  7. 7. はなすこと ● CTFのバイナリ入門? – 自分で(ある程度)やってくれ
  8. 8. はなすこと ● CTFのバイナリ入門? – 自分で(ある程度)やってくれ – microcorruption, ksnctf etc...
  9. 9. はなすこと ● CTFのバイナリ入門? – 自分で(ある程度)やってくれ – microcorruption, ksnctf etc... – バイナリ書籍も最近は多い
  10. 10. バイナリしょせき
  11. 11. バイナリしょせき ● x86アセンブラ入門 – 読めないと話にならないので...
  12. 12. バイナリしょせき ● リバースエンジニアリングバイブル – 解析特化 – 体系的に解析の基本がまとまってる – CTFのReversing問題も
  13. 13. バイナリしょせき ● Hacking: 美しき策謀 – めずらしいExploitation寄りの本 ● C言語の基礎からShellcodeまで – ネットワーク、暗号理論も少し – 書式指定子攻撃を扱う数少ない本
  14. 14. バイナリしょせき ● たのしいバイナリの歩き方 – 基本を抑えた上でかなり幅広い ● 解析 ● Exploit ● 実装 ● ツールの利用 – 近状に則した新しい話題が多い
  15. 15. バイナリしょせき ● 他にも – ハッカープログラミング大全 – Art Of Reversingシリーズ – ももいろテクノロジー(サイト) ● http://inaz2.hatenablog.com/
  16. 16. で、何するの?
  17. 17. (再掲)
  18. 18. バイナリの走り方(pwn)
  19. 19. バイナリの走り方(全力疾走)
  20. 20. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け
  21. 21. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け – 少し難しい問題を解くには?
  22. 22. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け – 少し難しい問題を解くには? ● CTFは過去問をやり込むしか無い
  23. 23. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け – 少し難しい問題を解くには? ● CTFは過去問をやり込むしか無い – 泥臭いですが、それしかない ● (Writeup見てるだけじゃダメ)
  24. 24. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け – 少し難しい問題を解くには? ● CTFは過去問をやり込むしか無い – 泥臭いですが、それしかない ● (Writeup見てるだけじゃダメ) – いくつかの良問、難問を紹介したいと思います
  25. 25. バイナリの走り方(全力疾走) ● ただし – microcorruptionやってる間も勝手に話します – 解きたい人、聞きたい人ご自由に – 休憩目的なので、小話を幾つかする感じです – 質問があればすぐに止めて頂いて構いません
  26. 26. 一旦中断?(microcorruptionタイム)
  27. 27. CSAW 2013 Exp300 fil_chal
  28. 28. http://bit.ly/1hpuvpG ● CSAW CTF – 比較的簡単なので入門にオススメ – 基本ジャンル + Recon, Trivia, Misc – 今年も9月にあるので皆さん出ましょう
  29. 29. http://bit.ly/1hpuvpG ● Exp300 fil_chal – オーソドックスな問題 – バッファーオーバーフローの基本 – あらゆる問題はこの形に落とし込めば勝ち
  30. 30. http://bit.ly/1hpuvpG ● 環境(重要)
  31. 31. http://bit.ly/1hpuvpG ● 環境(重要) – Full RELRO ● GOT Overwriteなどの攻撃は不可 – No canary found ● stack overflowのmitigationがない – NX disabled ● NX bitによるデータ実行防止がない ● shellcodeを利用することが出来る – ASLR disabled(これは実行環境依存) ● stackやheap, libcはアドレスが固定
  32. 32. http://bit.ly/1hpuvpG ● 基本挙動
  33. 33. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意...
  34. 34. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意... – 初めにユーザー名とパスワードを求められる ● 特に難読化はないのでstringsで対応 – csaw2013:S1mplePWD – ログインに成功すると日記を付けられる ● ここが怪しそう...?
  35. 35. http://bit.ly/1hpuvpG ● 静的解析
  36. 36. http://bit.ly/1hpuvpG ● 静的解析 – “ある程度手で確かめた上で”静的解析に移る ● 「動かした時に起こった挙動」を確認しつつ ● 怪しいと思った所を見てみる
  37. 37. http://bit.ly/1hpuvpG ● 静的解析 – “ある程度手で確かめた上で”静的解析に移る ● 「動かした時に起こった挙動」を確認しつつ ● 怪しいと思った所を見てみる – ここら辺は勘、あるいは経験 ● 全てに静的解析行うのは次の手段(だと思ってる) ● (demo)
  38. 38. http://bit.ly/1hpuvpG ● 怪しい箇所? – バッファーオーバーフローがないか調べたい – 初めに文字数を入力した上で文字列を入力するっぽい – そもそも入力サイズの上限は? ● 0x400で適正っぽいなあ – このチェックを回避できないか考える ● 整数値オーバーフローはない?
  39. 39. 0x08048F09 ~ 0x08048F36 mov eax, [ebp+arg_4] mov [ebp+var_4AC], ax movsx eax, [ebp+var_4AC] mov [ebp+n], eax mov eax, [ebp+n] add eax, 1 cmp eax, 400h jbe short loc_8048F5B http://bit.ly/1hpuvpG
  40. 40. 0x08048F09 ~ 0x08048F36 mov eax, [ebp+arg_4] ; string size mov [ebp+var_4AC], ax ; short movsx eax, [ebp+var_4AC] ; cast to int mov [ebp+n], eax mov eax, [ebp+n] add eax, 1 ; eax = size + 1 cmp eax, 400h ; cast to uint jbe short loc_8048F5B http://bit.ly/1hpuvpG
  41. 41. short size; if ((unsined int)(size+1) <= 0x400) { ・ ・ ・ http://bit.ly/1hpuvpG
  42. 42. http://bit.ly/1hpuvpG ● size = -1の時?
  43. 43. http://bit.ly/1hpuvpG ● size = -1の時? – 「(-1 + 1) <= 0x400」 ⇔ 「0 <= 0x400」は成立
  44. 44. http://bit.ly/1hpuvpG ● size = -1の時? – 「(-1 + 1) <= 0x400」 ⇔ 「0 <= 0x400」は成立 – 入力サイズには-1(0xffffffff)が用いられる ● 明らかな整数値オーバーフロー ● これでバッファーオーバーフローは利用できる
  45. 45. http://bit.ly/1hpuvpG ● 利用する脆弱性が決まったら – exploit構築フェーズ – 本質ではないここに時間がかかってはいけない ● 慣れれば5分程度でexploitは書けるようになります
  46. 46. http://bit.ly/1hpuvpG ● 唯一考えなければならない事
  47. 47. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か?
  48. 48. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か? ● stack(shellcodeさえ配置できれば良い)
  49. 49. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か? ● stack(shellcodeさえ配置できれば良い) – それに対して利用できるアドレスは?
  50. 50. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か? ● stack(shellcodeさえ配置できれば良い) – それに対して利用できるアドレスは? ● ASLRはdisbled
  51. 51. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か? ● stack(shellcodeさえ配置できれば良い) – それに対して利用できるアドレスは? ● ASLRはdisbled – ただし実行環境依存であるstackのアドレスはわからない – stackのアドレスはleak出来るか?
  52. 52. http://bit.ly/1hpuvpG ● Address leak – 出力系関数によってメモリ領域のアドレスを知ること
  53. 53. http://bit.ly/1hpuvpG ● Address leak – 出力系関数によってメモリ領域のアドレスを知ること – 大きく分けて2タイプ ● 出力するアドレスを決め打ち – 有効なアドレスであれば返ってくる ● 既知のアドレスの中身を見る – 知りたいアドレスが中にあることが前提
  54. 54. http://bit.ly/1hpuvpG ● 出力するアドレスを決め打ち – 有効なアドレスであれば返ってくる 今回はこちらが妥当
  55. 55. http://bit.ly/1hpuvpG ● 根拠
  56. 56. http://bit.ly/1hpuvpG ● 根拠 – 出力関数がsendであること ● アドレスさえ当ててしまえば無限長読み出せる
  57. 57. http://bit.ly/1hpuvpG ● 根拠 – 出力関数がsendであること ● アドレスさえ当ててしまえば無限長読み出せる – ASLRは無効である = アドレスは固定 ● 一度でも当てれば良い
  58. 58. http://bit.ly/1hpuvpG ● 根拠 – 出力関数がsendであること ● アドレスさえ当ててしまえば無限長読み出せる – ASLRは無効である = アドレスは固定 ● 一度でも当てれば良い – ASLRなしのスタックの大体の位置 ● 0xbfff0000 ~ 0xbfffffff ● 0xffff0000 ~ 0xffffffff ● 16 * 2回の探索で行けそう
  59. 59. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py
  60. 60. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py – search_fd ● バッファーオーバーフローによりfdを上書きしてしまう ● 大体のfdの値を求める必要がある
  61. 61. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py – search_fd ● バッファーオーバーフローによりfdを上書きしてしまう ● 大体のfdの値を求める必要がある – search_stack ● 前述の通り、stack領域がどこにあるか探す
  62. 62. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py – search_fd ● バッファーオーバーフローによりfdを上書きしてしまう ● 大体のfdの値を求める必要がある – search_stack ● 前述の通り、stack領域がどこにあるか探す – search_shellcode ● 実際にshellcodeを格納できるアドレスがどこか探す
  63. 63. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py – search_fd ● バッファーオーバーフローによりfdを上書きしてしまう ● 大体のfdの値を求める必要がある – search_stack ● 前述の通り、stack領域がどこにあるか探す – search_shellcode ● 実際にshellcodeを格納できるアドレスがどこか探す – gain_shell ● 127.0.0.1 4444にconnectbackさせるshellcodeを起動
  64. 64. http://bit.ly/1hpuvpG ● 実行してみる... – (demo)
  65. 65. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – 遅くない...?
  66. 66. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – 遅くない...? – Flag: signness_oh_what_a_world_we_live_in! – とりあえずFLAGが手に入ったので良しとしよう
  67. 67. http://bit.ly/1hpuvpG ● 余談
  68. 68. http://bit.ly/1hpuvpG ● 余談 – 総当りは美しくない ● 上手く行ったが時間がかかる ● ASLRが有効ならば通用しない
  69. 69. http://bit.ly/1hpuvpG ● 余談 – 総当りは美しくない ● 上手く行ったが時間がかかる ● ASLRが有効ならば通用しない – ASLR有効な場合ではどうすればよかったのか
  70. 70. http://bit.ly/1hpuvpG ● 余談 – 総当りは美しくない ● 上手く行ったが時間がかかる ● ASLRが有効ならば通用しない – ASLR有効な場合ではどうすればよかったのか ● わざわざstackに置かなくても、より良い場所がある ● Stager ROPという概念 ● ここで説明することはないので課題とします
  71. 71. 一旦中断?(microcorruptionタイム)
  72. 72. Hacklu 2012 Bin300 braincpy
  73. 73. http://bit.ly/1hpuvpG ● Hacklu CTF – バイナリ寄りなCTF – かなり質の良い問題しか出ない
  74. 74. http://bit.ly/1hpuvpG ● Bin300 Braincpy – 典型ROP問題 – Stack PivotとROPの基本が集約された良問 – ssh接続 + setgidされたバイナリ
  75. 75. http://bit.ly/1hpuvpG ● 環境(重要)
  76. 76. http://bit.ly/1hpuvpG ● 環境(重要) – Partial RELRO ● GOT Overwrite可能 – No canary found ● Stack Canaryは存在しない – NX enabled ● NX bitによるDEPが有効 ● return2libc, あるいはROPで攻める
  77. 77. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意...
  78. 78. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意... – よく分からん
  79. 79. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意... – よく分からん ● argc != 2ならNO! ● argc == 2 && strlen(argv[1]) <= nならNOMNOMNOM! ● strlen(argv[1]) > nならNO! ● みたいな感じ...?
  80. 80. http://bit.ly/1hpuvpG ● 静的解析 – “ある程度手で確かめた上で”静的解析に移る ● 「動かした時に起こった挙動」を確認しつつ ● 怪しいと思った所を見てみる – ここら辺は勘、あるいは経験 ● 全てに静的解析行うのは次の手段(だと思ってる) ● (demo)
  81. 81. http://bit.ly/1hpuvpG ● 怪しい箇所? – envpを全てNULLで上書きしている ● envpは使って欲しくない問題みたい? – seteuid, setegidが呼び出されている ● exploit中で権限を設定し直す必要がある – argv[1]<=strlen(0x60)の時、argv[1]がstrcpyされる – 明らかにバッファーオーバーフローしている ● ただしオーバーフローするサイズが小さすぎる(demo)
  82. 82. http://bit.ly/1hpuvpG ● 8byteしかオーバーフロー出来ないっぽい? – 書き換えられるのはebp, return addressのみ – ROPは(そのままでは)構築出来ない....
  83. 83. http://bit.ly/1hpuvpG ● 通常のROP
  84. 84. http://bit.ly/1hpuvpG local variables2 stack saved ebp return address ● 通常のROP local variables1 arguments1
  85. 85. http://bit.ly/1hpuvpG local variables2 stack saved ebp return address local variables1 overwritten ● 通常のROP BufferOverflow local variables1 arguments1
  86. 86. http://bit.ly/1hpuvpG local variables2 stack saved ebp return address func1 args[n] local variables1 junk ● 通常のROP BufferOverflow functon1 addr n pop gadget local variables1 arguments1 functon2 addr
  87. 87. http://bit.ly/1hpuvpG ● 通常のROP function1の呼び出し function1の引数分popを行うgadgetへのreturn function2の呼び出し ・ ・ ・
  88. 88. http://bit.ly/1hpuvpG ● 今回の場合 local variables2 stack saved ebp return address local variables1 arguments1
  89. 89. http://bit.ly/1hpuvpG ● 今回の場合 local variables2 stack saved ebp return address local variables1 overwritten local variables1 arguments1 local variables2 arguments1 BufferOverflow
  90. 90. http://bit.ly/1hpuvpG ● 思考
  91. 91. http://bit.ly/1hpuvpG ● 思考 – ROPを行うには“下に”十分な書き込みが必要
  92. 92. http://bit.ly/1hpuvpG ● 思考 – ROPを行うには“下に”十分な書き込みが必要 – すなわち、espの指すアドレスの下に入力を与えたい
  93. 93. http://bit.ly/1hpuvpG ● 思考 – ROPを行うには“下に”十分な書き込みが必要 – すなわち、espの指すアドレスの下に入力を与えたい – 2通りの方法
  94. 94. http://bit.ly/1hpuvpG ● 思考 – ROPを行うには“下に”十分な書き込みが必要 – すなわち、espの指すアドレスの下に入力を与えたい – 2通りの方法 ● 入力系関数で更に読み込む ● espそのものの値をいじってしまう
  95. 95. http://bit.ly/1hpuvpG ● espそのものの値をいじってしまう 今回はこちらが妥当
  96. 96. http://bit.ly/1hpuvpG ● 根拠 – そもそも引数をいじれないので入力関数は呼べない – 入力自体は96byteも与えている ● espをいじってどうにか利用できないか
  97. 97. http://bit.ly/1hpuvpG local variables1 overwritten local variables2 arguments1 esp returnする時点での位置
  98. 98. http://bit.ly/1hpuvpG local variables1 overwritten local variables2 arguments1 esp これをreturn後に上手くずらせれば...
  99. 99. http://bit.ly/1hpuvpG local variables1 local variables2 arguments1 esp ROPは実行可能になる! functon1 addr ・ ・ ・
  100. 100. http://bit.ly/1hpuvpG ● espをいじる – このような手法をstack pivotという
  101. 101. http://bit.ly/1hpuvpG ● espをいじる – このような手法をstack pivotという – 一度のreturnだけでespをいじれるgadgetを探す ● gadgetの列挙にはrp++を使用(demo)
  102. 102. http://bit.ly/1hpuvpG ● 探したいgadget
  103. 103. http://bit.ly/1hpuvpG ● 探したいgadget – sub esp, n ● 良いのがなさそう...
  104. 104. http://bit.ly/1hpuvpG ● 探したいgadget – sub esp, n ● 良いのがなさそう... – add esp, n(負数)でもいいのでは?
  105. 105. http://bit.ly/1hpuvpG ● 探したいgadget – sub esp, n ● 良いのがなさそう... – add esp, n(負数)でもいいのでは? ● add esp, dword [ebp+0x0A] ; ret – ebpをいじれるしちょうど良さそう – 後は -0x60 = 0xffffffa0を指すようなアドレスを探す
  106. 106. http://bit.ly/1hpuvpG ● IDAで0xffffffa0を指す固定アドレスを探す(demo) – sequence of bytesが便利
  107. 107. http://bit.ly/1hpuvpG ● IDAで0xffffffa0を指す固定アドレスを探す(demo) – sequence of bytesが便利 – 0x08086C1C
  108. 108. http://bit.ly/1hpuvpG ● Exploit: braincpy.py, braincpy2.py – braincpy.py ● 実際に/home/braincpy/braincpyを起動 ● freadを呼び出し、入力をbufferに読みこむ ● stackをbufferに変更(espをbufferに変更) – braincpy2.py ● freadで読み込む入力を与える ● setegidをsyscallで、fopen,fgets,putsをret2libcで呼ぶ ● freadへの入力なのでNULL文字が含まれても問題ない
  109. 109. http://bit.ly/1hpuvpG ● 実行してみる... – (demo)
  110. 110. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – 良さだ – Flag: ROP_GOLF_IS_A_NICE_GAME!
  111. 111. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – 良さだ – Flag: ROP_GOLF_IS_A_NICE_GAME! – freadによる読み込みは最高
  112. 112. 一旦中断?(microcorruptionタイム)
  113. 113. SECUINSIDE 2013 Pwn750 Pwnme!!
  114. 114. http://bit.ly/1hpuvpG ● SECUINSIDE CTF – 韓国のCTF – CODEGATEと性質が似ていて、バイナリが重たい
  115. 115. http://bit.ly/1hpuvpG ● Pwn750 Pwnme – 難問中の難問 ● 感じだけでも掴んでもらえれば
  116. 116. http://bit.ly/1hpuvpG ● 環境(重要)
  117. 117. http://bit.ly/1hpuvpG ● 環境(重要) – Partial RELRO ● GOT Overwrite可能 – No canary found ● Stack Canaryは存在しない – NX enabled ● NX bitによるDEPが有効 ● return2libc, あるいはROPで攻める – PIE enabled ● 全ての領域のアドレスがランダマイズされる
  118. 118. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意...
  119. 119. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意... – 名前を入力するだけっぽい ● server側で、clientが入力した名前を出力 ● バッファーオーバーフローはしてそう
  120. 120. http://bit.ly/1hpuvpG ● 静的解析 – “ある程度手で確かめた上で”静的解析に移る ● 「動かした時に起こった挙動」を確認しつつ ● 怪しいと思った所を見てみる – ここら辺は勘、あるいは経験 ● 全てに静的解析行うのは次の手段(だと思ってる) ● (demo)
  121. 121. http://bit.ly/1hpuvpG ● 怪しい箇所? – 明らかにバッファーオーバーフローしている ● braincpyと同様、ROPには足りてない... ● またespをズラしてやればいいだけっぽい?
  122. 122. http://bit.ly/1hpuvpG ● 探したいgadget(demo)
  123. 123. http://bit.ly/1hpuvpG ● 探したいgadget(demo) – sub esp, n ● !!!そもそも存在しなかった!!!
  124. 124. http://bit.ly/1hpuvpG ● 探したいgadget(demo) – sub esp, n ● !!!そもそも存在しなかった!!! – add esp, n(負数)は? ● 負数のnは存在してないですね... ● braincpyは静的リンクしていたからgadgetが豊富だった
  125. 125. http://bit.ly/1hpuvpG ● 思考
  126. 126. http://bit.ly/1hpuvpG ● 思考 – CTFは必ず解けるようになってる
  127. 127. http://bit.ly/1hpuvpG ● 思考 – CTFは必ず解けるようになってる ● 問題不備もたまにあるけど、絶対に解法があるはず
  128. 128. http://bit.ly/1hpuvpG ● 思考 – CTFは必ず解けるようになってる ● 問題不備もたまにあるけど、絶対に解法があるはず – stack pivotは必ず使う ● ROPの本質は自分の入力をstackに持ち込むこと ● pivot先のアドレスを考えることがこの問題の本質
  129. 129. http://bit.ly/1hpuvpG ● 勘、あるいは経験則
  130. 130. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要
  131. 131. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない
  132. 132. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない ● PIEがネック
  133. 133. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない ● PIEがネック – 高得点問題にはLinuxやELF、libcの中身を問うケース も ● 何か関係あるのだろうか...
  134. 134. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない ● PIEがネック – 高得点問題にはLinuxやELF、libcの中身を問うケース も ● 何か関係あるのだろうか... – (server側の不自然なprintfが怪しい)
  135. 135. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない ● PIEがネック – 高得点問題にはLinuxやELF、libcの中身を問うケース も ● 何か関係あるのだろうか... – (server側の不自然なprintfが怪しい) ● 作問を経験し、作問者の気持ちになるのは重要 ● このprintf要らなくない??? ● あまり違和感はないので、僕も気づかなかったかも
  136. 136. http://bit.ly/1hpuvpG ● 勘をまとめる
  137. 137. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ
  138. 138. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ ● stack領域はPIEなので総当りきつそう
  139. 139. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ ● stack領域はPIEなので総当りきつそう ● 他に入力を保存してるバッファないかな...
  140. 140. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ ● stack領域はPIEなので総当りきつそう ● 他に入力を保存してるバッファないかな... – printf怪しくないですか? ● そういえば、出力バッファみたいなのなかった???
  141. 141. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ ● stack領域はPIEなので総当りきつそう ● 他に入力を保存してるバッファないかな... – printf怪しくないですか? ● そういえば、出力バッファみたいなのなかった??? ● どちらにせよPIEはどうなんですかね
  142. 142. http://bit.ly/1hpuvpG ● 実験
  143. 143. http://bit.ly/1hpuvpG ● 実験 – 領域によってASLRのエントロピーに差はあるか(demo)
  144. 144. http://bit.ly/1hpuvpG ● 実験 – 領域によってASLRのエントロピーに差はあるか(demo) ● stack領域 ・・・ 16^3 = 4096 ● glibc領域 ・・・ 16^2 = 256 ● 総当りとはいえ、かなり上手く行きそう
  145. 145. http://bit.ly/1hpuvpG ● 実験 – 領域によってASLRのエントロピーに差はあるか(demo) ● stack領域 ・・・ 16^3 = 4096 ● glibc領域 ・・・ 16^2 = 256 ● 総当りとはいえ、かなり上手く行きそう – printf内に入力を保存しているバッファは存在するか ● glibcは読みたくないのでgdbで調べる(demo)
  146. 146. http://bit.ly/1hpuvpG ● 実験 – 領域によってASLRのエントロピーに差はあるか(demo) ● stack領域 ・・・ 16^3 = 4096 ● glibc領域 ・・・ 16^2 = 256 ● 総当りとはいえ、かなり上手く行きそう – printf内に入力を保存しているバッファは存在するか ● glibcは読みたくないのでgdbで調べる(demo) ● 存在してるっぽい!
  147. 147. http://bit.ly/1hpuvpG ● これらを踏まえて exploit pwnme.py – daemon型なのでアドレスは変化しない ● 256回の総当りを行う – libcのアドレスのみでexploitを構成する事が重要 ● system関数、引数のbuffer、leave-ret gadget
  148. 148. http://bit.ly/1hpuvpG ● 実行してみる... – (demo)
  149. 149. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – Excellent – Flag: yeah you got a key! – 非常に良い問題だった
  150. 150. まとめ
  151. 151. まとめ ● Exploitation問題は、ここ数年の難化が激しい
  152. 152. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている
  153. 153. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない...
  154. 154. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか
  155. 155. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか – exploit構築の上で何が必要なのかを考える力
  156. 156. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか – exploit構築の上で何が必要なのかを考える力 ● どの脆弱性がある時どのようなexploitを組むのか
  157. 157. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか – exploit構築の上で何が必要なのかを考える力 ● どの脆弱性がある時どのようなexploitを組むのか ● どの領域のアドレスをどのようにして手に入れるのか
  158. 158. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか – exploit構築の上で何が必要なのかを考える力 ● どの脆弱性がある時どのようなexploitを組むのか ● どの領域のアドレスをどのようにして手に入れるのか ● address leakやstagerなどの手法の知識も重要
  159. 159. ご静聴ありがとうございました

×