pwnable.kr collision

开始步骤跟fd一样,cat col.c后查看代码,如上。

第一眼看到system(“/bin/cat flag”);然后往回寻找执行命令的条件,hashcode ==check_password(argv[1]);

argv[1]是命令行中的第二个字符(参数argc记录了命令行中命令与参数的个数,而命令行中的参数都被存储在argv[]中,比如文件名为argv[0],那之后输入的字符串就是argv[1]),所以在调用/col文件后,还需要输入20个字符(根据main函数内的其他两个IF条件语句)

第一眼看check_password函数时,我以为它是计算前5个字符的ascll码的总和,之后复习了c的指针后,才明白(int*)将字符数组p转换成了整型,然后存储在指针ip中,因为整型在32位机器中存储占用4个字节,而字符串只占用1个字节,所以ip[0]在读取数据时会读取到原本总共4个字符的数值。因此check_password的函数是将输入的20个字符转化成整数,然后分成5个部分,再相加。

因为输入\x00、\x09、\x20程序无法读取,所以为了最简化,可以将hashcode的\x21DD09EC减去四个\x01\x01\x01\x01,得到\x1d\xd9\x05\xe8,然后用python程序输入时需要反过来(不知道是python输入的原因,还是\x格式的原因),最后直接用命令./col `python -c "print '\x01' * 16 + '\xE8\x05\xD9\x1D'"`得到flag。

参考https://blog.csdn.net/scnu_jiechao/article/details/50403810




猜你喜欢

转载自blog.csdn.net/qq_35661990/article/details/80244421
今日推荐