本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题
checksec pwn 查看一下保护机制

可以看到这是一个64-bit的文件,NX保护开启
将文件拖入ida64,按F5将汇编代码转换成c语言代码,得到

可以看到存在read(0,&v3,96)栈溢出,96-0x50=16,所以仅能溢出到return address,考虑栈迁移。我们可以迁移到v2上去,并且printf里的%p也帮我们打印出来了v2的地址,v2的地址加8就是v3的地址
这个题我们需要两次利用栈迁移:第一次调用pust函数泄露read@got里存储的read函数的真实地址,从而得到system函数和字符串'/bin/sh'的地址;第二次构造system("/bin/sh"),获得shell
返回虚拟机

第一次发送:8个’a',利用%p获得地址

第二次发送:泄露read@got里存储的read函数的真实地址;其中buf_addr+8是payload的起始位置,
b'a'*8是因为ret后esp会自动加8,用于填充那八个字节的空余位置(垃圾数据);最后返回到sub_4011FB函数,而第二次构造做准备

然后接收read函数的真实地址,进而得到system函数和字符串'/bin/sh'的真实地址

第三次发送:再次重复第一次的步骤,获得buf_addr

第四次发送:构造system("/bin/sh");ret_addr用于栈对齐
完整exp

保存退出
python3 exp.py
cat flag

此题完
网硕互联帮助中心






评论前必须登录!
注册