【南邮】md5 collision write up

源码:

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "nctf{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}
?>

MD5碰撞的概念:

从根本上讲,MD5算法是一种摘要算法,它可以从多个字节组成的串中计算出由32个字节构成的“特征串”。对于超过32字节的串来说,MD5计算得出的值必然是其一个子集,所以必然存在两个(或更多)不同的串能够得出相同MD5值的情况。这种情况就叫做MD5碰撞。

php关于==号是这样处理的,如果一边是整型,另一边也需要是整型。

0e545993274517709034328855841020
这是一个整数,在php里是理解为0*10^4549...20的意思,那么其值是0

同样

0e342768416822451524974117254469
这是一个整数,在php里是理解为0*10^34..69的意思,那么其值是0

md5('s878926199a')=0e545993274517709034328855841020
md5('s155964671a')=0e342768416822451524974117254469
//可以看到两者的md5值都是以0e开头的,则
md5('s878926199a')==md5('s155964671a') //就是True

所以 构造提交a=s155964671a

得到flag:nctf{md5_collision_is_easy}


原文地址:https://www.cnblogs.com/liuyimin/p/7912192.html