逆向工程實驗Pre2

讚賞碼 & 聯繫方式 & 個人閒話

逆向工程前言

 Pre2

1(一定要看)閱讀使用OllyDbg從零開始Cracking

如果要搞32位windows下用戶態逆向,OD一定要熟練使用,今天看不完未來幾天繼續看https://www.52pojie.cn/thread-338571-1-1.html

OLLYDBG將IDA與SoftICE的調試解密思想結合起來,成爲當今最爲流行的一種動態調試解密工具,同時因爲其支持插件擴展的功能,已成爲目前最強大的調試工具。OllyDbg是我們進行Cracking軟件破解強有力的輔助工具,將被調試程序的反彙編代碼顯示在反彙編窗口,我們可以藉助寄存器窗口、數據窗口、堆棧窗口、信息窗口對被調試程序進行全面細緻地分析以達到最終破解的目標。

 

2、閱讀 ELF文件格式分析:

https://www.cnblogs.com/brotherlittlefish/p/5557476.html

https://blog.csdn.net/feglass/article/details/51469511

ELF(Executable and Linkable Format)表示可執行連接格式,ELF格式的文件用於存儲Linux程序。ELF文件格式主要三種:可重定向文件、可執行文件以及共享目標文件。ELF文件一般會包含3個重要的索引表:ELF header、Program header table以及Section header table,我們常常需要藉助索引表實現讀取程序各個segment和section的過程。需要注意的是ELF header是用來描述整個文件的組織,而Program header table是用來描述文件中的segment,告訴系統如何創建進程映像的。segment是從運行的角度來描述ELF文件,而section是從鏈接的角度來描述ELF文件。section段是ELF文件的核心,主要包括機器直接執行的代碼指令、變量和常量所在的數據段、符號表字符串表重定位表等信息。

 

3、閱讀下面這兩篇文章:

https://blog.csdn.net/s1054436218/article/details/71698904

https://blog.csdn.net/s1054436218/article/details/71809403

文章介紹了在進行逆向工程分析時需要注意的關鍵點,並提供了進行逆向分析時的合理化思路。在進行逆向工程分析時首先要了解的是將要破解的程序是由哪種語言編寫的,有沒有加殼(殼可以理解爲對程序的加密使逆向人員難以看到源碼)即有沒有對源程序進行加密。有兩個軟件是我們在進行逆向分析時實用且高效的輔助工具:PEID和IDA。PEID的作用就是查看一個PE文件是由什麼語言編寫的,通過文章給出的實例可以看出:啓動PEID查看文件時在EP Section屬性欄中我們可以看到文件是否加密以及加密的類型。而IDA是一款十分優秀的靜態反彙編軟件,不僅可以清楚的查看程序所用到的各個函數的彙編源碼,還可以在彙編的基礎上將彙編語言解釋爲C/C++以便逆向人員來理解。綜上所述,破解逆向題目首先要觀察程序的特徵,並根據這些特徵推測函數的邏輯和關鍵函數,而關鍵函數往往是破解整個題目的突破口。然後再利用PEID以及IDA對題目源碼進行分析,最終反向推得結果。

 

4、cipher text  {920139713,19}

704796792

752211152

274704164

18414022

368270835

483295235

263072905

459788476

483295235

459788476

663551792

475206804

459788476

428313374

475206804

459788476

425392137

704796792

458265677

341524652

483295235

534149509

425392137

428313374

425392137

341524652

458265677

263072905

483295235

828509797

341524652

425392137

475206804

428313374

483295235

475206804

459788476

306220148

 

Step 1: 求模數的歐拉函數值

模數爲920139713,通過大數分解找出它的兩個互質的因子p和q。(p-1)(q-1)的值即爲模數的歐拉函數值φ(n)。

Step 2: 求私鑰

根據e×d=1(modφ(n)),其中e爲公鑰,d爲私鑰,φ(n)爲模數的歐拉函數。根據擴展的歐幾里得算法求得私鑰的值d,即私鑰爲公鑰模φ(n)的逆。

Step 3: 解密

根據公式M=C^d(mod n)解密,其中M爲明文,C爲密文,d爲私鑰。然後將解密得到的數字轉化爲相應的字符,即爲最終求得的明文。

解密代碼如下:

#include<stdio.h>

// 三元組gcd(a, b) == ax + by == d;
struct gcdstruct {
	int d;
	int x;
	int y;
};

//輾轉相除法求模下的逆元
struct gcdstruct EXTENDED_EUCLID(int a, int b)
{
	struct gcdstruct aa, bb;
	if (b == 0) {
		aa.d = a;
		aa.x = 1;
		aa.y = 0;
		return aa;
	}
	else {
		bb = EXTENDED_EUCLID(b, a % b);
		aa.d = bb.d;
		aa.x = bb.y;
		aa.y = bb.x - bb.y * (a / b);
	}
	return aa;
}


long inverse(long a, long m)
{
	long x;
	struct gcdstruct aa;
	aa = EXTENDED_EUCLID(a, m);
	if (aa.x < 0)
		aa.x += m;
	return aa.x;

}


//求x的y次方(在模num下)
long long Epow(long long x, long long y, long long num) {
	long long i, tmp = x;
	for (i = 0; i < y - 1; i++) {
		x = (x * tmp) % num;
	}
	return x;
}


int main() {
	int num = 2;
	printf("大整數分解:");
	while (num < 920139713) {   //大整數分解
		if (920139713 % num == 0) {
			printf("p=%d q=%d φ(n)=%d\n", num, 920139713 / num, (num - 1) * (920139713 / num - 1));
			break;
		}
		num = num + 1;
	}


	long int fn = (num - 1) * (920139713 / num - 1);  //φ(n) = (p-1)(q-1)
	long int e = 19;  //公鑰
	long int d;    //私鑰
	d = inverse(e, fn);
	printf("\n私鑰:%ld\n", d);
	
	long long n = 920139713;
	long long c[] = { 704796792,752211152,274704164,18414022,368270835,483295235,263072905,459788476,483295235,459788476,663551792,475206804,459788476,428313374,475206804,459788476,25392137,704796792,458265677,341524652,483295235,534149509,425392137,428313374,425392137,341524652,458265677,263072905,483295235,828509797,341524652,425392137,475206804,428313374,483295235,475206804,459788476,306220148};


	int i, len;
	len = sizeof(c) / sizeof(c[0]);

	printf("\n明文:");
	for (i = 0; i < len; i++) {  //解密
		printf("%c", Epow(c[i], d, n));
	}


}

運行結果:

輸出內容:

明文:flag{13212je2ue28fy71w8u87y31r78eu1e2}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章