pwnable 之collision

还是先根据题目提示建立ssh链接,看到三个文件。

flag肯定是没办法查看的,查看一下给的col.c如下所示。

#include 
#include 
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;
}

发现,要通过验证显示flag,就是让参数数组的各个数的和为0x21DD09EC,也就是十进制的568134124,而且要求是5个数加起来是这个结果,我们知道一个int是4个字节,题目对数组的输入是一个char[20],所以正好。考虑一下输入的值为了方便,我们把56813412+1再除以5,连续输入5个数字,把最后一个减一就是结果了。除以是113626825。十六进制表示就是0x21DD09EC.


好的,也就是说,当数组传进去的时候呢,应该是四个\x6C5CEC9和一个0x6C5CEC8。

但是,题目的输入,是字符。这样要把每个数字分成四部分输进去,而且要注意,数字的存储是反着的。叫小端存储,所以应该是四个‘\xec\x09\xdd\x21’和一个‘\xeb\x09\xdd\x21’,所以第一个想到的是把每个数字转化成相应的字符串输进去,但是这些ASCII所对应的的字符是不可见的,输出来是一堆问好,把问号copy进去又不对。

这个时候就要用到python大法了。`python -c print '\x6C5CEC9' `,直接操作内存。

这里要注意,语句的开头和结尾不是单引号,是‘`’,注意,不是单引号。

然后构造一下语句 ./col `python -c 'print "\xC9\xCE\xC5\x06\xC9\xCE\xC5\x06\xC9\xCE\xC5\x06\xC9\xCE\xC5\x06\xC8\xCE\xC5\x06"'`

成功执行。

你可能感兴趣的:(CTF)