Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
x86アセンブラ入門
Yuma Kurogome
July 22, 2014
Programming
7
5.1k
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
26k
死にゆくアンチウイルスへの祈り
ntddk
55
38k
Windows Subsystem for Linux Internals
ntddk
10
2.5k
なぜマルウェア解析は自動化できないのか
ntddk
6
3.7k
Linear Obfuscation to Drive angr Angry
ntddk
4
740
CAPTCHAとボットの共進化
ntddk
2
930
マルウェアを機械学習する前に
ntddk
3
1.3k
Peeling Onions
ntddk
7
3.1k
仮想化技術を用いたマルウェア解析
ntddk
8
26k
Other Decks in Programming
See All in Programming
Springin‘でみんなもクリエイターに!
ueponx
0
210
VisualProgramming_GoogleHome_LINE
nearmugi
1
230
開発速度を5倍早くするVSCodeの拡張機能を作った
purp1eeeee
2
150
短納期でローンチした新サービスをJavaで開発した話/launched new service using Java
eichisanden
6
1.9k
GDG Seoul IO Extended 2022 - Android Compose
taehwandev
0
300
プロダクトのタイプ別 GraphQL クライアントの選び方
shozawa
0
840
1時間半で克服するJavaScriptの非同期処理/async_javascript_kokufuku
marchin1989
2
620
UI Testing of Jetpack Compose Apps, AppDevCon
alexzhukovich
0
160
React Nativeアプリを DDDで開発している話
nihemak
0
120
#JJUG_CCC 「サポート」は製品開発? - JDBCライブラリ屋さんが実践する攻めのテクニカルサポートとJavaエンジニアのキャリアについて -
cdataj
0
420
Terraform Plan/Apply結果の自動通知
ymmy02
0
280
Node-RED 3.0 新機能紹介
utaani
0
140
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
448
30k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
181
15k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
105
16k
Designing on Purpose - Digital PM Summit 2013
jponch
106
5.6k
Product Roadmaps are Hard
iamctodd
34
6.5k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.4k
How To Stay Up To Date on Web Technology
chriscoyier
780
250k
A Modern Web Designer's Workflow
chriscoyier
689
180k
4 Signs Your Business is Dying
shpigford
169
20k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
15k
Navigating Team Friction
lara
175
11k
Why Our Code Smells
bkeepers
PRO
324
55k
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ファイルフォーマット • 逆アセンブラとデバッガ •
アンチデバッギング