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
Dart 参戦!!静的型付き言語界の隠れた実力者
kno3a87
0
210
【第4回】関東Kaggler会「Kaggleは執筆に役立つ」
mipypf
0
780
20250808_AIAgent勉強会_ClaudeCodeデータ分析の実運用〜競馬を題材に回収率100%の先を目指すメソッドとは〜
kkakeru
0
200
WebAssemblyインタプリタを書く ~Component Modelを添えて~
ruccho
1
910
Understanding Ruby Grammar Through Conflicts
yui_knk
1
120
Jakarta EE Core Profile and Helidon - Speed, Simplicity, and AI Integration
ivargrimstad
0
190
あなたとJIT, 今すぐアセンブ ル
sisshiki1969
1
720
書き捨てではなく継続開発可能なコードをAIコーディングエージェントで書くために意識していること
shuyakinjo
1
310
decksh - a little language for decks
ajstarks
4
21k
MCPで実現するAIエージェント駆動のNext.jsアプリデバッグ手法
nyatinte
6
850
The State of Fluid (2025)
s2b
0
200
Scale out your Claude Code ~自社専用Agentで10xする開発プロセス~
yukukotani
9
2.6k
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
The World Runs on Bad Software
bkeepers
PRO
70
11k
GraphQLとの向き合い方2022年版
quramy
49
14k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Designing for Performance
lara
610
69k
A Modern Web Designer's Workflow
chriscoyier
695
190k
Thoughts on Productivity
jonyablonski
69
4.8k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
480
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
KATA
mclloyd
32
14k
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ファイルフォーマット • 逆アセンブラとデバッガ •
アンチデバッギング