逆向工程实验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}

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