华师大CTF逆向题分析之Draw It(Monster)

Draw It(Monster)

程序打开运行界面:

draw_it_1

查壳发现为UPX压缩壳,UPX壳代码是开源的,加壳脱壳是同一个程序。

draw_it_2

手脱ESP定律,或者往下找popad接着一个大跳可以直接到程序OEP。 手脱比较节省时间,但是有一些区段或者其它信息没法还原。

draw_it_3

脱壳之后用IDA分析来到程序消息处理函数找到关键位置:

draw_it_4

通过分析,程序取所画图片的连续相同的点的个数与cmp数据做对比, 猜测cmp数据为Flag相关数据,存储了Flag图片的一些信息,即bitmap方式连续相同的点的个数。 因为位图是24位,每个像素点用3位来存储,所以比较的时候需要乘3。

导出数据:

draw_it_5

进一步验证,将数据全部相加得到30000(50*600),确定了之前的分析。

编写Win32程序,解析数据:

int sum=0,cmp_i=0,
for(int i=0;i<50;i++)
{
	for(int j=0;j<600;j++)
	{
		sum++;
		if(sum < cmp[cmp_i])
		{
			if(  odd )
				SetPixel(hdc,j, 50-i,RGB(255,0,0));//BMP从上到下,从左到右存贮
		}
		else
		{
			sum = 0;
			odd = !odd;
			all+=cmp[cmp_i] ;
			cmp_i++;
			
		}

	}
}

可以得到结果:

draw_it_6

Comments