IDA的腳本IDC的一個簡單使用


目的:主要是想學習一下IDA的IDC的腳本的使用。這里做了一個小的測試。

這里使用的是VS2015Community來生成文件的。

 

一、編寫測試程序:

這里先生成我們的目標數據。

然后編寫測試程序。得到下面的代碼。

#include <stdio.h>
#include <string.h>
//the xor key is 'B' ,異或的key

int Verify(char *Flag) {
    int i;
    int tar[10] = { 00, 43, 44, 29, 14, 47, 47, 10, 29, 1 }; //這里是關鍵數據
    for (i = 0; i < 10; i++) {
        if (Flag[i] != tar[i]) {
            printf("You are wrong\n"); //錯誤提示
            return -1;
        }
    }
    printf("Congratulations...\n");
    return 0;
}

int main(int argc, char *argv[]) {
    int i;
    char flag[11] = "\0";
    scanf_s("%s", flag, sizeof(flag));//輸入的flag
    printf("%s\n", flag);
    for (i = 0; i < 10; i++) {
        flag[i] = flag[i] ^ 66; //將輸入異或
    }
    Verify(flag);//調用檢測函數
    return 0;
}

我們這里生成了一個release版本的32程序,然后我們使用IDA打開這個程序。得到下面的圖片

從上面的圖片我們可以看到整個程序的流程,其中這里用到了xmm0這個寄存器,這個寄存器用來每次將我們的4個雙字(16個字節)的數據傳到ebp+var_38這個地址里,

我們看到每次xmm0傳遞了16個字節,一共傳遞了2次,也就是8個int類型的數據,然后還有mov     [ebp+var_18], 1Dh  和mov     [ebp+var_14], 1

將我們關鍵數據最終賦值完成,接下來就是循環的比較了,看到上面這么多的異或,我們也能明白這就是一個簡單的異或,這里我們看到關鍵的異或是0x42 == 66 == 'B'

所以我們要找到關鍵數據的地址,然后將目標字符串和0x42異或之后,就能夠得到正確的輸入了。

我們看到了關鍵的8個int數據了,還有之前的2個數據,一共就是我們的10個關鍵數據了。我們看到圖里是先對xmmword_402150先傳遞的,且WIN8.1使用的是

小端序。

所以我們得到兩個關鍵數據的地址,from1 = 0x402150, from2 = 0x402140和最后的連個0x1D和0x01

所以我們編寫了一個IDC,在IDC命令行下執行,最終得到我們的正確輸入了。

auto from1 = 0x00402150;
auto from2 = 0x00402140;
auto i, x;

for(i = 0; i < 4; i++){
    x = Dword(from1);          //Dwrod函數是從from1這個地址取出4個字節的數據,還有Word和Byte這兩個函數分別從指定地址取出字數據和字節數據
    Message("%s", x ^ 0x42); //IDA的IDC中的Message函數和C的printf差不多,都是向終端輸出結果
    from1 = from1 + 4;
}
for(i = 0; i < 4; i++){
    x = Dword(from2);
    Message("%s", x ^ 0x42);
    from2 = from2 + 4;
}
Message("%s", 0x1D^0x42);
Message("%s", 0x01^0x42);

然后在IDA的FILE中的Script command中執行上面的代碼,就能夠得到正確的輸入了。

 

這個只是一個簡單的測試,好好學習,天天向上!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM