看到csdn中一篇文章:http://blog.csdn.net/fisher_jiang/article/details/6783922,該文章使用動态調試進行破解找到密碼。由于自己對linux不熟悉需要學習段時間,就使用ida靜态反彙編進行逆向。
要破解的檔案連結:hackme
1、運作該程式,檢視運作效果:
運作之後螢幕列印出:Password,Please?
随便輸入字元串:123、111
可以确認錯誤提示為:Oops..
2、根據以上執行邏輯,我們可以判斷輸入密碼前面的邏輯為顯示字元串“Password,Please?”,通過快捷鍵"Alt + T" 搜尋字元串"please",如下圖:
搜尋結果如下圖:
3、查找對變量aPasswordPlease的引用,使用快捷鍵"Ctrl + x",如下圖:
如上圖隻有一處引用,輕按兩下改行跳轉調用處,如下圖:
為了友善檢視代碼邏輯,光标放到該行之後按空格鍵跳轉到ida調用邏輯圖,如下圖所示:
檢視這個調用圖可以分析函數sub_8048591()就是判斷密碼是否正确。
4、為了能夠更友善分析代碼,點選tab鍵切換到僞代碼視窗,如下圖所示。
通過以上僞代碼可以分析代碼邏輯:
(1) v10儲存輸入字元數組;
(2) byte_804869c為校驗字元串,如下圖:
(3) 随機10次選取一個位置index,進行index+1次的1828812941 * v4 + 12345運算,元算結果與輸入數組中的index位進行異或運算,運算結果與byte_804869c中index對應元素對比,不同則失敗。
5、通過的邏輯分析,寫一個程式計算出密碼。邏輯如下:
#include <stdlib.h>
#include <stdio.h>
void test()
{
char check_array[] = {
0x6A, 0xFB, 0x4C, 0x8D,
0x58, 0x0F, 0xD4, 0xE8,
0x94, 0x98, 0xEE, 0x6B,
0x18, 0x30, 0xE0, 0x55,
0xC5, 0x28, 0x0E, 0x90
};
char input[124] = { 0 };
__int32 index = 0;
int count = 19;
char v5;
int v9;
int v7;
do {
int v4 = 0;
v5 = check_array[index];
v7 = 0;
while (v7 < index + 1)
{
++v7;
v4 = 1828812941 * v4 + 12345;
}
printf("%c", ((unsigned __int8)v5 ^ (unsigned __int8)v4));
} while (index++ < 19);
}
int main()
{
test();
return 0;
}
運作結果如下圖所示:
6、校驗密碼是否為"SesameOpenYourself!",結果如下圖所示:
總結:破解密碼用的關鍵思想是:
a = b^c
b = a^c
c = a^b