Draw It(Monster)
程序打开运行界面:
查壳发现为UPX压缩壳,UPX壳代码是开源的,加壳脱壳是同一个程序。
手脱ESP定律,或者往下找popad接着一个大跳可以直接到程序OEP。 手脱比较节省时间,但是有一些区段或者其它信息没法还原。
脱壳之后用IDA分析来到程序消息处理函数找到关键位置:
通过分析,程序取所画图片的连续相同的点的个数与cmp数据做对比, 猜测cmp数据为Flag相关数据,存储了Flag图片的一些信息,即bitmap方式连续相同的点的个数。 因为位图是24位,每个像素点用3位来存储,所以比较的时候需要乘3。
导出数据:
进一步验证,将数据全部相加得到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++;
}
}
}
可以得到结果:
Comments