實戰逆向RUST語言程式

蚁景网安实验室發表於2024-10-09

實戰為主,近日2024年羊城杯出了一道Rust編寫的題目,這裡將會以此題目為例,演示Rust逆向該如何去做。

題目名稱:sedRust_happyVm

題目內容:unhappy rust, happy vm

關於Rust逆向,其實就是看彙編,考驗選手的基礎逆向能力。在彙編程式碼面前,任何干擾都會成為擺設。

1、初步分析

64為程式,使用IDA 64開啟

image

透過字串定位分析點

image

image

現在我們知道 inputflag的長度大於 0x15

image

接下來在彙編層面下一個斷點,輸入假flag,去觀察相關暫存器的值

image

image

image

好像並沒有什麼內容

image

繼續單步 步過,直到發現下一個要注意的地方!

image

image

字串長度:0x28

【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

我們繼續單步步過跟蹤

image

開闢空間的時候,說明快到真正函式處理過程了。

image

image

image

image

2、分析加密流程

2.1 base64分割模組

這裡簡單將 3 位元組變成4位元組的操作,稱之為 base64分割模組

這裡舉個例子

輸入的:"111"
->二進位制字串 001100010011000100110001
經過base64分割模組
->001100 010011 000100 110001

image

發現程式執行完後正好是這樣的結果

image

2.2 組合

image

舉個例子:

假如分割之後的4位元組為:

0xC、0x13、0x4、0x31

那麼組合後的字串

rax = 0xC
rcx = 0x1300
edx = 0xB1130C18 

image

2.3 VM處理模組

image

發現func3 非常亂

並且頻繁呼叫sub_40A800()

image

發現這是一道VM型別的題,那麼VM的題加密應該會很簡單,基本是異或之類。

image

在 sub_40A800 裡面找到 異或,下斷點

image

image

image

image

這個al每經過兩次就是秘鑰

image

image

解題指令碼

int main() {
    //提取的密文
    unsigned char s1[] = { 0x00,0x82,0x11,0x92,0xa8,0x39,0x82,0x28,0x9a,0x61,0x58,0x8b,0xa2,0x43,0x68,0x89,0x4,0x8f,0xb0,0x43,0x49,0x3a,0x18,0x39,0x72,0xc,0xba,0x76,0x98,0x13,0x8b,0x46,0x33,0x2b,0x25,0xa2,0x8b,0x27,0xb7,0x61,0x7c,0x3f,0x58 };
    //提取的秘鑰
    unsigned char s2[] = { 0x18,0xb1,0x9,0xa4,0xa6,0x2a,0x9e,0x1b,0x96,0x57,0x5d,0xad,0xae,0x75,0x65,0xac,0x9,0x8c,0xa0,0x76,0x47,0x2c,0x10,0x1,0x7c,0xf,0xba,0x47,0x95,0x30,0x9b,0x74,0x3f,0x2d,0x2d,0x9a,0x87,0x31,0xba,0x43,0x70,0x2c,0x4c };
​
    unsigned char s3[128] = { 0 };
​
    for (int i = 0; i < 43; i++) {
        s3[i] = s1[i] ^ s2[i];
    }
    //還原base64分割模組
    char s4[128] = { 0 };
    int j = 0;
    for (int i = 0; i < 44; i += 4, j += 3) {
        s4[j] = (s3[i] << 2) | (s3[i + 1] >> 4);
        s4[j+1] = (s3[i+1] << 4) | (s3[i + 2] >> 2);
        s4[j+2] = (s3[i+2] << 6) | s3[i + 3];
​
    }
​
    printf("%s", s4);
  
    return 0;
}

更多網安技能的線上實操練習,請點選這裡>>

相關文章