

Pwn出题指南 - tolele
source link: https://www.cnblogs.com/tolele/p/16684567.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

0x00:背景
最近在为社团招新赛出pwn题,发现网上关于出题方面的文章资料特别少,所以打算记录下自己出题的过程,便于网友们参考学习。本次出题采用了ctf_xinetd与pwn_deploy_chroot项目。
0x01:Docker介绍
Docker 将应用程序与该程序的依赖,打包在一个文件里面。只要运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,大大缓解了程序分布时的环境问题。
docker的安装:
#本人系统环境:Ubuntu 22.04
# 更新软件包
sudo apt-get update
# 安装docker
sudo apt-get install docker.io
# 检查docker是否安装成功
docker version
docker的相关指令:
# 查看帮助
docker --help (或者准确点 docker [command] --help)
# (!以下命令若显示权限不够的,请自行添加sudo)
# 查看docker的基本信息,有多少个容器、镜像等等
docker info
# 查看本机上的所有镜像
docker images
# 容器构建
docker build
# 运行容器
docker run
# 停止容器
docker stop
# 强制停止容器
docker kill
# 删除容器
docker rm
更多的docker指令参考:https://blog.csdn.net/u012921921/article/details/116259208
0x02:Dockerfile介绍
Dockerfile 是一个用来构建镜像的文本文件,其中包含了一条条构建镜像所需的指令和说明。
相关指令介绍:
- FROM:FROM指令是最重要的一个且必须为 Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。
- COPY:用于从 Docker主机复制文件至创建的新映像文件。
- WORKDIR:用于为 Dockerfile中所有的 RUN、CMD、ENTRYPOINT、COPY和 ADD指定设定工作目录。
- RUN:RUN用于指定 docker build过程中运行的程序,其可以是任何命令,但是这里有个限定,一般为基础镜像可以运行的命令。
- CMD:类似于 RUN指令, CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同 . RUN指令运行于映像文件构建过程中,而 CMD指令运行于基于 Dockerfile构建出的新映像文件启动一个容器时 . CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过, CMD指定的命令其可以被 docker run的命令行选项所覆盖 .在Dockerfile中可以存在多个 CMD指令,但仅最后一个会生效。
Dockerfile制作完成后,用命令docker build
制作基于dockerfile的新镜像。
更详细的介绍及更多的指令可参考:
https://blog.csdn.net/zisefeizhu/article/details/83472190
https://www.runoob.com/docker/docker-dockerfile.html
0x03:docker-compose介绍
docker-compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。docker-compose默认的配置文件为docker-compose.yml,其用YAML语言编写。
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
安装docker-compose:
sudo apt install docker-compose
(不知道有没有记错,或者先执行一下docker-compose命令,如果没有的话,会提示你如何去安装)
0x04:ctf_xinetd与pwn_deploy_chroot项目
ctf_xinetd项目:
该项目的文件结构比较简单,容易入手,不过需要一道道题进行部署,适合部署少量题目。
项目地址:https://github.com/Eadom/ctf_xinetd
部署过程:
# 把项目克隆下来
git clone https://github.com/Eadom/ctf_xinetd
# 把flag和二进制程序放入bin目录中,并且按照readme修改ctf.xinetd
# 在ctf_xinetd目录下构建容器(注意后面有个点)
docker build -t "pwn" .
# 运行该镜像(pub_port改成你想要放置的端口)
docker run -d -p "0.0.0.0:pub_port:9999" -h "pwn" --name="pwn" pwn
# 部署完成
相关命令:
# 查看端口连接:
sudo netstat -antp | grep docker
# 查看连接所在进程:
sudo lsof -i:[端口号]
# 断开连接:
sudo kill -9 [PID]
pwn_deploy_chroot项目:
当需要部署多道题时,可以采用该项目,一次部署!
项目地址:https://github.com/giantbranch/pwn_deploy_chroot
对应的教程:http://www.giantbranch.cn/2018/09/24/%E5%A6%82%E4%BD%95%E5%AE%89%E5%85%A8%E5%BF%AB%E9%80%9F%E5%9C%B0%E9%83%A8%E7%BD%B2%E5%A4%9A%E9%81%93ctf%20pwn%E6%AF%94%E8%B5%9B%E9%A2%98%E7%9B%AE/
部署过程:
# 将该项目克隆下来
git clone https://github.com/giantbranch/pwn_deploy_chroot
# 使用
步一:将所有pwn题目放入bin目录(注意名字不带特殊字符,因为会将文件名作为linux用户名)
步二:python initialize.py
该python指python2,该步是设置各种文件
步三:docker-compose up --build -d
根据Dockerfile文件及其配置文件创建容器并开启
(以上步骤的解释基于本人粗浅的理解,可能不太对噢~)
生成的容器的内容是相对固定的,要想进行一定的修改。可对Dockerfile和initialize.py进行修改,不过需要熟悉一定的命令,并且理解不同文件之间的关系及联系。这个我相信通过查阅文章中的资料,修改并不是什么大问题。
最后可以通过nc 0.0.0.0 [端口号]
进行连接测试。
0x05:远程部署说明
部署在远程服务器上,一般通过ssh用服务器ip地址及相应端口连接。图形界面ssh工具有Xshell、FinalShell,个人认为FinalShell界面看起来更好。
当然使用linux命令行工具也可以连接,可以自行百度搜索。
(好像没有其它特别需要注意的了~)
0x06:Pwn 出题注意点
编译的相关参数:
# NX保护机制:
-z execstack / -z noexecstack # (关闭 / 开启) 堆栈不可执行
# Canary:(关闭 / 开启 / 全开启) 栈里插入cookie信息
# !开canary好像会造成栈中局部变量的顺序有所改变
-fno-stack-protector /-fstack-protector / -fstack-protector-all
# ASLR和PIE:
-no-pie / -pie # (关闭 / 开启) 地址随机化,另外打开后会有get_pc_thunk
# RELRO:
-z norelro / -z lazy / -z now # (关闭 / 部分开启 / 完全开启) 对GOT表具有写权限
-s # 去除符号表
参考:https://blog.e4l4.com/posts/%E5%87%BApwn%E9%A2%98%E7%9A%84tips/
#程序需要输出输入时,加上这两段代码,不然部署在docker中运行时要回车才有输出
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 2, 0);
tolele
2022.9.11
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK