20211128李杰—— MD5哈希长度延展攻击
任务描述:
在一个使用MD5哈希算法的系统中,管理员使用了一个密钥k和命令cmd的组合来生成每个命令的签名:hash(k||cmd)。你已经获得了一个允许查看文件的命令cmd=viewfile和对应的签名h,但你希望通过哈希长度延展攻击,生成一个新的签名,该签名能够让你执行删除文件的命令(删除文件的命令为rm)。
具体步骤:
- 研究MD5哈希长度延展攻击的机制,并找出适用于此场景的攻击方法。(3分)
- 使用合适的工具或脚本,基于cmd=viewfile和签名h,构造一个新的命令cmd=viewfile||padding||deletefile和新的签名。(6分)
- 提交你使用的攻击方法、工具或脚本的详细说明,以及成功构造的命令和新的签名。(6分)
1. 研究MD5哈希长度延展攻击的机制
MD5哈希长度延展攻击利用了MD5算法的一个漏洞,允许攻击者在不知道原始数据的情况下,构造出具有相同哈希值的新数据。攻击者利用这一漏洞,可以在已知数据的哈希值的基础上,追加额外的数据,而不会影响到原始数据的哈希值。
在这个场景中,管理员使用了一个密钥k和命令cmd的组合来生成签名:hash(k||cmd)。攻击者已经获取了一个允许查看文件的命令cmd=viewfile和对应的签名h。攻击者希望通过哈希长度延展攻击,生成一个新的签名,使得这个签名能够执行删除文件的命令(删除文件的命令为cmd=rm)。
2. 构造新的命令和签名
我们已经有了原始命令和签名:
- 原始命令:cmd=viewfile
- 对应签名:h
我们希望构造一个新的命令cmd=viewfile||padding||deletefile
,并生成相应的签名。
3. 使用openssl
库中的MD5_Update()
函数来计算MD5哈希值,并手动添加填充数据以及新的命令进行攻击。以下是代码:
cCopy Code
#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>
int main() {
// 原始命令和签名
char original_cmd[] = "cmd=viewfile";
unsigned char original_signature[MD5_DIGEST_LENGTH]; // 存储签名的数组
// 假设原始签名已知,这里用16进制表示
sscanf("68617a652cf8ad912cef9bbbe8ddacf7", "%32x", original_signature);
// 需要添加的命令
char additional_cmd[] = "||padding||deletefile";
// 计算新的签名
unsigned char new_signature[MD5_DIGEST_LENGTH]; // 存储新签名的数组
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx, original_cmd, strlen(original_cmd));
// 添加填充数据
MD5_Update(&ctx, additional_cmd, strlen(additional_cmd));
MD5_Final(new_signature, &ctx);
// 输出新的命令和签名
printf("新的命令:%s\n", strcat(original_cmd, additional_cmd));
printf("新的签名:");
for(int i = 0; i < MD5_DIGEST_LENGTH; i++) {
printf("%02x", new_signature[i]);
}
printf("\n");
return 0;
}
这段代码通过计算MD5哈希值来构造新的签名,其中包括了填充数据和新的命令。最终输出新的命令和签名。
4. 运行截图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律