Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
UY
Uploaded by
uu ymd
2,471 views
たのしいPwn 公開用
みんなのアイドルscanfで任意コードを実行します。
Engineering
◦
Read more
3
Save
Share
Embed
Embed presentation
1
/ 41
2
/ 41
3
/ 41
4
/ 41
5
/ 41
6
/ 41
7
/ 41
8
/ 41
9
/ 41
10
/ 41
11
/ 41
12
/ 41
13
/ 41
14
/ 41
15
/ 41
16
/ 41
17
/ 41
18
/ 41
19
/ 41
20
/ 41
21
/ 41
22
/ 41
23
/ 41
24
/ 41
25
/ 41
26
/ 41
27
/ 41
28
/ 41
29
/ 41
30
/ 41
31
/ 41
32
/ 41
33
/ 41
34
/ 41
35
/ 41
36
/ 41
37
/ 41
38
/ 41
39
/ 41
40
/ 41
41
/ 41
More Related Content
PPT
Glibc malloc internal
by
Motohiro KOSAKI
PDF
MCC CTF講習会 pwn編
by
hama7230
PDF
ctfで学ぼうリバースエンジニアリング
by
junk_coken
PPTX
Return Oriented Programming
by
sounakano
PDF
勉強か?趣味か?人生か?―プログラミングコンテストとは
by
Takuya Akiba
PDF
Wireshark だけに頼らない! パケット解析ツールの紹介
by
morihisa
PDF
CTF for ビギナーズ バイナリ講習資料
by
SECCON Beginners
PPTX
冬のLock free祭り safe
by
Kumazaki Hiroki
Glibc malloc internal
by
Motohiro KOSAKI
MCC CTF講習会 pwn編
by
hama7230
ctfで学ぼうリバースエンジニアリング
by
junk_coken
Return Oriented Programming
by
sounakano
勉強か?趣味か?人生か?―プログラミングコンテストとは
by
Takuya Akiba
Wireshark だけに頼らない! パケット解析ツールの紹介
by
morihisa
CTF for ビギナーズ バイナリ講習資料
by
SECCON Beginners
冬のLock free祭り safe
by
Kumazaki Hiroki
What's hot
PDF
プログラミングコンテストでの動的計画法
by
Takuya Akiba
PDF
初心者向けCTFのWeb分野の強化法
by
kazkiti
PDF
Javaのログ出力: 道具と考え方
by
Taku Miyakawa
KEY
塹壕よりLivetとMVVM
by
Hiroshi Maekawa
PDF
ゼロから始める転移学習
by
Yahoo!デベロッパーネットワーク
PDF
ブラック企業から学ぶMVCモデル
by
Yuta Hiroto
PDF
RSA暗号運用でやってはいけない n のこと #ssmjp
by
sonickun
PPTX
ret2dl resolve
by
sounakano
PPTX
C#で速度を極めるいろは
by
Core Concept Technologies
PDF
Scapyで作る・解析するパケット
by
Takaaki Hoyo
PDF
PWNの超入門 大和セキュリティ神戸 2018-03-25
by
Isaac Mathis
PDF
Re永続データ構造が分からない人のためのスライド
by
Masaki Hara
PPTX
Nmapの真実(続)
by
abend_cve_9999_0001
PDF
Ml system in_python
by
yusuke shibui
PDF
tf,tf2完全理解
by
Koji Terada
PDF
#02-01 ZFS によるストレージ仮想化 (2012-04-20)
by
SolarisJPNight
PDF
Marp Tutorial
by
Rui Watanabe
PDF
WebAssemblyのWeb以外のことぜんぶ話す
by
Takaya Saeki
PDF
Pythonでパケット解析
by
euphoricwavism
PDF
トランザクションスクリプトのすすめ
by
pospome
プログラミングコンテストでの動的計画法
by
Takuya Akiba
初心者向けCTFのWeb分野の強化法
by
kazkiti
Javaのログ出力: 道具と考え方
by
Taku Miyakawa
塹壕よりLivetとMVVM
by
Hiroshi Maekawa
ゼロから始める転移学習
by
Yahoo!デベロッパーネットワーク
ブラック企業から学ぶMVCモデル
by
Yuta Hiroto
RSA暗号運用でやってはいけない n のこと #ssmjp
by
sonickun
ret2dl resolve
by
sounakano
C#で速度を極めるいろは
by
Core Concept Technologies
Scapyで作る・解析するパケット
by
Takaaki Hoyo
PWNの超入門 大和セキュリティ神戸 2018-03-25
by
Isaac Mathis
Re永続データ構造が分からない人のためのスライド
by
Masaki Hara
Nmapの真実(続)
by
abend_cve_9999_0001
Ml system in_python
by
yusuke shibui
tf,tf2完全理解
by
Koji Terada
#02-01 ZFS によるストレージ仮想化 (2012-04-20)
by
SolarisJPNight
Marp Tutorial
by
Rui Watanabe
WebAssemblyのWeb以外のことぜんぶ話す
by
Takaya Saeki
Pythonでパケット解析
by
euphoricwavism
トランザクションスクリプトのすすめ
by
pospome
Similar to たのしいPwn 公開用
PDF
TRY CTF
by
Yuya Masumura
PPTX
ipu LT - Introduction of CTF
by
Tsubasa Umeuchi
PDF
CTF初心者🔰
by
icchy
PDF
出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告
by
Ikumi Shimizu
PDF
About ctf jwmoon
by
ted0201
PDF
CTFの布教
by
FPC_COMMUNITY
PDF
私立プログラミングキャンプ
by
qqww77
PDF
CTF超入門 (for 第12回セキュリティさくら)
by
kikuchan98
PDF
えっ今日はハッキングしてもいいのか?(CTF Web入門)
by
otya mura
PDF
CTFというハッカーイベント+α
by
Yuichi Nagayama
PPTX
名古屋セキュリティ勉強会LT~学内CTFの話~
by
kataware
PDF
Capture the flag!
by
Saya Katafuchi
PDF
CTFはとんでもないものを 盗んでいきました。私の時間です…
by
Hiromu Yakura
PDF
OSC Kyoto CTF Seminar
by
pinksawtooth
PDF
CTFとは
by
Hiromu Yakura
PPTX
CTF(Capture the Flag)って何?
by
Kenji Aiko
TRY CTF
by
Yuya Masumura
ipu LT - Introduction of CTF
by
Tsubasa Umeuchi
CTF初心者🔰
by
icchy
出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告
by
Ikumi Shimizu
About ctf jwmoon
by
ted0201
CTFの布教
by
FPC_COMMUNITY
私立プログラミングキャンプ
by
qqww77
CTF超入門 (for 第12回セキュリティさくら)
by
kikuchan98
えっ今日はハッキングしてもいいのか?(CTF Web入門)
by
otya mura
CTFというハッカーイベント+α
by
Yuichi Nagayama
名古屋セキュリティ勉強会LT~学内CTFの話~
by
kataware
Capture the flag!
by
Saya Katafuchi
CTFはとんでもないものを 盗んでいきました。私の時間です…
by
Hiromu Yakura
OSC Kyoto CTF Seminar
by
pinksawtooth
CTFとは
by
Hiromu Yakura
CTF(Capture the Flag)って何?
by
Kenji Aiko
たのしいPwn 公開用
1.
たのしいpwn SSR_CTF_BU
2.
CTFってなんやねん •Capture The Flag •
直訳するとはた取りゲーム • FPSとかでも使われる単語らしい? •機密文書という設定のテキストファイル(Flag)を読みだして提出すると点数に • そのファイルは与えられた権限では読めなかったり • そもそもサーバーに入れてもらえなかったり • 暗号化されていたり •という感じで普通には読めないファイルを†ハッキング†して読んでくれ、という 競技
3.
例 •IFMMP DUG XPSME! •
これは暗号文です • 解読してみよう •アルファベットが一文字ずつずらされているだけ • シーザー暗号 •HELLO CTF WORLD!
4.
pwnってなんやねん •さっき説明したCTFの問題ジャンルの一つ • pwning,pwnablesとか言われる(ownが転じてpwnらしい)(どうでもいい) • 昔iPhoneで遊ぶツールにpwnagetoolとかあったよね •実行ファイルの脆弱性を突いて任意機械語を実行してね、という問 題ジャンル •
大体シェル(/bin/sh)を開くことが多い • CTFではファイルを読めれば勝ちなのでファイルを読むことも • 個人的に一番†ハッキング†っぽいジャンルだと思います(何)
5.
やってみる(その前に) •そんなに難しいことをしているわけではない •が、プログラミングを知らないと厳しい • 必要な事前知識は解説しますが、時間の都合上駆け足にならざるを得ない • 分からなくてもムリダナ(・x・)ってならないでほしい •
C言語講習会の後にもう一度見直すとまた違った見え方をするかも • 「こんなことも出来るんだ!」という雰囲気を感じてほしい
6.
アセンブリ言語ってなんや (時間次第では飛ばす) •C言語で書いたプログラムは機械語に変換されて動く • 機械語は01列だが、01011101…だと読みづらいので16進数で書かれることが多い • ex:31
ffで xor edi,edi • ediレジスタ同士でXORを取り、その結果をediに代入するという意味、これを行うと ediに0を入れることができる •31 ffとかいきなり言われてもなんのことだかわからないので人間に 分かりやすいように書きたい、それがアセンブリ言語 •アセンブリ言語は機械語と一対一対応する • 上記の例だと、31 ffは絶対xor edi , edi、それ以外にはならない •C言語は機械語と一対一対応しない • 同じプログラムでもコンパイラや最適化度合で違う機械語が出る(動作は同じ)
7.
アセンブリ言語ってなんや2 gccによるコンパイル結果
8.
x86アセンブリ速習(まさかりを投げるな) •これからの話を聞くのに必要最低限の命令だけ列記 • オペランドの種類とか面倒な部分はカット(今回の主目的でないため) •mov dst
, src :srcをdstにコピー •push src :srcをスタックにプッシュ •pop dst :dstにスタックからポップ •call arg :次の命令のアドレス(戻り先)をスタックにpushし、argにジャンプ •ret :スタックから 戻り先を取り出してそこにジャンプ
9.
スタック1(時間次第で飛ばす) •スタックの話(x86の話です、スタックが無いアーキテクチャもあり) • プログラムが実行される時、ほとんどの情報はスタックに乗る • よくお皿を積み上げていくことに例えられるデータ構造 8 push
8 push 0push 1 1 8 0 1 8 1 8 pop (0が出てくる)
10.
スタック2 (時間次第で飛ばす) •関数を呼び出す時、引数の情報はスタックに乗る • esp:スタックのてっぺん(stack
pointer) • ebp:スタックの底(base pointer) esp ebp 4 1 5 4 1 1
11.
スタック3 以下のコードが実行される時のスタックの様子を追いかけてみる 0x08048430 <+6>: sub
esp,0x10 #スタック領域を0x10バイト確保 0x08048433 <+9>: mov DWORD PTR [esp+0x4],0x202 #スタックに514を書き込み 0x0804843b <+17>: mov DWORD PTR [esp],0x72 #514の一個上に114を書き込み 0x08048442 <+24>: call 0x804841d <func> #func呼び出し 0x08048447 <+29>: mov DWORD PTR [esp+0x4],eax #funcの結果をスタックに書きこみ 0x0804844b <+33>: mov DWORD PTR [esp],0x80484f0 #文字列のアドレスをスタックに書き込み 0x08048452 <+40>: call 0x80482f0 <printf@plt> printf呼び出し 0x08048457 <+45>: leave #このプログラムのためのスタック領域を後始末 0x08048458 <+46>: ret #終
12.
func関数の中身 0x0804841d <+0>: push
ebp 0x0804841e <+1>: mov ebp,esp 0x08048420 <+3>: mov eax,DWORD PTR [ebp+0xc] 0x08048423 <+6>: mov edx,DWORD PTR [ebp+0x8] 0x08048426 <+9>: add eax,edx 0x08048428 <+11>:pop ebp 0x08048429 <+12>:ret
13.
sub esp 0x10 0xffffd178 0xffffd160
esp esp 新たに0x10(16)バイトのスタック 領域を確保 ebp
14.
mov二つ 114(0x72) 514(0x202) 0xffffd178 0xffffd160 esp mov DWORD
PTR [esp+0x4],0x202 mov DWORD PTR [esp],0x72 ebp esp+4
15.
call func 0x8048447 114(0x72) 514(0x202) 0xffffd178 0xffffd160 esp C言語で表すとfunc(114,514); 第二引数->第一引数の順で積まれ ていることがわかる ここでの0x8048447は戻り先(callの 次のアドレス) 手元でスライドを見れる人は見ると callの次の命令のアドレスだ ということが分かるはず ここで、処理は関数func内に移るebp
16.
push ebp (時間次第で飛ばす) 0xffffd178 0x8048447 114(0x72) 514(0x202) 0xffffd178 0xffffd160 esp 関数func用の新たなスタック領域を 用意するが、mainに戻った時の ために古いebp(スタックの底)を スタックに記録しておく ebp
17.
mov ebp,esp 0xffffd178 0x8048447 114(0x72) 514(0x202) 0xffffd178 0xffffd160 esp スタックの底を更新 ebp
18.
mov eax,DWORD PTR
[ebp+0xc] mov edx,DWORD PTR [ebp+0x8] 0xffffd178 0x8048447 114(0x72) 514(0x202) 0xffffd178 0xffffd160 esp ebp+0xcとebp+0x8はmain関数で スタックに積んだ引数です それをそれぞれeaxレジスタとedx レジスタに入れています eax=514 edx=114 ebp ebp+0x8 ebp+0xc
19.
add eax,edx 0xffffd178 0x8048447 114(0x72) 514(0x202) 0xffffd178 0xffffd160 esp func関数の足し算の本質部分です さっき入れた二つの数値を足し算 してeaxに入れています (eax=eax+edx) ちなみに関数の戻り値はeaxで 返されます ebp ebp+0x8 ebp+0xc
20.
pop ebp (時間次第で飛ばす) 0xffffd178 0x8048447 114(0x72) 514(0x202) 0xffffd178 0xffffd160 esp
関数の先頭で保存したebp(スタック の底)をポップします これにより、スタックの底は再度 main関数のものに戻ります ebp
21.
ret 0xffffd178 0x8048447 114(0x72) 514(0x202) 0xffffd178 0xffffd160 esp callによって保存した戻り先(リター ンアドレス)を使って戻ります。 次の命令(espが指している部分に 格納されている)は0x8048447です。 ebp
22.
mov DWORD PTR
[esp+0x4],eax 0xffffd178 0x8048447 114(0x72) 628(0x274) 0xffffd178 0xffffd160 esp 無事戻ってくることが出来たので 処理は続き、printfの引数をスタック に積みます。 この時、eaxにはfuncの戻り値が 入っています。 ebp
23.
今回扱う脆弱性 •関数を呼び出す時には戻り先をスタックに載せているらしい • もしも戻り先がユーザーによって書き換えられてしまったら任意の場所 に処理を飛ばせてしまうのでは? •バッファーオーバーフロー • 確保したメモリの領域を超えて書き込んでしまう事 •
これにより実際に戻り先を任意の場所にできてしまう!
24.
脆弱なコード C言語講習会とかでもやるはず #include <stdio.h> int main(){ char
buf[10]; printf("buf_addr=%pn",buf); printf(“what is your name?n> "); scanf("%s",buf); printf("Hello %s!n" ,buf); return 0; }
25.
脆弱性 •なにがやばいの>< • scanfは長さを確認しないで入力を受け取ってしまう。 • buf[10]で10バイトしか領域を確保していない(本当はアラインメント等でもっと確保さ れることもある)ので、それ以上の入力が来たらさっきの戻り先を上書きしてしまうか も。 •
やってみよう
26.
これならセーフ(本当はアウト) AAAA AAAA AAAA 0xdeadbeef … bufの先頭アドレス 戻り先アドレス リターンアドレスは壊れていな いので正しく戻れるが、関数 先頭でスタックに保存されて いるはずのebpの値は破壊さ れているので、戻った後ebp の値が0x41414141(AAAA)に なります
27.
こうなるとヤバイ AAAA AAAA AAAA AAAA(0x41414141) … bufの先頭アドレス 戻り先アドレス scanfの入力が想定より大き かったためリターンアドレスを 上書きしてしまった!
28.
任意コード実行の方針 AAAA AAAA AAAA 0xbeefbabe シェルを起動するための 機械語列 bufの先頭アドレス 戻り先アドレス 入力であらかじめシェル起動 のための機械語列を 読み込んでおいて、 戻り先アドレスをそこに すれば良い。 0xbeefbabe
29.
既にやってみたものがこちらになります 文字列が格納されるbufの アドレスが毎回変わって いる なにこれ
30.
脆弱性の緩和策 •典型的な脆弱性にはOS側で緩和策が取られている • ASLR(address space
layout randomization) • DEP(data execution prevention) • SSP(stack-smashing protection) •実際のCTFではこれらを回避して任意コードを実行せねばならない が、今回は簡単のため全部外す
31.
ASLR •先ほど述べたスタックや、mallocなどで割り当てられるヒープのアドレスをラン ダムにする機構 •スタックのアドレスがランダムだと、スタックに機械語を読み込み、それを実行 する、ということが難しくなる(リターンアドレスをどこにすればいいかわからない ため。) •これがオンになっている場合は、必要なアドレスのリークから始める(writeで標 準出力に書きだすとか) •$ sudo sysctl
–w kernel.randomize_va_space=0で無効化できる
32.
DEP •データ実行防止 • スタック上の機械語を実行することは普通は無い • じゃあスタックを実行不可能にすればさっきみたいな攻撃は防げるよね •実行ファイルに入っている機械語は実行できるのでそれをつぎはぎすれば攻 撃可能(ROP) •
現実のゲーム機(3〇Sとか)のハックなどでも使われているテク •コンパイル時に以下のオプションを付ければスタックが実行可能になる • gcc –z execstack
33.
SSP •なんとかしてバッファーが溢れているのを検知できないか? • スタックの底部分に検査用の値を仕込んでおいて、その値が書き変わっていたら不 正としてプログラムを落とせばよくない? • 検査用の値のことをcanaryという(炭鉱のカナリアが由来らしい) •正直CTFでこれがオンになっていると相当しんどい(つまり優秀な緩和策) •
SECCON 2016 Online CTF checker • シェルを取るのは諦めて、SSP由来の情報漏洩を狙う •canaryをリークしたり、SSP由来の情報漏洩を狙ったり手はいろいろ • 他の脆弱性を探す事も •$ gcc -fno-stack-protector bof.c でオフに出来る
34.
任意コード実行の方針(再掲) AAAA AAAA AAAA 0xbeefbabe シェルを起動するための 機械語列 bufの先頭アドレス 戻り先アドレス 入力であらかじめシェル起動 のための機械語列を 読み込んでおいて、 戻り先アドレスをそこに すれば良い。 0xbeefbabe
35.
実際にやってみます •$ sudo sysctl
–w kernel.randomize_va_space=0 でASLR無効化 •$ gcc –m32 -fno-stack-protector -z execstack bof.c でコンパイル •(python o.py [bufのアドレス] ; cat) | ./a.out • python o.pyの結果を流し込んだ後、catでターミナルから入力を受け取ってそれ を./a.outに流し込む • シェルが起動していることが確認できるはずです(失敗したらごめん) • pythonを使うのは、キーボードから入力できない文字を入力するから • 0xffとか
36.
宣伝2 •ロボット技術研究会としてCTFの大会に参加しています • SSR_CTF_BU(CTF部という意味) • SECCONの決勝大会に行ったりもした •
興味を持ったら(@ymduu)まで。
37.
参考文献(おすすめの本とか) •セキュリティコンテストチャレンジブック • CTFを始めるならコレ • バイナリ問題の入門には最適 •
Webやるならちょっと足りないかも •Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際 • 表紙がかっこいい • 暗号とかも載ってる •ももテク(ももいろテクノロジー) • ブログ • いろんなexploitテクが載っている • http://inaz2.hatenablog.com/entry/2014/03/14/151011
38.
まとめ •今回は一番簡単かつ王道な攻撃手法を紹介しました • シェルコード実行 •実際のCTFではセキュリティ機構(緩和策)があったりそもそもバイナリが大き かったりと色々な手法を要求されます •楽しい •CTFやろうぜ! •おはり
39.
質問とか
40.
NOPスレッド •言ってもbufのアドレス表示してるのズルくない? • 返す言葉もございません •普通はbufのアドレスは分からないのでROPとかでリークをする(説明は長くなる のでまたの機会) •分からなくてもアドレスを適当にやって当ててしまえばいいのだ • 無理 •一点張りで当てるのは無理でもこの区間に当たればシェル起動する、とかなら なんだか行ける気がする •
何もしない命令でその区間を埋めてしまえばいいのでは?
41.
NOPスレッド2 x90x90x90x90 x90x90x90x90 …… …… x90x90x90x90 シェルを起動する 為の機械語列 シェルコードの前にNOP(x90)*大量 を入れる ->どこのNOPにジャンプしてもいいので アドレスを適当にしても成功率がUP どこにretしてもOK! 0x???????? NOP:「何もしない」という命令