欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]关于MD5碰撞

[原创]关于MD5碰撞

很早之前王小云教授提出了一种方法,可以在已知原文的情况下构造出另一个跟原文MD5值相同的串。并且该计算过程所消耗的时间是有限的、可计算的。
     但是,要利用此方法达成某种啥啥的目的是困难无比的。原因就是你无法确定新构造出来的串符合你的预期。这么说比较绕口,说得俗一点:你可以将某个文件的MD5值弄的跟kernel32.dll的完全一样。但是你却无法让这个文件包含你所希望的某种功能。这个文件刚好是完整可运行的PE文件的概率都非常低,不过我也见过这种样本。。。
     但是要通过碰撞实现程序A跟程序B的MD5值完全相同,但运行结果是完全不同,却是非常容易的,这个我也在网上看到过例子,但不知道有没有人公布这个方法,今天就在这里说一种简单的方法。。。关于这玩意到底有没有实际意义,就看各位的思路淫不**了。
     国外公布过一个碰撞程序fastcoll_v1.0.0.5,可以在一个文件的基础上生成两个MD5相同的文件,查看下这个两个MD5相同的文件,会发现只是在文件末尾添加了一些不同二进制数据,那么。。。根据其中某个不同的字节,来使我们的程序跳转的不同的流程执行,就可以实现程序A跟程序B的MD5值完全相同,但运行结果却是完全不同,估计各位看到这里都笑了,代码其实还是写死的。
    给一段代码:

	char szModule[MAX_PATH] = {0};
	GetModuleFileNameA(NULL,szModule,MAX_PATH);
	FILE *fp = fopen(szModule,"rb");
	if(fp == NULL)
	{
		return FALSE;
	}
	fseek(fp, -109, SEEK_END);
	BYTE bRead;
	size_t len = fread(&bRead, sizeof(bRead), 1, fp);
	fclose(fp);
	if ((bRead+0x80)>0xff)
	{
		SetWindowText(_T("木马程序"));	
		SetDlgItemText(IDC_STATIC,_T("这是木马!!!"));
	}
	else
	{
		SetWindowText(_T("正常程序"));
		SetDlgItemText(IDC_STATIC,_T("这是正常程序。"));		
	}


可以看出是根据自己碰撞后文件的倒数第109字节+0x80是否大于0xff来执行不同的流程的,关于为什么这样比较大家可以参考下fastcoll_v1.0.0.5的源码和其生成的程序,其实还是有好几个字节可以拿来区分的。
fastcoll_v1.0.0.5_source and release.rar
测试程序.rar

上传的附件 test.jpg
fastcoll_v1.0.0.5_source and release.rar
测试程序.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功