Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reverse Engineering - 2

LJP-TW
January 20, 2022

Reverse Engineering - 2

NYCU Secure Programming 2021 Fall

LJP-TW

January 20, 2022
Tweet

More Decks by LJP-TW

Other Decks in Technology

Transcript

  1. # whoami • LJP / LJP-TW • SQLab @ NYCU

    碩一 • CTF @ 10sec / TSJ • Pwner 2
  2. Outline • Tools • Where to start • Address Space

    • Speed-up 3 • DLL • PE Format • IAT • EAT • PEB
  3. Tools - x64dbg • 常用快捷鍵 • F2: 設定中斷點 • F9:

    繼續執行 • F8: 步過 • F7: 步入 • Ctrl+F9: 執行到 ret • Ctrl+G: goto • Space: 組譯 10
  4. Tools - x64dbg • 常用功能 • 呼叫堆疊 (call stack) •

    記憶體映射 (memory mapping) • … 13
  5. Speed up • socket, connect, recv, send • 網路連線 •

    CreateService, RegCreateKeyEx • 猜測在嘗試持久化程式執行 • CryptEncrypt, CryptDecrypt • 加解密 27 Ref: https://book.hacktricks.xyz/reversing/common-api-used-in-malware
  6. Speed up • VirtualAlloc, VirtualProtect, CreateRemoteThread, CreateProcess, ResumeThread • 惡意程式愛用的

    API 28 Ref: https://book.hacktricks.xyz/reversing/common-api-used-in-malware
  7. Speed up • RegisterClass 家族 • MFC application 用來註冊 window

    class 的 API 29 Ref: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerclassw
  8. Speed up • RegisterClass 家族 • MFC application 用來註冊 window

    class 的 API 30 Ref: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerclassw Callback function
  9. DLL • DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) •

    會在各種時機呼叫到 (e.g. 剛載入時, 要卸載時) • 可以設定, 也可以不設定 41
  10. PE format 48 • 再來是 NT Hdr (或稱 PE Hdr)

    • 其包含了 • COFF Hdr (或稱 File Hdr)
  11. PE format 49 • 再來是 NT Hdr (或稱 PE Hdr)

    • 其包含了 • COFF Hdr (或稱 File Hdr) • Optional Hdr
  12. PE format 51 PE Hdr 以 “PE” 開頭 紀錄有幾個 sections

    紀錄 Optional Hdr 多大 紀錄有哪些特殊設定
  13. PE format 55 • 解釋一下 RVA (Relative Virtual Address) •

    首先先直接展示一個程式在跑的時候, 記憶體位址的樣子
  14. VA RVA 58 • 解釋 RVA (Relative Virtual Address) 之前

    • 先解釋什麼是 VA (Virtual Address) • 做一下小實驗, 如果執行兩個 hello.exe, 記憶體位址分布長怎樣?
  15. VA RVA 59 • 兩個 process 的記憶體位址有重疊耶?! • 如果改掉 A

    process 記憶體內容 (地址重疊的部分), B process 的 內容也會被改嗎? • 實驗一下, 答案是不會的 • 所以那個記憶體位址到底是啥
  16. VA RVA 61 • 那為什麼要這麼複雜? • 如果程式都能直接碰到實體記憶體位址 PA (Physical Address)

    • 你要怎麼知道這個 PA 有沒有被其他程式占用? • 這個問題很難, 但現代 OS 幫你搞定了這個問題 • OS 只給你 VA, 實際上存取時, OS 有他的方式, 能夠 VA <-> PA
  17. VA RVA 62 • 正常狀況下 A process 的 0x55665566 VA

    • 跟 B process 的 0x55665566 VA • 不是對應到同一個 PA • 解釋了剛剛的實驗結果
  18. VA RVA 63 • 搞懂 VA 了, 可以講 RVA 了

    • 只是一個方便 PE 結構不用寫這麼多字的東西 • VA = ImageBase + RVA • 第一條指令位址 VA = ImageBase + Entry point RVA
  19. ASLR 65 • 可是實驗中, 我們的第一條指令位址顯然不是剛算的 • 原因是 ASLR (Address Space

    Layout Randomization) • 記憶體位址每次執行時都是固定的話, 會有安全問題 • 啟用了 ASLR, OS 就會隨機產生 ImageBase, 原本提供的 ImageBase 就被忽略了 QQ
  20. ASLR 66 • 第一條指令位址 VA = ASLR 隨機產生的 ImageBase +

    進入點 RVA • 那麼要怎麼知道 ASLR 有沒有開啟呢?
  21. PE format 71 • Section Hdr • 在右邊的圖是對應 Section Table

    • 其實會有多個 Section Hdr • 用 PE-Bear 來展示一下
  22. PE format 74 • 解釋一下 Section Hdr • 程式檔案的 Raw

    Addr 開始的 Raw size 個 Bytes 會映射到 Virtual Addr 開始的 Virtual Size 個 Bytes • Virtual Addr 是 RVA • Characteristics 設定了該區記憶體位址的權限
  23. 101

  24. PEB • 取得 PEB • 32bit • FS:[0x30] • 64bit

    • GS:[0x60] 102 Ref: https://en.wikipedia.org/wiki/Win32_Thread_Information_Block
  25. PEB • 一直順著 linked list 爬下去 • 檢查 BaseDllName 是否為想用的模組

    (dll / exe) • 通過 DllBase 取得該模組的 base address • 解析在 base address 的 PE format, 從 EAT 爬到想用的 API • Manual Symbol Resolution! 112