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
650
任意コード実行の原理
新ローレイヤー勉強会
~番外編:初心者向け低レイヤーの世界#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
440
Out of Bytecode - Python スクリプトからメモリ上の関数オブジェクトを呼ぶまで
ffri
0
460
Arm TrustZoneを利用したTEEシステムのアーキテクチャと脆弱性の紹介
ffri
0
820
Other Decks in Technology
See All in Technology
適材適所の技術選定 〜GraphQL・REST API・tRPC〜 / Optimal Technology Selection
kakehashi
1
460
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
270
いざ、BSC討伐の旅
nikinusu
2
780
Can We Measure Developer Productivity?
ewolff
1
150
なぜ今 AI Agent なのか _近藤憲児
kenjikondobai
4
1.4k
隣接領域をBeyondするFinatextのエンジニア組織設計 / beyond-engineering-areas
stajima
1
270
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
110
B2B SaaSから見た最近のC#/.NETの進化
sansantech
PRO
0
810
複雑なState管理からの脱却
sansantech
PRO
1
140
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
410
VideoMamba: State Space Model for Efficient Video Understanding
chou500
0
190
Making your applications cross-environment - OSCG 2024 NA
salaboy
0
190
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
YesSQL, Process and Tooling at Scale
rocio
169
14k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
It's Worth the Effort
3n
183
27k
A Philosophy of Restraint
colly
203
16k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Intergalactic Javascript Robots from Outer Space
tanoku
269
27k
Being A Developer After 40
akosma
86
590k
Navigating Team Friction
lara
183
14k
How to Ace a Technical Interview
jacobian
276
23k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
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