• Pwn出题指南


    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

  • 相关阅读:
    关于射频同轴连接器的功率容量探讨
    给你安利一款国产良心软件uTools
    SpringMVC 源码分析 以及手写简单的SpringMVC框架
    VUE v-for 循环的 2 个使用
    Shell echo命令
    idea中把spring boot项目打成jar包
    [Python进阶] 获取计算机相关信息:WMI
    分开的两个程序使用共同的mysql,一端更新了表,另一端怎么及时更新缓存,使用mybatis
    SpringBoot整合Groovy脚本实现动态编程详解
    Abnova 鸡抗小鼠 IgG (H&L) 二抗(过氧化物酶)说明书
  • 原文地址:https://www.cnblogs.com/tolele/p/16684567.html