天天看點

靜态逆向簡單的ELF

看到csdn中一篇文章:http://blog.csdn.net/fisher_jiang/article/details/6783922,該文章使用動态調試進行破解找到密碼。由于自己對linux不熟悉需要學習段時間,就使用ida靜态反彙編進行逆向。

要破解的檔案連結:hackme

1、運作該程式,檢視運作效果:

靜态逆向簡單的ELF

運作之後螢幕列印出:Password,Please?

随便輸入字元串:123、111

可以确認錯誤提示為:Oops..

2、根據以上執行邏輯,我們可以判斷輸入密碼前面的邏輯為顯示字元串“Password,Please?”,通過快捷鍵"Alt + T" 搜尋字元串"please",如下圖:

靜态逆向簡單的ELF

搜尋結果如下圖:

靜态逆向簡單的ELF

3、查找對變量aPasswordPlease的引用,使用快捷鍵"Ctrl + x",如下圖:

靜态逆向簡單的ELF

如上圖隻有一處引用,輕按兩下改行跳轉調用處,如下圖:

靜态逆向簡單的ELF

為了友善檢視代碼邏輯,光标放到該行之後按空格鍵跳轉到ida調用邏輯圖,如下圖所示:

靜态逆向簡單的ELF
靜态逆向簡單的ELF

檢視這個調用圖可以分析函數sub_8048591()就是判斷密碼是否正确。

4、為了能夠更友善分析代碼,點選tab鍵切換到僞代碼視窗,如下圖所示。

靜态逆向簡單的ELF

通過以上僞代碼可以分析代碼邏輯:

(1) v10儲存輸入字元數組;

(2) byte_804869c為校驗字元串,如下圖:

靜态逆向簡單的ELF

(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;
}
           

運作結果如下圖所示:

靜态逆向簡單的ELF

6、校驗密碼是否為"SesameOpenYourself!",結果如下圖所示:

靜态逆向簡單的ELF

總結:破解密碼用的關鍵思想是:

a = b^c

b = a^c

c = a^b

繼續閱讀