iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0
Security

我逆向你逆向我的逆向工程膩系列 第 30

Dx30 - 更多的 SEH 反逆向技術

  • 分享至 

  • xImage
  •  

今天是30天,很開心地可以完賽了。不過在結束之前我想我得把更多的動態反逆向技術帶給大家,那就開始今天的主題吧

此次的程式與原始碼都放在 :
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx30

SEH

這次還是會介紹兩個有關於 SEH 機制下的反逆向技術。

Trap Flag

篇章開始的時候有介紹過不同暫存器的功能,而這次要用到的是陷阱標誌( 下圖 TF,第九個位置,Index=8 )。

https://ithelp.ithome.com.tw/upload/images/20221014/20135675P4vp6MNA4W.png

TF 被設為 1 的時候,CPU 會進入逐步執行模式。此時每執行一次指令,都會拋出 EXCEPTION_SINGLE_STEP 例外,然後 TF 會自動歸零。雖然他無法被應用程式修改,不過還是可以用 Stack 的方式改變。

這個方法可以與上一篇的 SEH ( 例外處裡 ) 方法結合來探測 Debugger。

那這次就直接來示範本方法的範例 :

#include <iostream>
#include <Windows.h>
void foundDebugger() {
    MessageBox(0, L"Found Debugger", L"TF", 0);
}
int main()
{
    printf("Start\n");
    __asm {
        // 設定 SEH
        push handler
        push DWORD ptr fs : [0]
        mov DWORD ptr fs : [0] , esp

        // 由於無法直接設置 TF,所以把 EFLAGS 抓出來後把第 9 bit 設為 1 再存進 EFLAGS
        pushfd
        // 0x100=100000000b
        or dword ptr ss : [esp] , 0x100
        popfd

        // 這邊會觸發 TF 引發例外拋出。
        nop

        // 若是例外被處裡或是使用單步模式,就會跑來這邊。
        call foundDebugger
        mov eax, 0xFFFFFFFF
        jmp eax

        // 例外處裡器
    handler :
        mov eax, dword ptr ss : [esp + 0xc]
        mov dword ptr ds : [eax + 0xb8] , offset normal_code
        xor eax, eax
        retn

        // 移除 SEH
        normal_code :
        pop dword ptr fs : [0]
        add esp, 4

    }
    MessageBox(0, L"SAVE", L"TF", 0);
}

用 ollyDbg 嘗試以 F9 直接執行程式,就可以看到當成是運行到 NOP 的時候就會觸發 Trap Flag 引發暫停。然後執行 call foundDebugger()JMP 0xFFFFFFFF 導致非法存取。

https://ithelp.ithome.com.tw/upload/images/20221014/201356753GIV0fl18m.png

INT 2D

這個東西是用來在 kernel mode 來拋出例外的指令,若是一般運行的話也會拋出例外;但特別的是在反編譯中會自動把下一條指令忽略掉。所以可以在這的地方插入一些可以判別編譯器的指令。

#include <iostream>
#include <Windows.h>
void foundDebugger() {
    MessageBox(0, L"Found Debugger", L"TF", 0);
}
int main()
{
    __asm {
        // 載入 SEH
        push handler
        push DWORD ptr fs : [0]
        mov DWORD ptr fs : [0] , esp

        // 觸發例外
        int 0x2d

        // 如果執行這行會使 EAX 變成 1
        mov EAX, 0x1
 
        // SEH 後確認 EAX 的值
     Continue:
        cmp EAX,0x0
        je normal_code

        // 發現 Debuger
        call foundDebugger
        mov eax,0xFFFFFFFF
        jmp eax 
        
     handler :
        // 處裡例外
        mov eax, dword ptr ss : [esp + 0xc]
        mov dword ptr ds : [eax + 0xb8] , offset Continue
        xor eax,eax  // 設定 EAX=0
        retn

    normal_code :
        // 移除 SEH
        pop dword ptr fs : [0]
        add esp, 4
       
    }
    printf("SAVE\n");
    return 0;
}

這份程式如果使用 ollyDbg 會直接在觸發 INT 2D 的地方卡死,所以使用了 Visual Studio 的 Debug 工具來執行。可以看見 EAX 被設為 1 無法通過分支指令的檢查,故被確認出運行在 Debugger 下。

https://ithelp.ithome.com.tw/upload/images/20221014/20135675UsaQRttpYH.png


這次的文章就到這邊 \OwO/ 謝謝大家

若是有錯誤或是問題可以透過 iThome 或是以下聯絡方式聯絡我 :

E-mail :

ton200168@gmail.com

connection@dinlon5566.com


上一篇
Dx29 - 動態反逆向技術
下一篇
DxFF - 逆向的路,正向的夢
系列文
我逆向你逆向我的逆向工程膩31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言