collision

Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!

ssh col@pwnable.kr -p2222 (pw:guest)

 

本题考察哈希碰撞思想。

源码如下:

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
        int* ip = (int*)p;
        int i;
        int res=0;
        for(i=0; i<5; i++){
                res += ip[i];
        }
        return res;
}

int main(int argc, char* argv[]){
        if(argc<2){
                printf("usage : %s [passcode]\n", argv[0]);
                return 0;
        }
        if(strlen(argv[1]) != 20){
                printf("passcode length should be 20 bytes\n");
                return 0;
        }

        if(hashcode == check_password( argv[1] )){
                system("/bin/cat flag");
                return 0;
        }
        else
                printf("wrong passcode.\n");
        return 0;
}

程序把传入的第一个参数(长20)每4个分为一组,共5组,加和等于hashcode则目标达成。

因此可以考虑如下构造方法,让每组都等于hashcode除以5,但是因为hashcode为568134124无法被5整除,因此将hashcode先加一再除以5,再将其中一个结果减一即可

注意大小端序的转化,同时对于无法直接输入的部分,可以用`python -c "print '语句' "`进行处理,-c可以让python执行一行语句

推荐用python2进行输入,python3涉及到部分unicode,传入的不一定长度为20

因此对于本题而言,(hashcode+1)/5=0x6c5cec9,因此传参为`python -c "print '\xc9\xce\xc5\x06\xc9\xce\xc5\x06\xc9\xce\xc5\x06\xc9\xce\xc5\x06\xc8\xce\xc5\x06'"`

posted @ 2021-08-02 00:20  hktk1643  阅读(153)  评论(0编辑  收藏  举报