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
6.1k
7
Share
x86アセンブラ入門
研究室でやった入門講座です
Yuma Kurogome
July 22, 2014
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.4k
Linear Obfuscation to Drive angr Angry
ntddk
4
900
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
第3木曜LT会 #28
tinykitten
PRO
0
110
JAWS-UG横浜 #100 祝・第100回スペシャルAWS は VPC レスの時代へ
maroon1st
0
170
GitHubCopilotCLIをはじめよう.pdf
htkym
0
220
事業会社でのセキュリティ長期インターンについて
masachikaura
0
260
HTML-Aware ERB: The Path to Reactive Rendering @ RubyKaigi 2026, Hakodate, Japan
marcoroth
0
180
ドメインイベントでビジネスロジックを解きほぐす #phpcon_odawara
kajitack
3
790
AI時代のエンジニアリングの原則 / Engineering Principles in the AI Era
haru860
0
580
アクセシビリティ試験の"その後"を仕組み化する
yuuumiravy
1
170
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
4
3k
iOS機能開発のAI環境と起きた変化
ryunakayama
0
190
Don't Prompt Harder, Structure Better
kitasuke
0
780
Oxlintとeslint-plugin-react-hooks 明日から始められそう?
t6adev
0
280
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.9k
Skip the Path - Find Your Career Trail
mkilby
1
110
How to Think Like a Performance Engineer
csswizardry
28
2.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Raft: Consensus for Rubyists
vanstee
141
7.4k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
350
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.1k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.9k
The Language of Interfaces
destraynor
162
26k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
150
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ファイルフォーマット • 逆アセンブラとデバッガ •
アンチデバッギング