狠狠撸

狠狠撸Share a Scribd company logo
Reverse Engineering
   逆向工程入門



         Y.C. Ling
   All Rights Reserved
        2010/09/24
Agenda

Part 1: 逆向工程入門
Part 2: 從組合語言到除錯
Part 1 分享內容

 中研院上課心得
 自由軟體技術充電站-「軟體除錯分析-C語言逆向入門」
   Website Link
軟體工程 V.S. 逆向工程

 軟體工程
   人 => 機器

 逆向工程
   機器 => 人?
逆向工程的應用

研究分析
  AV的最愛
  也是外掛的最愛
漏洞發掘
  黑盒
  白盒
軟體除錯
  我們有源始碼啊?
  鬼打牆時的最後一招
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
Machine Code
助记符号
分析方法

靜態分析
  IDA pro
  objdump
動態分析
  Ollydbg
  gdb
IA32 Assembly Language

 您懂組語?略懂略懂

 mov a, b
 lea a, b

 add a, b
 sub a, b

 inc a
 dec a
IA32 Assembly Language

 cmp a, b

 jmp addr
 je addr
 jne addr
 j?? addr

 push a
 pop a

 call addr
 ret
Example 1: Hello World

   Main Function
      Three arguments
      緊臨exit()?

Let's Demo....
Example 2: Function Call

     Calling Convention
        stdcall, cdecl: 參數由右至左推入堆疊
     Stack
        ESP: 堆疊頂端
        EBP: 堆疊底端
int sub(a, b) { return a-b; }
int result = sub(2, 1);
轉成組合語言....
push 1
push 2
call sub
mov result, eax

Demo Time!!
Example 3: If Condition

通常長的像....
cmp a, b
j?? addr

廢話不多說,直接看Demo....
Example 4: For Loop
 應該長的像....




 可是....編譯器會....




 甚至....唉....Demo吧....
Example 5: Password

 實戰題
 大約是CrackMe或WarGame最簡單難度
 Demo Demo Demo!!
只要有心....




  天才?世界上沒有那麼多天才啦
  前輩:
     逆向 = 經驗 + 耐心
     不懂破解,別妄談保護
  Just Try It!!
Just Try It
回家做作業啦
 看雪學院
    http://www.pediy.com/
 Wargame
    http://wargame.cs.nctu.edu.tw/
 Crackme
    Beware of Virus & Trojan
    Sandbox!!
        VMWare
        VirtualBox
NCTU Wargame
Introduction of Reverse Engineering
Any Question?
 還有Part 2....
Reverse Engineering
      Part 2
 從組合語言到除錯

         Y.C. Ling
   All Rights Reserved
        2010/09/24
從組合語言到除錯

核心精神
  了解你的C++ Code會被編譯成怎樣的機器碼

組合語言的低階知識,的確數次幫我找到很難找的問題
  但這招其實很難得用的出來
    投資報酬率低XD
    不是天天遇到需要看組語的鬼打牆Bug
      If so, 程式碼的品質太差了
    就算鬼打牆,也不一定能從組語看出端倪
從組合語言到除錯

常應用的場合:
  開啟Optimization造成Debugger資訊不完全
  Crash Dump資訊不完全時
  一行Code中有一連串的Function Call,不知道當在那個點

How to learn?
  沒有捷徑
  C++基本功
  Detail knowledge of C++ Compiler
  組合語言基本功
  Also helps in optimization

以「對失效指標物件呼叫Member Function」為例
靠腰,鬼打牆

void CPlayer::IncreaseHP(int iAmount)
{
  // Do a lot of work....
  m_iHP += iAmount; //有人問:當在這行是三小狀況?
}
m_pPlayer->IncreaseHP(10);

  Access Violation
  是m_pPlayer指標錯了嗎?
  那為什麼Call IncreaseHP時不會當?
您懂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才
   當?
Non-Virtual Function

m_pPlayer->IncreaseHP(10)

機器碼行為類似這樣
CPlayer::InvokeHP(m_pPlayer, 10);

組語長的像這樣
push 10
push m_pPlayer
call CPlayer::InvokeHP

呼叫時沒有存取m_pPlayer指向之內容!
所以呼叫時不會當機,而當在函數
Virtual Function

m_pPlayer->IncreaseHP(10)

組語行為像這樣
mov eax, m_pPlayer
mov eax, DWORD PTR[eax] #當機
add eax, offset
mov edx, DWORD PTR[eax]

push 10
push m_pPlayer

call edx

Virtual Function在被呼叫物件為null時,必定在呼叫時當機
Inline Function

沒有Function Call!?

m_pPlayer->IncreaseHP(10)
行為其實像
m_pPlayer->m_iHP += 10
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
                                                                         時當機。
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
結語
核心精神:
  了解你的C++ Code會被編譯成怎樣的機器碼
當Debugger資訊不足,Crash Dump資訊不完全時
  在Register和Assembly中挖掘資訊,以拼湊問題點

夜路走多總會碰到鬼,C++寫多總會弄錯指標
  使用更高階的語言實作High Level Logic?
  讓VM與GC讓你解決這些問題
    但你會碰到其他問題....
Any Question?

More Related Content

Introduction of Reverse Engineering