【Writeup】Pwnable.kr 0x02 collision

0x02 col

题目描述:

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

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

解题思路:

ssh连接上后得到代码

#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字节的字符串,通过check_password()函数,得到的值与hashcode的值相等,则得到flag。
分析check_password()函数,将char类型的p强制类型转换成int类型,其中char类型是1字节为单位,int类型4字节为单位,而要求输入的是20个字节,那么20除以4等于5,刚好与check_password()函数里的for循环相吻合,所以,本题的解题要领就是通过5个部分的数字相加得到hashcode的值,那么将hashcode,0x21DD09EC分解一下(答案不唯一),我这里将其分解成4个0x06c5cec9和1个0x06c5cec8,在终端输入python -c 'print 4*"\xc9\xce\xc5\x06"+"\xc8\xce\xc5\06"' | xargs ./col得到flag。

  • 这里要注意的是数字在内存中是按照小端序存储
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,886评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,759评论 18 399
  • 自嗨这个词语在最近慢慢地火了起来,从字面的意思看来,就是自己爽而不管别人的感受。 自嗨并不是一个新鲜的事物,只是在...
    更好时代阅读 544评论 0 0
  • 在我的印像中,李姐是一个像风一样的女子。 她的模样用端庄,典雅来形容,一点不过份。 从她起床开始,该做什么就做什么...
    篱笆影阅读 796评论 4 6