EasyRE

0x01

首先拿到一个exe执行程序,无壳,我们先运行一下,发现只要输入结果后就会退出,那看来是我们输入的不正确就会退出

由于是exe程序,所以我首先进行的是debug动态调试,因为有输入就会有与正确密码的对比,所以我先看看它的正确密码有没有进行加密算法加密

0x02

动态调试:

一、搜索字符串

我们看到有right,有pause,所以这个上面肯定有对比,然后我们可以在这个上面函数入口处下断,经过调试发现,这里的密码是被算法加密过的,所以无法直接看到。

二、跟进函数

进去主函数,是上图的这段代码,那么经过我的分析,我红色框部分是一个关键的部分,其实这段代码是一个逆序运算,下面会将我们输入的内容与放到这段寄存器中的内容进行对比,对比的结果直接影响到是跳到right还是退出程序,所以我们就需要好好看一下这段代码。这段代码的意思就是逆序,将一段内容给逆序了一下,所以这段实际上就是flag的逆序。这里我们可以看lea esi,dword ptr ss:[ebp+ecx-0x25] 这一行,这一行就是执行逆序之前的重要点,所以这个地址里存放的数据我们给取出来,然后进行逆序,得到flag。接下来我来说一下静态分析的方法。

0x03

我知道大多数人用ida进行分析的时候,肯定第一步就喜欢用F5,这里,其实如果这里直接F5,我们会错过在动态调试中看到的逆序算法,所以这道题考察我们的是汇编功底。所以,有时候我们会被ida“欺骗”,学会变通,学会把ida当工具而不是一键F5

这个图中我标了3个箭头,第一个箭头是说这段是关键代码,第二个箭头是说这个就是它进行逆序的算法程序,最后一个箭头是将输入值与一个值进行对比的过程。(但是这个值不是flag,因为我已经试过)

然后我们再F5写一下,看一下主函数的执行过程

箭头所指为对比的地方,我们双击过去看看

它就是把我框框里的东西进行了它那个函数中的算法,所以这里,我们给它逆运算一下,下面是我编写的脚本:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{

	char a[100] = { 0x78, 0x49, 0x72, 0x43, 0x6A, 0x7E, 0x3C, 0x72, 0x7C, 0x32, 0x74, 0x57, 0x73, 0x76, 0x33, 0x50, 0x74, 0x49, 0x7F, 0x7A, 0x6E, 0x64, 0x6B, 0x61 };
	char flag[25] = { 0 };
	for (int i = 0; i < 24; i++)
	{
		flag[i] += (a[23 - i] ^ 0x6) - 0x1;
	}
	printf("%s", flag);
	printf("\n");
	return 0;
}

运行结果:

得到flag。

posted @ 2020-06-03 21:44  怪味巧克力  阅读(217)  评论(0编辑  收藏  举报