今天学pwnable.kr的第二道题目:Collision

因为今天网站访问不了了,所以把昨天的记录写下。首先看源码,打开虚拟机用ssh连接到题目环境再cat col.c就可以看到源码了。

在main函数里:int argc是指命令行参数个数,char *argv[]指所有命令行参数。然后里面的是三个判断,前两个说的是判断argv[]是不是20个字符,如果是则执行第三个判断。

第三个判断是调用check_password函数。而check_password的作用是接收char类型的p,(int*)p然后再把p转换成int类型再赋值给ip。因为char是1个字节存储的,而int是4个字节存储的,所以20个字节的char p会被分成5段,一段4个字节,ip[0]就是第一段。

for循环就是把4段的int内容(也就是ip(0),ip(1),ip(2),ip(3),ip(4);)加起来,然后再返回一个res。这里就会回到main的第三个判断那里判断res是否等于hashcode,而hashcode在题目源码是固定的,所以我们只要构造输入的20个字符的p分成五段,结果等于hashcode就行了。而且hashcode是16进制的,所以输出的也要是16进制的字符。

所以我们只要输入:16个x01加一个xe8\x05\xd9\x1d就行了

./col $(python -c "print '\x01' * 16 + '\xE8\x05\xD9\x1D'")

然后就可以看到flag了。