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
逆向工程基礎
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Inndy
December 01, 2016
Technology
1.5k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
逆向工程基礎
Inndy
December 01, 2016
More Decks by Inndy
See All by Inndy
工程師一定要懂的 Text Encoding
inndy
1
780
資訊安全:麻瓜的黑魔法防禦術
inndy
3
3.1k
HackmeCTF 平台背後的心酸血淚史
inndy
2
880
COSCUP 2018 Lightning Talk - 審稿好難,所以我們來寫程式吧
inndy
0
500
逆向工程:從入門到放棄
inndy
7
3.6k
HITCON 2017 Zeroday 發表會
inndy
0
1.4k
No More Crypto Fails
inndy
34
8.3k
你再共用密碼啊
inndy
1
800
CTF From Zero To One
inndy
5
5.3k
Other Decks in Technology
See All in Technology
LLMやAIエージェントをソフトウェアに組み込むプラクティス
shibuiwilliam
1
370
最適な自走を最小限の支援で — M&Aで拡大する組織で少人数SREが挑んだ1年 / SRE NEXT 2026
genda
0
1.2k
Terraform共通モジュールをチーム横断で“変えられる”運用へ ― リリースと適用の分離
kekke_n
1
3k
Claude Code公式skillで 自分の仕事を少しずつ手放そう!(Claude Code開発ノウハウ大公開スペシャル by クラスメソッド)
kaym
1
350
アカウントが増えてからでは遅い? ~ マルチアカウント統制の勘所 ~
kenichinakamura
0
230
ガバナンスの「ちょうどいい落とし所」を探れ!開発スピードを妨げない運用判断の勘所 / SRE NEXT 2026
genda
1
130
環境凍結という Toil を倒す -セルフサービス型 Ephemeral テスト環境の 設計と実践
shirouz
1
2.4k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
110k
ソニー銀行におけるビジネスアジリティ向上のためのクラウドシフト戦略
srenext
0
260
Amazon EVS で VCF 9.0 / 9.1 のサポート開始まとめ
mtoyoda
0
300
SRE本の知られざる名シーン / The Hidden Gems of Google SRE Book
nari_ex
1
400
非定型なドキュメントを効率よくリファクタする 〜えぇ!?仕様書27本の移行が1日で終わったって!?〜
subroh0508
2
420
Featured
See All Featured
Leo the Paperboy
mayatellez
8
1.9k
HDC tutorial
michielstock
2
740
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
560
Claude Code のすすめ
schroneko
67
230k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
800
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
63
55k
Transcript
/5645须㸞灇瑖爢 *OOEZJOOEZUX!HNBJMDPN 3FWFSTF&OHJOFFSJOH
㖈㨥⛓ ˙ 䧮⧺鏤⡹䊺竤剚 ˙ ✳鹎⡙⼧鹎⡙⼧Ⱉ鹎⡙⛓✽湱鱲䳖 ˙ 㻨玑䒭濼麥JG MPPQ GVODUJPO SFDVSTJPO
WBSJBCMF BSSBZ ˙ $铃鎊㛇劥1PJOUFS乽⡲ ˙ 㥶卓剤聃♶㣖僈涯涸㖒倰〳⟃莊䩛涮㉏ ˙ 㥶卓⟃♳剤馄麕♧⼱⟃♳溏♶䥢䧴♶濼麥⡹〳腋饥ꐫ來㹔✫
0VUMJOF ˙ ⾲㨥焺管陼㐼莅㛂遤墂 ˙ 鎹䥊넓垸㘗 ˙ 玑䒭⼦媯 ˙ 鎹䥊넓⼦媯莅⡑㽷 ˙
ⴲ䱳穉ざ铃鎊 ˙ $16冾㶸㐼 ˙ 4UBDL
鷠ぢ䊨玑➝稲 ˙ ⡹尝剤玑䒭涸⾲㨥焺 ˙ ⡹䟝銴濼麥鸏⦐玑䒭僽䙦랃㻜⡲涸 ˙ ⡹䟝銴㻨麉䨡㢫䱦 ˙ ⡹䟝銴灶鍑⸆腋뀿阮 ˙
⡹䟝銴㻨鮿넓鏽ⱁ堥 ˙ ⡹䟝銴䪪怪峯 ˙ ⡹銴鷠ぢ䊨玑
♶ず涸管陼㛂遤倰䒭 ˙ 管陼䧭⾲欰堥㐼焺/BUJWF ˙ $ $ 0CK$ 4XJGU HPMBOH IBTLFMM
"OESPJE "35 ˙ 管陼䧭⚥焺*OUFSNFEJBUF-BOHVBHF *- PSCZUFDPEF ˙ /&5 $ 7# ' +BWB 1ZUIPO QSFDPNQJMFEUPQZD ˙ 湬陼*OUFSQSFUJOH ˙ 1ZUIPO 3VCZ +BWB4DSJQU 7#4DSJQU -*41
⾲㨥焺管陼㐼莅〳㛂遤墂 ⾲㨥焺 㛂遤墂 管陼㐼
⾲㨥焺管陼㐼莅〳㛂遤墂 ⾲㨥焺 㛂遤墂 鷠ぢ ♶剚㸤♧垺⡎駈⟃管陼ⴀ♧垺⸆腋涸玑䒭䧴僽澗鍑玑䒭遤捀
管陼㐼珏겳 ˙ "05 "IFBEPGUJNF ˙ 㽠僽⡹濼麥涸$ $ 管陼㐼䖰⾲㨥焺管陼䧭〳㛂遤墂呪 ˙
+*5 +VTUJOUJNF ˙ $ISPNF涸7+BWB4DSJQUFOHJOF㿂倴鸏珏駵饱⢵涸儘⦬管陼䧭堥㐼焺 ˙ 5SBOTDPNQJMBUJPO ˙ 䖰♧珏邍麨倰䒭管陼䧭〥㢫♧珏TPVSDFDPEFUPTPVSDFDPEF $ZUIPO CZUFDPEFUPOBUJWF "OESPJE3VO5JNF "35
䧮⦛鎣锸涸眕㕠 ˙ 〫剤"05$PNQJMFS管陼ⴀ⢵涸/BUJWF$PEF ˙ YBOEY@Ⰽ珏卺圓 ˙ Ⱖ➮涸ヤ ˙ 䊨Ⱘ鿪窍⡹✫荈䊹㷸ゅ9% ˙
+BWB+%(6* KBEY DGS ˙ "OESPJE +BWB KBEY EFYKBS +%(6* ˙ /&5*-4QZ /&53FFDUPS EPU1FFL +VTU%FDPNQJMF ˙ 1ZUIPO QZD VODPNQZMF
鎹䥊넓垸㘗 ˙ 㣐㹻㼩⟃♴そ鑂剤㢵澗鍑 ˙ CJUCZUF ˙ 隶侸 ˙ 鎹䥊넓䭸垦1PJOUFS ˙
ꤏ ˙ 穡圓넓4USVDUVSF ˙ 6OJPO
鎹䥊넓垸㘗 ˙ 嫦⦐呔㶩僽CZUF ˙ 嫦⦐呔㶩剤荈䊹涸管贫鎹䥊넓㖒㖧.FNPSZBEESFTT⣜䎸黃㟞 ˙ ♧⦐隶侸〳腋剚欽㥪䎙⦐CZUF ˙ 隶侸涸NFNPSZBEESFTT僽痧♧⦐CZUF涸BEESFTT
鎹䥊넓垸㘗 int a = 0xabcd1234; assert(&a == (int*)0x0034); assert(sizeof(int) ==
4);
鎹䥊넓垸㘗 34 12 CD AB
鎹䥊넓垸㘗 int arr[3] = { 0xabababab, 0xcccccccc, 0xffffffff }; assert(arr
== (int*)0x0034); assert(sizeof(int) == 4);
鎹䥊넓垸㘗 AB AB AB AB CC CC CC CC FF
FF FF FF
˙ Ⰽ珏倰䒭CJHFOEJBO MJUUMFFOEJBO ˙ Y⢪欽MJUUMFFOEJBO ˙ JOUBY̔Y Y Y Y
JONFNPSZ ˙ MPOHMPOHCYBCDEFG ˙ ̔YFG YDE YBC Y Y Y Y Y JONFNPSZ ˙ CJHFOEJBO ˙ JOUBY̔Y Y Y Y JONFNPSZ 侮侸⮭㶸倰䒭
玑䒭⼦媯 $SBDLNFFYF 1&)FBEFS 4FDUJPO5BCMF $PEF4FDUJPO %BUB4FDUJPO *NQPSU&YQPSU5BCMF 4FDUJPOT
鎹䥊넓⼦媯莅⡑㽷 $SBDLNFFYF $PEF4FDUJPO 3FBEPOMZ%BUB )FBEFS 8SJUBCMF%BUB 1SPDFTT%BUB 1&.PEVMF ''''''''
4UBDL )FBQ LFSOFMEMM 1&.PEVMF
ⴲ䱳穉ざ铃鎊 00000000: 56 53 83 ec 04 8b 5c 24
10 83 fb 02 7e 24 31 f6 VS....\$....~$1. 00000010: 8d 43 ff 83 ec 0c 83 eb 02 50 e8 e1 ff ff ff 83 .C.......P...... 00000020: c4 10 01 c6 83 fb 02 7f e7 8d 46 01 83 c4 04 5b ..........F....[ 00000030: 5e c3 鸏❉须俲僽➊랃
00000000 56 00000001 53 00000002 83EC04 00000005 8B5C2410 00000009 83FB02
0000000C 7E24 0000000E 31F6 00000010 8D43FF 00000013 83EC0C 00000016 83EB02 00000019 50 0000001A E8E1FFFFFF 0000001F 83C410 00000022 01C6 00000024 83FB02 00000027 7FE7 00000029 8D4601 0000002C 83C404 0000002F 5B 00000030 5E 00000031 C3 ⴲ䱳穉ざ铃鎊 穉陼⛓䖕 push esi push ebx sub esp,byte +0x4 mov ebx,[esp+0x10] cmp ebx,byte +0x2 jng 0x32 xor esi,esi lea eax,[ebx-0x1] sub esp,byte +0xc sub ebx,byte +0x2 push eax call dword 0x0 add esp,byte +0x10 add esi,eax cmp ebx,byte +0x2 jg 0x10 lea eax,[esi+0x1] add esp,byte +0x4 pop ebx pop esi ret address opcode assembly code
ⴲ䱳穉ざ铃鎊 ⾲㨥焺Ꟁ鸏垺 int fib(int n) { if(n <= 2) {
return 1; } else { return fib(n - 1) + fib(n - 2); } }
ⴲ䱳穉ざ铃鎊圓䧭 ˙ 歋䖎㢵䭸⟂穉䧭玑䒭 ˙ ⸈岁⛨岁9PS/PU嫲鯱騥鱲 ˙ 0QFSBUJPO<<<"SH> "SH> "SH> ˙
BEEFBY FCYFBY FCY ˙ 冾㶸㐼 ˙ $16Ⰹ㔿㹁涸䎙⦐隶侸
EAX = 0x12345678 AX = 0x5678 AL = 0x78 AH
= 0x56 ⴲ䱳穉ざ铃鎊 酢⯏4* 4) 4- խխխ%* %) %- &*1䭸ぢ玑䒭植㖈㛂遤 涸䭸⟂
˙ Y@㢵✫CJUTSFHJTUFSㄤ겙㢫涸Ⱄ⦐冾㶸㐼 ˙ &"9 CJUT ̔3"9 CJUT ˙ 3
3 3 3 3 3 3 3 ˙ 3 CJUT 3% CJUT 38 CJUT 3# CJUT ˙ 麌皿佪桧刿㥪 ˙ ⟃CJUT冾㶸㐼銴⨞Ⰽ妄⸈岁䩞腋㸤䧭MPOHMPOH CJUTJOUFHFS 湱 ⸈植㖈〫銴♧妄 ˙ $BMMJOHDPOWFOUJPO♶ず侸剚⯓佞冾㶸㐼 ⴲ䱳穉ざ铃鎊CJUT䊴殯
ⴲ䱳穉ざ铃鎊 ˙ 须俲珏겳 ˙ 冾㶸㐼SFH ˙ &"9 	 &$9 &%9
&%* &4* &41 ˙ 侸⧩JNN ˙ YD Y ˙ 鎹䥊넓罌NFN ˙ CZUFQUS<Y> ˙ EXPSEQUS<FCY FBY >
ⴲ䱳穉ざ铃鎊 • add dst, src • dst += src •
dst:mem, reg • src:mem, reg, imm • dst, src 不可同時為 mem • add eax, 7 // eax += 7 • add dword ptr [0x123456+eax*4], ebx // arr[eax] += ebx • add eax, ebx // eax += ebx
ⴲ䱳穉ざ铃鎊 • mov dst, src - dst = src •
add dst, src - dst += src • sub dst, src - dst -= src • and dst, src - dst &= src • or dst, src - dst |= src • xor dst, src - dst ^= src • not dst - dst = ~dst • inc dst - dst++
ⴲ䱳穉ざ铃鎊 // 算數練習 mov eax, 8 mov ebx, 7 xor
ecx, ecx inc ecx add eax, ebx add ebx, ebx sub eax, ebx sub ecx, eax
ⴲ䱳穉ざ铃鎊 • push val • val: imm, reg, mem •
把數值 push 進堆疊 • pop target • target: reg, mem • 把數值從堆疊 pop 到指定的地⽅方
ⴲ䱳穉ざ铃鎊 • jmp target • target: reg, imm, mem •
無條件跳轉到 target 的指令繼續執⾏行行 • call target • 函式呼叫,跟 jmp 有點像,但是把返回位址 push 進堆疊 • ret • 從 function 跳回返回位址,等於 pop eip
ⴲ䱳穉ざ铃鎊 • cmp a, b • a: reg, mem •
b: imm, reg • 比較完之後 CPU 會把比較結果記錄在 EFLAGS 裡⾯面 • je addr, jz addr - 如果比較相等就跳轉 / jne addr - 不相等跳轉 • jg addr - 如果 a > b 就跳轉 • jl addr - 如果 a < b 就跳轉 • jge addr - 如果 a >= b 就跳轉 • jle addr - 如果 a <= b 就跳轉
ⴲ䱳穉ざ铃鎊&'-"(4 ˙ 0'ˋ0WFSPX ˙ 4'ˋ4JHOFE ˙ ;'ˋ;FSP'MBH ˙ $'ˋ$BSSZ'MBH ˙
3FGFSFODFIUUQTDPVSTFTFOHSJMMJOPJTFEVFDFCPPLTMBCNBOVBMBTTFNCMZIUNM 0' 4' ;' $' … 11 … 7 6 … 0
ⴲ䱳穉ざ铃鎊箻绢 試著把以下組合語⾔言轉成 C 語⾔言 R: inc eax cmp eax, 10
jl R