简单易懂的 pwnable.kr 第二题[collision]Writeupt
题目地址:http://pwnable.kr/play.php
题目如下:
和第一题一样,题目给了我们一个ssh远程登录地址和登录密码,废话不多说,先进入VMware虚拟机的ubuntu 16.04系统里面看看。
密码是:guest。 第一次输错了大家不要介意。
迫不及待查看一下里面都有什么文件以及属性。Linux命令:ls -al,发现col.c文件是可读的。col文件是可执行的不知道为什么可读,可以查看Linux 文件属性和权限
其他文件都没办法操作目前,那我们就查看一下col.c里面的内容。
Linux命令:cat col.c
不知道这个命令的可以自行百度或者查看Linux常用命令大全
内容如下:
#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;
}
带参数的main函数点击查看
我们可以看到只要 system("/bin/cat flag"); 这一语句执行我们就可以得到我们想要的flag。而想要执行这一语句,我们就需要前面两个if语句不能执行,并且第三个if语句要保证执行。也就是说我们的 argc >= 2 、argv[1] == 20 并且 check_password的返回值为 0x21DD09EC
- argc >= 2 :要求我们至少输入一个参数
- argv[1] == 20:要求我们第一个参数要20个字节
- check_password函数的作用:是将一个20个字节的字符串拆分为5个整型指针并将其所对应的值相加。
0x21DD09EC = 0x02020202 * 4 + 0x19D501E4
所以写一个小python脚本将值给求出来,并输入即可。
0x21DD09EC = 0x01010101 * 4 + 1DD905E8
所以当然也可也输入,print ‘\x01010101’ * 4 + ‘\xE8\x05\xD9\x1D’。
答案不唯一,大家随意。
可能大家有疑惑为什么反着写,因为C语言是小端存储。
flag大家也看到了就是:
daddy! I just managed to create a hash collision 😃
daddy! I just managed to create a hash collision :)
希望对大家有所帮助哦。