---
# System prepended metadata

title: Reverse Class 3
tags: [CTF]

---

# Reverse Class 3


## IDA小知識
* ALT + M : 可標註 mark
* Ctrl + M : 可查看 mark
* structure 結構 Ctrl + R：可更改 address 顯示方式，可透過 RVA 直接到該位置

## Structured Exception Handling (SEH in x86-64)
* 微軟在 C/C++ 上的擴充功能，用來處理 Exception
* 在x86 和 x86-64上不同
* 透過查看 UNWIND_INFO 定義 SCOPE_RECORD
    * SCOPE_RECORD
        * BeginAddress
        * EndAddress
        * HandlerAddress
            * -1 : 恢復 context，回到觸發 exception 的地方繼續執行
            * 0 : FINALLYHANDLER -> continue，不執行 handler
            * 1 : 為 try-except，執行 handler
        * JumpTarget
![](https://i.imgur.com/rbQbg3p.png)

## Base Relocation
* 若相同的 image 被 load 到同一個 ImageBase，則需要做 Relocation
  ![](https://i.imgur.com/gOd10WC.png)
* Demo
![](https://i.imgur.com/2YXni28.png)

## Asynchronous Procedure Call(APC)

## TLS Callback
* thread 會在 `entry point 之前`執行的 callback function
  AKA 在執行 main 之前呼叫
  ![](https://i.imgur.com/nbOG1zR.png)
  
## 工具介紹
* [System Informer(LATEST) (Process Hacker(OLDEST))](https://github.com/winsiderss/systeminformer)
    * 功能較多之`工作管理員`
* [API Monitor](http://www.rohitab.com/apimonitor)
    * 可觀察 API 之呼叫資訊
        * Call stack
        * Parameter
        * 設定斷點


## Process Injection
* 將程式碼注入目標 Process 中，讓其作一些事情，常被惡意程式用來隱藏 payload
* Injection 手法
    * DLL Injection
        * Target : 
            1. 將 DLL 路徑注入目標 Process 的 memory 中
            2. 想辦法讓目標 Process 載入 dll 並執行 DLLMain
        * 如何取得 LoadLibrary 位置？
            * ALL Processes 的 kernel32.dll 在記憶體中的位置皆相同，而 LoadLibrary 會在 kernel32.dll 內部，因此 LoadLibrary 位置也是固定的 -> 從當前 Process 取
        * 常用 API : VirtualAlloc, WriteProcessMemory, GetModuleHandle, LoadLibrary,GetProcAddress, CreateRemoteThread
    * APC Injection
        * Target : 
            1. 不使用 CreateRemotedThread API 的注入方式，由於其實在太可疑
            2. 找一個很多 Thread 之 Process 作為注入目標，然後替所有 Thread 註冊 APC callback function，因 Thread 很多個，因此容易被執行，此作法偏向硬體層面
        * 常用 API : OpenProcess, VirtualAlloc, WriteProcessMemory, QueueUserAPC
    * [Early Bird APC Injection](https://www.youtube.com/watch?v=_sI76NLPMjI)
        * Target : Better than APC Injection，可穩定觸發 APC Callback，作法為自己建立一個 Thread，並在一開始幫其註冊 APC
        * 常用 API : VirtualAlloc, WriteProcessMemory, GetModuleHandle, LoadLibrary,GetProcAddress, QueueUserAPC
    * [Process Hollowing](https://github.com/adamhlt/Process-Hollowing)
        * Target : 建立一個正常的 Process，將其 Memory 改成實際想執行的程式
        * 常用 API : CreateProcess, VirtualAlloc, WriteProcessMemory,NtUnmapViewOfSection,NtQueryInformationProcess
    * Reflective DLL Injection
        * Target : 將 dll 寫入 Remote Process Memory，再寫入 RemoteLibraryLoader(載入dll，並執行 DLLMain)，並想辦法使其被執行



