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
5.7k
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
38k
Windows Subsystem for Linux Internals
ntddk
10
2.9k
なぜマルウェア解析は自動化できないのか
ntddk
6
4.1k
Linear Obfuscation to Drive angr Angry
ntddk
4
820
CAPTCHAとボットの共進化
ntddk
2
1.1k
マルウェアを機械学習する前に
ntddk
3
1.6k
Peeling Onions
ntddk
7
3.5k
仮想化技術を用いたマルウェア解析
ntddk
8
27k
Other Decks in Programming
See All in Programming
CSC509 Lecture 13
javiergs
PRO
0
110
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
CSC509 Lecture 12
javiergs
PRO
0
160
Better Code Design in PHP
afilina
PRO
0
130
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
230
C++でシェーダを書く
fadis
6
4.1k
Hotwire or React? ~アフタートーク・本編に含めなかった話~ / Hotwire or React? after talk
harunatsujita
1
120
Arm移行タイムアタック
qnighy
0
330
Webの技術スタックで マルチプラットフォームアプリ開発を可能にするElixirDesktopの紹介
thehaigo
2
1k
RubyLSPのマルチバイト文字対応
notfounds
0
120
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
190
ActiveSupport::Notifications supporting instrumentation of Rails apps with OpenTelemetry
ymtdzzz
1
250
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Designing the Hi-DPI Web
ddemaree
280
34k
GitHub's CSS Performance
jonrohan
1030
460k
Statistics for Hackers
jakevdp
796
220k
Unsuck your backbone
ammeep
668
57k
Automating Front-end Workflow
addyosmani
1366
200k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
100
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
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ファイルフォーマット • 逆アセンブラとデバッガ •
アンチデバッギング