Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
任意コード実行の原理
Search
FFRI Security, Inc.
March 26, 2024
Technology
0
580
任意コード実行の原理
新ローレイヤー勉強会
~番外編:初心者向け低レイヤーの世界#1~
任意コード実行の原理
https://ffri-security.connpass.com/event/308829/
FFRI Security, Inc.
March 26, 2024
Tweet
Share
More Decks by FFRI Security, Inc.
See All by FFRI Security, Inc.
Reverse Atom Bombing
ffri
0
430
Out of Bytecode - Python スクリプトからメモリ上の関数オブジェクトを呼ぶまで
ffri
0
450
Arm TrustZoneを利用したTEEシステムのアーキテクチャと脆弱性の紹介
ffri
0
770
Other Decks in Technology
See All in Technology
REST API Design Pitfalls
victorrentea
1
500
クロージング / MIERUNE JCT - Tokyo 2024
mierune
PRO
0
290
山手線一周のパフォーマンス改善
suzukahr
0
110
仮想化って何だろう
shkoga
0
140
【shownet.conf_】ShowNet x 宇宙ネットワーク
shownet
PRO
0
290
【shownet.conf_】コンピューティング資源を統合した分散コンテナ基盤の進化
shownet
PRO
0
290
Dual level of task scheduling for VM workloads
ennael
PRO
0
180
KDD2024参加報告
cyberagentdevelopers
PRO
0
190
【ログ分析勉強会】EDR ログで内部不正を検出できるのか、Copilot に聞いてみた
hssh2_bin
2
260
How CERN serves 1EB of data via FUSE
ennael
PRO
0
15k
第45回 MLOps 勉強会 - ML Test Score を用いた機械学習システムの定量的なアセスメント
masatakashiwagi
2
130
位置情報とオープンソースがやりたくてMIERUNEに転職した話 〜経歴、事例紹介、GISへのいざない〜 / MIERUNE JCT - Tokyo 2024
mierune
PRO
0
400
Featured
See All Featured
Navigating Team Friction
lara
183
14k
Building Better People: How to give real-time feedback that sticks.
wjessup
360
19k
Code Review Best Practice
trishagee
62
16k
Fashionably flexible responsive web design (full day workshop)
malarkey
403
65k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.3k
10 Git Anti Patterns You Should be Aware of
lemiorhan
653
59k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
2
210
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
26
1.9k
How to Ace a Technical Interview
jacobian
275
23k
Web development in the modern age
philhawksworth
205
10k
Transcript
FFRI Security,Inc. 1 新ローレイヤー勉強会 ~番外編:初心者向け低レイヤーの世界#1~ 任意コード実行の原理 株式会社FFRIセキュリティ https://www.ffri.jp 2024-03-26
FFRI Security,Inc. 免責 ここで紹介するのは登壇者が当時勉強した内容で、今となっては古典的 /常識的内容です どういうきっかけでセキュリティに興味をもったのか、どのように勉強 を進めたのか参考にいただければと思います 2
FFRI Security,Inc. 講師紹介 ー ざくっと経歴 HTMLにめっちゃハマる W3Cの「HTML 4.01 Specification」が愛読書 大学の研究室はWeb関係
シェルコードにもハマる 超絶技巧が面白くて無駄すぎるEGGも作成 KNOPPIXベースのWhoppix環境で攻撃を試行 3 小学生 家にあったPCを触ってITに関わる 高校生 中学生 セキュリティに漠然とした興味を持つ C言語の勉強をしてみたり、HTMLで色々ページを作ったり IT業界で生きていくことを決意 ひとまず基本情報技術者試験を勉強 大学時代
FFRI Security,Inc. きっかけ 4 某センターのコンピュータが 不正に侵入され甚大な被害… ニュースとか本とかでよく見るけど何? 不正ログインはわかるけど そうじゃないやり方があるっぽい 具体的にどういうこと?
FFRI Security,Inc. バッファオーバーフローとの邂逅 バッファオーバーフローなるものを使うと本でちらっと見る 技術的には結構怪しい目の本・・・ この時期の自分は多読派で、一通り目についた本をざっと読むよ うな読書をしていた 好きなコードを実行できる技術だと知る プログラムの本来の動きを変えて攻撃者の思う挙動をさせる そのやり方はどうやるんだろう・・・というのを調べていった
CPUのプログラム実行の方法を知る必要があることに気が付く うろ覚えの基本情報技術者試験のCPUの動きのあたりを再学習 5
FFRI Security,Inc. コンピュータの基本構成 メモリにデータとコードを配置 CPUは適宜メモリからコードを読み取って実行 メモリは領域を区切って情報を管理 6 メモリ ストレージ CPU
演算部/制御部 入力装置 テキスト領域: プログラムのコード部 分を配置 スタック領域: 一時的な情報を配置 データ領域: プログラムでずっと使 う情報を配置 高位から低位に 伸びる 0x0000 0xFFFF
FFRI Security,Inc. 命令実行の動作イメージ 1 7 0041D459 プログラムカウンタ 命令レジスタ デコーダ 5
汎用レジスタ eax ALU メモリ 制御部 演算部
FFRI Security,Inc. 命令実行の動作イメージ 2 8 0041D459 プログラムカウンタ 命令レジスタ デコーダ 5
汎用レジスタ eax ALU メモリ 制御部 演算部
FFRI Security,Inc. 命令実行の動作イメージ 3 9 0041D459 プログラムカウンタ 8901C083 命令レジスタ デコーダ
5 汎用レジスタ eax ALU メモリ 制御部 演算部
FFRI Security,Inc. 命令実行の動作イメージ 4 10 0041D459 プログラムカウンタ 8901C083 命令レジスタ add
eax, 1 デコーダ 5 汎用レジスタ eax ALU メモリ 制御部 演算部
FFRI Security,Inc. 命令実行の動作イメージ 5 11 0041D459 プログラムカウンタ 8901C083 命令レジスタ add
eax, 1 デコーダ 5 汎用レジスタ eax ALU メモリ 制御部 演算部
FFRI Security,Inc. 命令実行の動作イメージ 6 12 0041D459 プログラムカウンタ 8901C083 命令レジスタ add
eax, 1 デコーダ 5 汎用レジスタ eax ALU メモリ 制御部 演算部 5 + 1 = 6
FFRI Security,Inc. 命令実行の動作イメージ 7 13 0041D459 プログラムカウンタ 8901C083 命令レジスタ add
eax, 1 デコーダ 6 汎用レジスタ eax ALU メモリ 制御部 演算部
FFRI Security,Inc. 命令実行の動作イメージ 8 14 0041D45D プログラムカウンタ 命令レジスタ デコーダ 6
汎用レジスタ eax ALU メモリ 制御部 演算部
FFRI Security,Inc. プログラムカウンタの制御を奪う プログラムカウンタ(EIPレジスタ)を制御できれば任意のアドレスに 格納された命令を実行させられるとわかった EIPはシステムの動作に従って自動的に変更される ・命令を実行し終えた後 ・JMP命令実行時 ・関数呼び出しから元の処理に戻るとき ・等々…
15 どうやってEIPを制御する?
FFRI Security,Inc. 関数 まとまった処理や特定の機能をグループ化 コードの可読性や再利用性を担保するうえで必須の概念 16 int isEven( int target
) { int result = 0; if ( target % 2 == 0 ) { result = 1; } return result; } … a =1440; if ( isEven( a ) == TRUE ) { result *= 2; } … 重要な点は関数での仕事が終わったら 元の場所に戻ってくるということ
FFRI Security,Inc. スタックフレーム 一時的なデータ配置にはスタック領域を使用 関数ごとに利用する領域が異なる 関数が終了すると一時データは不要なので捨てる 17 関数Bのスタック領域 関数Aのスタック領域 0x0000
0xFFFF 理解するにはアセンブリ言語の知識が不可欠 午後問はCASL IIで合格したけど… 改めて基本情報技術者試験の教科書を開く
FFRI Security,Inc. アセンブリに直すとどうなるか 18 call命令の処理 スタック領域にRET=次に実行すべきアドレス(例では00401054)をpush EIPを関数のアドレス(例では00401000)にセット callの次に実行されるべきアドレス 関数の開始アドレス RET
= 00401054 別関数のスタック領域 0x0000 0xFFFF ebp esp
FFRI Security,Inc. アセンブリに直すとどうなるか 19 EBPの退避 「push ebp」にて関数呼び出し時点のebpの値をSEBPとして保持 RET = 00401054
別関数のスタック領域 0x0000 0xFFFF esp SEBP ebp
FFRI Security,Inc. アセンブリに直すとどうなるか 20 スタックフレームの切り替え ebpをespの値で上書き=epbを今のスタックの頂点に設定 RET = 00401054 別関数のスタック領域
0x0000 0xFFFF ebp esp SEBP
FFRI Security,Inc. アセンブリに直すとどうなるか 21 ローカル変数の確保 resultというint型のローカル変数を宣言している(シンボル情報は消える) ebpの上に確保されるが、espは変わらない点に注意 RET = 00401054
別関数のスタック領域 0x0000 0xFFFF ebp esp SEBP var_4 var_4は実態は-4という数値 ebpからのオフセットで変数へアクセス
FFRI Security,Inc. アセンブリに直すとどうなるか 22 EBPの復元 スタックからデータを取り出しebpに格納 ebpは関数の呼び出し前まで使っていたスタック領域に戻る RET = 00401054
別関数のスタック領域 0x0000 0xFFFF esp SEBP var_4 ebp
FFRI Security,Inc. アセンブリに直すとどうなるか 23 retn命令の処理 その時点でスタックの頂点にある値をEIPにセット 通常はRET(関数呼び出し時に次に実行べきアドレス)がセットされる RET = 00401054
別関数のスタック領域 0x0000 0xFFFF esp SEBP var_4 ebp
FFRI Security,Inc. バッファオーバフローの原理 ローカル変数とRETの位置関係に着目 4バイトの変数に12バイト分の「A」を書き込むとどうなる? 24 RET = 00401054 0x0000
0xFFFF SEBP var_4 RET = 00401054 0x0000 0xFFFF SEBP var_4 41 41 41 41 41 41 41 41 41 41 41 41 関数からretnすると0x41414141がEIPにセットされる RETに位置するデータをうまく構築すれば任意アドレスをEIPにできる コレ!
FFRI Security,Inc. どこに制御を移すべきか 実行させたい命令が偶然メモリに入っている? 関与しやすいのはRETを上書きした時に使ったデータ 実行させたい命令を詰め込み、先頭に処理を移す 25 RET = 00401054
0x0000 0xFFFF SEBP var_4 RET = 00401054 0x0000 0xFFFF SEBP var_4 0x00CFFC34 48 40 90 90 33 C0 40 48 00 CF FC 34 0x00CFFC34 攻撃者が用意する必要がある!! 48 dec eax 40 inc eax 90 nop 90 nop 33 C0 xor eax, eax 40 inc eax 48 dec eax
FFRI Security,Inc. シェルコード 先述したコードは意味がなく、実際には有益なコードを実行させる 一般的にはbashやshなどのシェルを起動する 攻撃者はCUIによるコンピュータの手動操作ができるようになる! プログラムの途中からコードに遷移させるため制限がある 絶対値でのJMP命令が使用できない データ領域は使えない 26
文字列などのプログラム中で使うデータは 独自に生成するか、予めシェルコードに埋 め込んでおく必要
FFRI Security,Inc. まとめ 基本情報技術者の勉強とかが意外と役に立った 現場では使えないなどと揶揄されがちだが・・・ 怪しげな本でも得るものはある 状況によるが多読も必要、どこで何がつながるかわからない セキュリティ以外の基礎がわりと重要 計算機科学の基礎や仮説検証のプロセスなどの知識・スキル 興味を抱いた未知を深掘りしていく過程は楽しい
楽しめるかどうかは、結構重要 27