Bingo图片逆向分析
1、题意分析:
此题题目叫做勾股定理,看来算法和这个应该是有关系的,附件下载下来是一个可爱的妹纸的图片,bingo.png,大小为1.82M,这么小一个图片,竟然有这么胖的体积,肯定不正常,里面包含了文件了。用winhex打开一看,PNG头图片文件,简单的拖了一下,有2大段EE和22的数据,感觉嫌疑比较大隐藏文件在其中。
2、提取EXE文件:
既然是有PNG文件,那么PNG文件结尾是啥,百度一下看看
49454E44AE426082结束,winhex里面查找一下看看,果然发现了,后面带送了一个MZ打头的文件,哈哈,不就是一个EXE文件头吗?看来有戏
把MZ开始的地址 188748开始到最后复制出来,生成一个exe文件,看看。
3、修复PE头文件:
生成出来的EXE文件是无法执行的,但是DOS却可以执行。在DOSBOX下执行结果是一个勾股定理的公式。这个提示应该不可能是FLAG,完全没有卵用。
看来要修复PE头文件,使用LOADPE打开发现是无效的头文件,看来病的不清,要动大手术了。
查看PE头文件资料得知,
000000E8,是指向PE头的,查看一下E8,发现E8是空的,原来改掉了啊,我勒个去,手工加上看看,
填充5045 PE字样,MAGIC字符,
吆西,可以执行了,但出来的是黑框,直接跳掉,太可怕了,咋整。
4、看来EXE本体也病的不清,OD载入看看,发现有壳的痕迹,点确定继续
入口点在44D000,执行后直接退出,这里花了不少时间分析,
执行到这一句就挂了,发现。
经过N次分析后发现,这个XOR应该是再解压缩壳,但是这个段代码没有写全,尝试补全,刚开始被
0044D017 - E9 C4BBFBFF jmp 1.00408BE0
这个误导了,以为入口地址OEP不对而已,走了不少弯路。
我们再回到刚才的EE和22大段的地方,还记得不? 联系起来一想,我们很快就能发现,这小子在还原代码呀,我们再看一下代码段,是不是对上了,
我在看一下WINHEX,
发现应该是EE为XOR的加密代码,直接写代码还原吧。(截图错了,应该是 Xor byte ptr ds:[ebx],0xEE)
最终大致是这样的结果。
发现可以执行了。
毕达哥拉斯到底说了什么,我很好奇!!百度了一下,这个东西,以为是怪兽呢,原来是一个数学家,反正也不认真。直接IDA开干。(这个地方忘了,建议先脱壳一下。)
5、勾股定理算法:
拖入IDA,F5,代码很简单,但是没有FLAG,发现了和一个特殊字符串比较,难道这个就是FLAG,"zaciWjV!Xm[_XSqeThmegndq",可惜不是,我尝试提交,错了。哈哈
看来还得搞算法,方法到是看着很简单,还原起来不太好弄,还有+0.5是什么鬼,难道IDA搞错了。先分析一下,果然是2个POW,勾股定理啊,到时候很符合题意。
v0 = sub_401005(&v2, 52);
6、编写逆向算法:
本人水平很烂,花了不少时间,终于写出来了,其中就是0.5想了半天,不知何意,猜测多次后,成功了,过程也是蛮简单的。直接用C写了一个:
#include <stdio.h>#include <string.h>#include <cmath>int main()
{ char str1[] = "zaciWjV!Xm[_XSqeThmegndq"; int v7 = strlen(str1); char v6[25] = { '\0' }; memset(v6, 0, v7 + 1); int c = 52 - v7+1; //_strrev(str1);
for (int i =0; i < v7; i++)
{ //_strrev(str1);
char tmp = str1[0];
_strrev(str1);
str1[v7 - 1 - i] = '\0';
int y = pow(c, 2.0); int z = pow((double)tmp,2.0) + y; int zz = int((double)sqrt(z)+0.5);
v6[v7 - 1 - i] = zz;
c++;
} printf("The reverse string of str1 is: %s\n", v6);
}
跑出结果:
7、总结:
整个分析花一整天,也是学习到了不少基础知识。这个涉及的逆向知识还挺多的,记录一下。
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
最后于 2021-6-25 20:58
被yiting编辑
,原因: 附件重新上传