目的:主要是想學習一下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中執行上面的代碼,就能夠得到正確的輸入了。

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