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
28k
死にゆくアンチウイルスへの祈り
ntddk
55
39k
Windows Subsystem for Linux Internals
ntddk
10
3.1k
なぜマルウェア解析は自動化できないのか
ntddk
6
4.3k
Linear Obfuscation to Drive angr Angry
ntddk
4
870
CAPTCHAとボットの共進化
ntddk
2
1.2k
マルウェアを機械学習する前に
ntddk
3
1.7k
Peeling Onions
ntddk
7
3.7k
仮想化技術を用いたマルウェア解析
ntddk
8
27k
Other Decks in Programming
See All in Programming
Herb to ReActionView: A New Foundation for the View Layer @ San Francisco Ruby Conference 2025
marcoroth
0
190
DartASTとその活用
sotaatos
2
150
Phronetic Team with AI - Agile Japan 2025 closing
hiranabe
2
670
Flutterチームから作る組織の越境文化
findy_eventslides
0
570
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
5
990
「10分以内に機能を消せる状態」 の実現のためにやっていること
togishima
1
530
flutter_kaigi_2025.pdf
kyoheig3
1
360
目的で駆動する、AI時代のアーキテクチャ設計 / purpose-driven-architecture
minodriven
10
3.3k
GraalVM Native Image トラブルシューティング機能の最新状況(2025年版)
ntt_dsol_java
0
170
競馬で学ぶ機械学習の基本と実践 / Machine Learning with Horse Racing
shoheimitani
14
13k
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
21
16k
知られているようで知られていない JavaScriptの仕様 4選
syumai
0
630
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Fireside Chat
paigeccino
41
3.7k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
It's Worth the Effort
3n
187
29k
Embracing the Ebb and Flow
colly
88
4.9k
How to train your dragon (web standard)
notwaldorf
97
6.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Facilitating Awesome Meetings
lara
57
6.6k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Documentation Writing (for coders)
carmenintech
76
5.1k
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ファイルフォーマット • 逆アセンブラとデバッガ •
アンチデバッギング