c - 如何创建两个具有相同md5的二进制文件
问题描述
在 seedlab 中,我试图以一种简单的方式创建两个二进制文件。我可以通过以下方式做到这一点:
在我的 C 文件中,我有两个包含 200 个“A”的数组
unsigned char a[200] = {0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41};
unsigned char b[200] ={0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41};
int main()
{
int i;
int flag = 1;
for(i=0;i<200;i++)
{
if(a[i] != b[I])
{
flag = 0;
}
if(flag)
{
printf("good");
}
else
{
printf("bad");
}
}
return 0;
}
然后我通过运行输出
gcc sample.c -o sample.out
根据这张图片的说明,我可以剪切前缀并生成两个具有相同 md5 但不同 128 字节区域(P 或 Q)的文件
基本上,使用 md5collgen 生成 128 字节区域:
md5collgen -p prefix -o out1.bin out2.bin
现在,我有两个二进制文件,它们的 p 和 q 不同,但 md5 相同。提取 p 和 q,并使用 cat 执行以下操作:
cat prefix p middle p end > prog1
cat prefix p middle q end > prog2
中间和结尾是我从 sample.out 文件中提取的部分。通过运行它们,我得到一个打印出“好”,而另一个打印出“坏”。但是 prog1 和 prog2 的 md5sum 是相同的。
我的问题是这种方法需要在 p 和 q 处进行字符串比较,以便我可以通过不同的打印输出来区分它们。
有没有其他方法可以创建两个二进制文件但不需要内存或字符串比较?我觉得这应该不难,但我不知道怎么做。
解决方案
推荐阅读
- python - 将@staticmethod 包装器用于魔术方法?
- python - 读写dataframe时如何保持原有的数据类型和格式?
- maven - Maven“找不到工件”的
当“mvn deploy”到 Gitlab 中的存储库时 - sumologic - Sumo Logic 随着时间的推移计算各种错误
- javascript - 我如何从文件夹中调用图像以及如何使用画布(javascript)绘制图像?
- javascript - 在单击事件完成之前防止执行其余功能
- javascript - Apex 蜡烛图未更新
- php - PHP中的表格需要对齐
- r - 在 R 中展平、追加和重新列出列表
- javascript - 客户端如何从任何域名服务器(如 api)与 WebSocket 服务器通信