云计算百科
云计算领域专业知识百科平台

buuctf-pwn [NewStarCTF 2023 公开赛道]stack migration(64位栈迁移)题解(学习过程持续更新)

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

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

此题完

赞(0)
未经允许不得转载:网硕互联帮助中心 » buuctf-pwn [NewStarCTF 2023 公开赛道]stack migration(64位栈迁移)题解(学习过程持续更新)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!