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
x86アセンブラ入門
Search
Yuma Kurogome
July 22, 2014
Programming
7
6k
x86アセンブラ入門
研究室でやった入門講座です
Yuma Kurogome
July 22, 2014
Tweet
Share
More Decks by Yuma Kurogome
See All by Yuma Kurogome
The Art of De-obfuscation
ntddk
16
27k
死にゆくアンチウイルスへの祈り
ntddk
55
39k
Windows Subsystem for Linux Internals
ntddk
10
3k
なぜマルウェア解析は自動化できないのか
ntddk
6
4.3k
Linear Obfuscation to Drive angr Angry
ntddk
4
850
CAPTCHAとボットの共進化
ntddk
2
1.2k
マルウェアを機械学習する前に
ntddk
3
1.6k
Peeling Onions
ntddk
7
3.7k
仮想化技術を用いたマルウェア解析
ntddk
8
27k
Other Decks in Programming
See All in Programming
tool ディレクティブを導入してみた感想
sgash708
1
140
大規模FlutterプロジェクトのCI実行時間を約8割削減した話
teamlab
PRO
0
490
あのころの iPod を どうにか再生させたい
orumin
2
2.5k
The State of Fluid (2025)
s2b
0
170
自作OSでDOOMを動かしてみた
zakki0925224
1
1.4k
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
730
Understanding Kotlin Multiplatform
l2hyunwoo
0
260
Scale out your Claude Code ~自社専用Agentで10xする開発プロセス~
yukukotani
9
2.3k
TanStack DB ~状態管理の新しい考え方~
bmthd
1
120
DataformでPythonする / dataform-de-python
snhryt
0
180
WebAssemblyインタプリタを書く ~Component Modelを添えて~
ruccho
1
860
マイコンでもRustのtestがしたい その2/KernelVM Tokyo 18
tnishinaga
2
2.3k
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
96
6.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Six Lessons from altMBA
skipperchong
28
4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
How to Ace a Technical Interview
jacobian
279
23k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Documentation Writing (for coders)
carmenintech
73
5k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
The Cost Of JavaScript in 2023
addyosmani
53
8.8k
Transcript
x86アセンブラ入門 mcat meeting #4 07/22/2014 ntddk
前提 • 実行ファイルからソースコードを復元するのは 困難 – セマンティックギャップ – 変数名 – ポインタ
– コンパイラ最適化 • リバースエンジニアリング
アセンブラ 8B E5 mov esp, ebp • ニーモニック – オペコードとオペランドの組み合わせ
• オペコード – アセンブラの命令 • オペランド – 演算に用いるレジスタやメモリアドレス 機械語 オペコード 第一オペランド 第二オペランド ニーモニック
レジスタ • CPU内の記憶領域 • 汎用レジスタ – eax, ecx, edx, ebx,
esp, ebp, esi, edi • セグメントレジスタ – cs, ds, ss, es, fs, gs • ステータス制御レジスタ – eflags, eip • FPUレジスタ, MMXレジスタ, SSEレジスタ
汎用レジスタ • eax, ecx, edx, ebx, esp, ebp, esi, edi
• eax, ecx, edx, ebx – 値 – eax • 変数 – ecx • C++製のバイナリに多い • thisポインタ, forのカウンタなどが保存される • 初期化されなければクラスのメンバ関数
汎用レジスタ • eax, ecx, edx, ebx, esp, ebp, esi, edi
• esi, edi – メモリアドレス
汎用レジスタ • esp – スタックポインタ – push命令, pop命令によって変動 • ebp
– スタックフレームのベースポインタ 値 a リターンアドレス 値 b スタックはLast In, First Out スタックポインタ ベースポインタ
セグメントレジスタ • cs, ds, ss, es, fs, gs • 旧世代の遺物
• cs – コードセグメント – 実行ポインタが参照 • ds – データセグメント – mov命令などが参照
セグメントレジスタ • ss – スタックセグメント – push, pop, call, retなどスタック操作を伴う命令が
参照 • es, fs, gs – 仕組み上はおまけのようなものだが… – いずれ詳しくやります – 構造化例外ハンドラ
ステータス制御レジスタ • eflags, eip • eflags – 演算過程の状態を保存 – 加減(add,
sub)や比較(cmp test)の命令に伴いセット される
ステータス制御レジスタ • eflagsのフラグ – CF • キャリーフラグ • 最上位ビットに対して繰り上げまたは繰り下げが行われ たときにセットされる
– ZF • ゼロフラグ • 結果がゼロだったときにセット
ステータス制御レジスタ • eflagsのフラグ – SF • サインフラグ • 結果がマイナス値だったときにセット –
OF • オーバーフローフラグ • 結果を格納するためのレジスタより結果の値が大きいと きにセット
ステータス制御レジスタ • eip – 次に実行する命令のアドレス
代表的なアセンブラの命令 • mov命令 – レジスタ・メモリ間またはレジスタ・レジスタ間で 値をコピー – mov ecx, 10
; ecx = 10 • add命令, sub命令 – 加減算 – add eax, ecx ; eax = eax + ecx
代表的なアセンブラの命令 • push命令, pop命令 – スタックに値を入れる, スタックから値を取り出す – espの加減算を伴う
代表的なアセンブラの命令 • sal命令, sar命令 – 左シフト演算, 右シフト演算(算術シフト) – 1bit左シフトの場合, 1010
0011 → 1100 0110 • shl命令, shr命令 – 左シフト演算, 右シフト演算(論理シフト) – 1bit左シフトの場合, 1010 0011 → 0100 0110 – 2の累乗で乗算 , 2の累乗で除算と覚えると楽 – shr eax, 0x4 ; ecx = ecx >> 0x4 • 余りは無視
代表的なアセンブラの命令 • 分岐命令 – eflagsレジスタをもとに任意のアドレスに分岐 – jmp命令 • 無条件ジャンプ –
jc, jnc命令 • CFが立っているかどうか – jz, jnz命令 • ZFが立っているかどうか
代表的なアセンブラの命令 • 分岐命令 – js, jns命令 • SFが立っているかどうか – jo,
jno命令 • OFが立っているかどうか
代表的なアセンブラの命令 • test命令 – 論理積 – test eax, eax –
eax=0ならZF=1となるので, jz命令などで分岐 • cmp命令 – 比較 – cmp eax, 0 – eax=0ならZF=1となるので, jz命令などで分岐
代表的なアセンブラの命令 • xor命令 – 排他的論理和 – xor eax, eax –
同じ値同士なら0になるので, testやcmpの準備に多 用される
d.hatena.ne.jp/a4lg/20120225/1330180431
予定 • 実際の逆アセを読む – 特にC++の仮想関数テーブルやコンストラクタなど • PEファイルフォーマット • 逆アセンブラとデバッガ •
アンチデバッギング