非常喜欢pwnable.kr,题目难度循序渐进,关键是界面可爱到爆QAQ
第一题 fd
1 | #include <stdio.h> |
这就是一个很简单的传参问题,argv数组接受main函数(也就是运行程序时后面带的参数),按照题目要求传参,fd为1作为read的第一个参数,buf接收LETMEWIN即可。
fd@prowl:~$ ls
fd fd.c flag
fd@prowl:~$ ./fd 4662
LETMEWIN
good job :)
mommy! I think I know what a file descriptor is!!
第二题 collision
1 | #include <stdio.h> |
输入20个char型的,在check_password里转成int型的,原来一个字符指针对应一个字节,现在变成int指针对应4个字节,长度为5,刚好满足循环累加,加起来要等于0x21DD09EC。
4个字符存一个16进制的int。hashcode = 4*a+b = 16*char+b。
0x21DD09EC = 0x01010101*4+0x1dd905e8
考虑小端序,payload为
1 | `python-c "print '\x01' * 16 +'\xE8\x05\xD9\x1D'"` |
col@prowl:~$ ./col `python -c “print ‘\x01’ * 16 +’\xE8\x05\xD9\x1D’”`
daddy! I just managed to create a hash collision :)
第三题 bof
1 | #include <stdio.h> |
拖进ida,func函数里面,overflowme的地址为ebp-2c,key的地址为ebp+8,0x2c + 0x8 = 52。
简单的栈溢出,payload如下:
1 | # -*- coding:utf-8 -*- |
第四题 flag
拖进ida,找不到main函数的入口点,根据题目提示reverse,估计加壳,peid查壳发现upx,kali upx -d 脱壳,再拖进ida即可发现flag。