0x00 前言
题目考察点:栈迁移
、ROP
、ret2leave
题目来源:BUUCTF
写这篇博客为了记录一下栈迁移的用法。
0x01 分析
1 | Arch: amd64-64-little |
程序最大可以读入0xE0字节的数据,而s与rbp的距离为0xD0,所以还可以溢出0xE0-0xD0 = 0x10个字节的数据,但是这0x10只够覆盖rbp和返回地址
。
程序会把栈地址打印出来。
程序开了NX保护,无法往栈上写入shellcode来执行
所以考虑栈迁移
,然后构造ROP链
。
0x02 EXP与解释
这道题比较简单,直接放EXP了,一些关键点会解释一下。
1 | #coding:utf-8 |
由于题目并没有给libc,可以考虑用LibcSearcher(实际上libc就是libc-2.27.so)
来看第一个payload,关于它的执行流程,可以看下面:
1 | read之前 |
有的博主把这块构造叫做ret2leave
关于第二个payload,我试过通过rop链构造system('/bin/sh')
但是打不通,所以这里采用one_gadget
这里选用的第一个0x4f2c5
,然后老样子构造payload即可。
0x03 写在最后
这道题目不难,关键是理解这个栈迁移的原理和ret2leave
的执行流程。
可以总结一下:
leave相当于 rsp = rbp + 8; rbp = [rbp];
为了达到我们的目的(让rsp指向 rbp里面的值+8的位置),一次leave是不够的,所以本题需要两次,才能使得rsp = [rbp] + 8