pwnable.kr总结
fd
题目:
连上ssh看一下
有三个文件,flag没有权限,所以先cat fd.c
看一下fd的源码
1 |
|
程序接收一个参数argv[1]
并且转换为int型,然后减去0x1234
读入buf后与LETMEWIN
比较,如果相同则可以得到flag
当fd
为0时是stdin(标准输入),即可以在buf中输入我们想要的字符
故运行程序时候的输入0x1234的十进制4660即可
collision
跟上一道题一样,ssh连过去
同样先看源码
1 |
|
输入必须是20个字符,输入20个字符后进入check_password
函数。
进入check_password
函数后,会将传进来的长度为20的字符串p进行(int * )强制转换,char是1个字节,4个字节为一组,一共5组,正好20个字节。
接着把每4个字符看成1个int型的数字,进行5次循环,结果放入res中。
同时这里需要注意是把四个字节的字符串当成了一个数,假如我们这里的输入是1234123412341234
,即是把1234
在内存中的ascii码(31 32 33 34
)当成了一个数 (小端格式)
所以只需要找到5次累加后与0x21DD09EC
相等的字符串的ascii码输入进去,即可获取flag0x21DD09EC
无法整除5,所以先减去4,再除以5
最后的组合为:0x06c5cec8 * 4 + 0x06c5cecc
exp:./col $(python -c "print '\xc8\xce\xc5\x06' * 4 + '\xcc\xce\xc5\x06'")
总结
1.指针转换
1 | char * p1 = "1234" |
2.内存存储
exp为小端格式
要学会调试,调试可以看到内存中的状态等等等等
bof
给了源码和连接方式
先看一下源码
1 |
|
只要key == 0xcafebabe 就会调用shell,所以只要让key等于0xcafebabe即可。可以利用gets
这个函数的输入,使得溢出func(0xdeadbeef)。
拖进ida f5后发现字符串s是从[ebp-2Ch]开始进入栈缓冲区的,所以只需要覆盖0x2c个字节,再加上ebp和eip就可以覆盖到func的参数。(0x2c十进制是44,ebp和eip都占4字节,所以44+8=52)
exp:
1 | #-*-coding:utf-8-*- |