Pwnable.kr-02 collision
(一) 题目
首先ssh进去,ls查看一下都有什么东东。
和前一个一样,一个没有读取权限的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 对应的四个字符作为输入。这里还要注意的一个点是大小端序的问题。
这就得到了我们需要的flag。