Introduction of Reverse Engineering

1,606 views

Published on

My presentation related to Reverse Engineering at 2010/09. Traditional Chinese.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,606
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
22
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Introduction of Reverse Engineering

  1. 1. Reverse Engineering 逆向工程入門 Y.C. Ling All Rights Reserved 2010/09/24
  2. 2. AgendaPart 1: 逆向工程入門Part 2: 從組合語言到除錯
  3. 3. Part 1 分享內容 中研院上課心得 自由軟體技術充電站-「軟體除錯分析-C語言逆向入門」 Website Link
  4. 4. 軟體工程 V.S. 逆向工程 軟體工程 人 => 機器 逆向工程 機器 => 人 
  5. 5. 逆向工程的應用研究分析 AV的最愛 也是外掛的最愛漏洞發掘 黑盒 白盒軟體除錯 我們有源始碼啊? 鬼打牆時的最後一招
  6. 6. Why C?Why C? 較為貼近Machine Code Machine Code易與Source Code一一對應What about C++? Much more complicated Class Member function Member data Virtual Function Template .....etc
  7. 7. Machine Code
  8. 8. 助記符號
  9. 9. 分析方法靜態分析 IDA pro objdump動態分析 Ollydbg gdb
  10. 10. IA32 Assembly Language 您懂組語?略懂略懂 mov a, b lea a, b add a, b sub a, b inc a dec a
  11. 11. IA32 Assembly Language cmp a, b jmp addr je addr jne addr j?? addr push a pop a call addr ret
  12. 12. Example 1: Hello World Main Function Three arguments 緊臨exit() Lets Demo....
  13. 13. Example 2: Function Call Calling Convention stdcall, cdecl: 參數由右至左推入堆疊 Stack ESP: 堆疊頂端 EBP: 堆疊底端int sub(a, b) { return a-b; }int result = sub(2, 1);轉成組合語言....push 1push 2call submov result, eaxDemo Time!!
  14. 14. Example 3: If Condition通常長的像....cmp a, bj?? addr廢話不多說,直接看Demo....
  15. 15. Example 4: For Loop 應該長的像.... 可是....編譯器會.... 甚至....唉....Demo吧....
  16. 16. Example 5: Password 實戰題 大約是CrackMe或WarGame最簡單難度 Demo Demo Demo!!
  17. 17. 只要有心.... 天才?世界上沒有那麼多天才啦 前輩: 逆向 = 經驗 + 耐心 不懂破解,別妄談保護 Just Try It!!
  18. 18. Just Try It回家做作業啦 看雪學院 http://www.pediy.com/ Wargame http://wargame.cs.nctu.edu.tw/ Crackme Beware of Virus & Trojan Sandbox!! VMWare VirtualBox
  19. 19. NCTU Wargame
  20. 20. Any Question? 還有Part 2....
  21. 21. Reverse Engineering Part 2 從組合語言到除錯 Y.C. Ling All Rights Reserved 2010/09/24
  22. 22. 從組合語言到除錯核心精神 了解你的C++ Code會被編譯成怎樣的機器碼組合語言的低階知識,的確數次幫我找到很難找的問題 但這招其實很難得用的出來 投資報酬率低XD 不是天天遇到需要看組語的鬼打牆Bug If so, 程式碼的品質太差了 就算鬼打牆,也不一定能從組語看出端倪
  23. 23. 從組合語言到除錯常應用的場合: 開啟Optimization造成Debugger資訊不完全 Crash Dump資訊不完全時 一行Code中有一連串的Function Call,不知道當在那個點How to learn? 沒有捷徑 C++基本功 Detail knowledge of C++ Compiler 組合語言基本功 Also helps in optimization以「對失效指標物件呼叫Member Function」為例
  24. 24. 靠腰,鬼打牆void CPlayer::IncreaseHP(int iAmount){ // Do a lot of work.... m_iHP += iAmount; //有人問:當在這行是三小狀況?}m_pPlayer->IncreaseHP(10); Access Violation 是m_pPlayer指標錯了嗎? 那為什麼Call IncreaseHP時不會當?
  25. 25. 您懂Access Violation?略懂略懂 程式什麼時候會當掉? Infinity loop, Deadlock, Invalid system call 最常見的狀況之一: Access Violation(Segmentation Fault) 何謂Access Violation 不合法的存取 讀寫未非法的Segment 寫入唯讀的Segment 當物件指標不合法 pPlayer->IncreaseHP(10); 如為null,則會讀寫到0附近的位置,造成當機 怎麼當?何時當? 為何有時Call Function就會當?有時執行Function Body才 當?
  26. 26. Non-Virtual Functionm_pPlayer->IncreaseHP(10)機器碼行為類似這樣CPlayer::InvokeHP(m_pPlayer, 10);組語長的像這樣push 10push m_pPlayercall CPlayer::InvokeHP呼叫時沒有存取m_pPlayer指向之內容!所以呼叫時不會當機,而當在函數
  27. 27. Virtual Functionm_pPlayer->IncreaseHP(10)組語行為像這樣mov eax, m_pPlayermov eax, DWORD PTR[eax] #當機add eax, offsetmov edx, DWORD PTR[eax]push 10push m_pPlayercall edxVirtual Function在被呼叫物件為null時,必定在呼叫時當機
  28. 28. Inline Function沒有Function Call! m_pPlayer->IncreaseHP(10)行為其實像m_pPlayer->m_iHP += 10
  29. 29. Crash when Function Invocation 假設呼叫了一個IncreaseHP的函式,該函式僅簡單地改 動一個Member Data Non-Virtual Function Virtual Function 當在Function中 呼叫時當機 Null Pointer 存取Member時Virtual Function Revisited: 若Segment被回收,可能 若Segment被回收,可mov eax, m_pPlayer 馬上當機。 能馬上當機。mov eax, DWORD PTR[eax]add eax, offset 否則,視該記憶體位置是 仍有機會完全不當機mov edx, DWORD PTR[eax] 否已被其他資料佔用。若 (指向Virtual Pointer 無的話,則可能(不幸地) Table的指標沒被動push 10 Dangling Pointer 沒有影響。若有的話,則 到)。push m_pPlayer 可能造成資料錯亂。 再者,可能在存取call edx VPTable或call function 時當機。
  30. 30. m_pGameStage->GetMainPlayer()->GetWeapon() ->GetSFX()->GetChannel(2)->SetSpeed(2.0f); Access Violation Crash Dump資訊不完全 偶發當機,難以重現int iDamage = pAttacker->GetDmg() * pAttacker->GetWeapon()->GetDmgBonus() / ( pDefender->GetDef() * pDefender->GetArmor()->GetDefBonus() );.....Orz
  31. 31. 結語核心精神: 了解你的C++ Code會被編譯成怎樣的機器碼當Debugger資訊不足,Crash Dump資訊不完全時 在Register和Assembly中挖掘資訊,以拼湊問題點夜路走多總會碰到鬼,C++寫多總會弄錯指標 使用更高階的語言實作High Level Logic? 讓VM與GC讓你解決這些問題 但你會碰到其他問題....
  32. 32. Any Question?

×