Pwnable.kr题解(二)

Pwnable.kr-02 collision

(一) 题目

首先ssh进去,ls查看一下都有什么东东。

1559284286027.png

和前一个一样,一个没有读取权限的flag,一个col.c,一个col的可执行程序。

直接看源码吧:

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
    int* ip = (int*)p;//把char指针转成int指针
    int i;
    int res=0;
    for(i=0; i<5; i++){//因为只有20个字符,一个字符一个字节,一个int4个字节,所以有5个int
        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){//检查第二个参数长度是否为20
        printf("passcode length should be 20 bytes\n");
        return 0;
    }

    if(hashcode == check_password( argv[1] )){//调用check_password函数,检查返回结果是否与hashcode相等
        system("/bin/cat flag");
        return 0;
    }
    else
        printf("wrong passcode.\n");
    return 0;
}

分析完了之后我们发现,我们需要输入20个字符,这20个字符会被4个一组转成int,之后5个int类型的数相加,结果要等于0x21DD09EC。

这该怎么办呢?这里用到了一个Linux的知识点,可以直接把python的输出变成程序的输入,

./col `python -c "print '\x01'*16+'\xe8\x05\xd9\x1d'"`

由于0x01010101 *4 + 0x1dd905e8 = 0x21dd09ec,所以我们可以使用16个0x01对应的字符,加上0xe8 0x05 0xd9 0x1d 对应的四个字符作为输入。这里还要注意的一个点是大小端序的问题。

1559290716760.png

这就得到了我们需要的flag。

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

推荐阅读更多精彩内容

  • 0x01 codemap 1. 题目描述 2. 题目分析 我们直接看IDA反汇编后的代码: 经过分析我们可以看到,...
    Nevv阅读 3,701评论 0 4
  • 0x01 fd 文件描述符 0、1、2分别代表标准输入、标准输出和标准错误,所以输入0x1234的十进制值,再次...
    Nevv阅读 11,101评论 0 6
  • pyspark.sql module Module context Spark SQL和DataFrames中的重...
    盗梦者_56f2阅读 10,842评论 0 19
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,743评论 0 2
  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 13,039评论 3 52