逆向工程实验——pre3(reversing.kr写题)

reversing.kr写题
登陆网站http://reversing.kr 点击challenge选项 选一个题目完成。
PEPassword
首先拿到这道题的时候我们发现有两个exe文件,开始不太懂两个exe文件是什么意思,就对两个exe文件分别运行,然后运行结果如下所示:
运行Original.exe结果:
在这里插入图片描述

运行Packed.exe结果:
在这里插入图片描述

可以看出是要我们输入一串数据,那我们就首先对Packed.exe进行分析,看我们输入数据后会进行何种处理。将packed.exe拖入ida中进行分析,发现有四个函数,同时我们观察到这四个函数的起始位置分别是0x409009,0x4091d8,0x4091da,0x409200
在这里插入图片描述

再将packed.exe拖入OD中,分别对这四个函数进行下断点.
当我们输入一个数据以后会发现程序断在0x4091d8处,然后会对我们输入的数据进行一系列的处理
在这里插入图片描述

最后会将处理的结果进行返回,我们继续运行会发现返回之后会有一个比较的语句,处理之后的数据与0xe98f842a进行比较。
在这里插入图片描述

继续向下运行,然后进入到系统领空,之后按ctrl+f9执行到返回,我们这时会发现返回到了另一个比较的语句中,然后程序会跳转到0x409085处往下执行
在这里插入图片描述

我们发现接下来会循环执行GetMessageA ,TranslateMessage和DispatchMessageA函数,经过查阅发现GetMessage函数会从消息队列中取出来一个消息然后通过DispatchMessage将消息发给对应的窗口进行处理,所以这里如果一直陷入循环我们就要一直进行输入操作,就无法将程序继续运行下去,所以我们首先得跳出该循环,即ss:[ebp+0x402A3E]处的数据得不等于0才行,所以我们在IDA中用交叉引用的方式找到对ss:[ebp+0x402A3E]进行操作的代码:
在这里插入图片描述

发现有一处代码会对此内存进行加一操作,在OD里找到对应代码,发现上面的跳转是我们之前输入数据处理之后返回后的跳转。
在这里插入图片描述

为了使我们可以执行加一的操作,所以我们在0x4091a6处下断点,每一次执行到这里的时候将标志位改掉即可不进行跳转执行加一操作。
在这里插入图片描述

之后程序就不会再陷入对消息进行操作的循环中,从而可以继续向下执行。
接下来程序继续向下运行,会断在另一个函数中
在这里插入图片描述

在这个函数中我们会发现它使用了两个经过0x4091DA函数得到的两个数据分别存入eax和ebx中,并且对0x401000的数据进行了处理,主要表现是用eax对0x401000处往后的数据每四个字节进行了异或的操作,然后对ebx和eax进行了相应的改变。如此循环。
我们从Original.exe的名字中猜测Original.exe中的机器码应该是原始的机器码,而在Packed.exe中对0x401000进行处理后的数据应该要与Original.exe中的0x401000处的机器码相等,所以我们可以求出来eax的数据是Packed.exe中0x401000的数据0xb6e62e17和Orginal.exe中的0x401000处的数据0x014cec81进行异或,得到eax是0xb7aac296,由于不知道如何进行对ebx进行求解,所以我们进行暴力破解的方法得到ebx。
代码如下:

#include <stdio.h>
int globalebx;
int  GetEax(int eax1,int ebx1)
{
    
    
	int resulteax;
	_asm
	{
    
    
	mov eax,eax1
	mov ebx,ebx1
	mov cl,al
	rol ebx,cl
	xor eax,ebx
	mov cl,bh
	ror eax,cl
	add ebx,eax
	mov resulteax,eax
	mov globalebx,ebx
	}
	return resulteax;
}
int result1=0x5a5a7e05;
int result2=0x99c51d27;
int eax=0xb7aac296;
int main()
{
    
    
	/*int eax=0x99c5159e;
	int eax1=0x000008b9;
	printf("%x",eax^eax1);
	//int eax=b7aac296
	*/
	int ebx1=0;
	int flag=1;
	while(flag)
	{
    
    
		for(ebx1=0;ebx1<=0xffffffff;ebx1++)
		{
    
    
			if(GetEax(eax,ebx1)==result1)
			{
    
    
				if(GetEax(result1,globalebx)==result2)
				{
    
    
					printf("ebx is :%x\n",ebx1);
					break;
				}
		}
	}	
	}
	return 0;
}

得到ebx=0xc263a2cb:
在这里插入图片描述

然后将eax和ebx的值分别改为0xb7aac296和0xc263a2cb进行操作,即可得到如下图所示结果。
在这里插入图片描述

From_GHL2_!!

猜你喜欢

转载自blog.csdn.net/Onlyone_1314/article/details/109327766
今日推荐