⭐用docker + gdb + gdbserver优雅的调试pwn题⭐

起源:

        利用patchelf + glibc-all-in-one来修改pwn题的libc和ld终究还是和真实的运行环境有所区别,尤其是在使用了libc-c++和异架构的情况下。

        再此之前我也尝试过其他师傅的调试方法,最有效的是在docker中使用有名管道pipe + tmux 的组合,但是这个办法实测必须要先输入才能输出(pipe有阻塞的特性),还是不太好用。但是又不想再docker在安装一次pwn环境(pwngdb的安装懂的都懂)。

        该文章办法在2025/3/30时仍然有效。

步骤:

  环境:ubuntu-24.04 + virtualbox7.1.6 

  前提:已经安装好基础pwn环境和docker环境。

  在当前目录下创建Dockerfile文件内容为:

# 使用基础镜像将该位置的20.04替换成你想要的版本
FROM ubuntu:20.04

# 更新 apt 包索引并安装所需的软件,异架构安装软件办法有所不同,请自行解决
RUN apt-get update && apt-get install -y \
    socat \
    gdb \
    gdbserver \
    vim \
    gcc

# 在 /tmp 下生成一个名为 run.sh 的脚本
RUN echo 'socat TCP-LISTEN:9999,fork,reuseaddr EXEC:./pwn' > /tmp/run.sh

# 赋予脚本可执行权限
RUN chmod +x /tmp/run.sh

# 暴露容器的 9999 和 10000 端口
EXPOSE 9999 10000

# 定义容器启动时执行的命令
CMD ["/bin/bash"]

  使用docker构建镜像(请将当前用户加入docker用户组):

docker build -t pwn-box-20.04 .

  创建docker容器并赋予一定权限还要开放端口:

docker run -it --name pwn-box-20.04 -p 9999:9999 -p 10000:10000 --pid=host --cap-add=SYS_PTRACE pwn-box-20.04 /bin/bash

  在宿主机将pwn文件复制到docker中:

docker cp ./pwn pwn-box-20.04:/tmp/

  在docker中的/tmp目录下有一个run.sh文件和pwn文件,运行run.sh文件来启用pwn运行在端口9999:

./run.sh

  在你的exp脚本中添加一下函数:

import subprocess
import os

def get_pid(process_name):
    ps_output = subprocess.check_output(['ps', '-a']).decode('utf-8')
    lines = ps_output.splitlines()
    for line in lines:
        if process_name in line:
            pid = line.split()[0]
            if pid.isdigit():
                return pid
    return None

def gdbremote(pid , name = 'pwn-box-20.04' , port = '10000' , ip = '127.0.0.1'):
    os.system("gnome-terminal -- bash -c \"docker exec -it " + name + " gdbserver :" + port + " --attach " + pid + " \"")
    os.system("gnome-terminal -- bash -c \"gdb -ex \\\"target remote " + ip + ":" + port + "\\\" \"")

  调用方法为:

p = remote("127.0.0.1", 9999)

gdbremote(get_pid("pwn"))
pause()

#你的exp代码

p.interactive()

  和正常调试一样,运行脚本 :

python3 ./exp.py

        gdbremote函数会弹出两个窗口,一个是gdbserver的不用管,另外一个是gdb这个和正常使用gdb.attach(p)是一样的,目前测试和本地调试几乎没有区别。在pause时需要先下断点再让exp运行,否则很有可能停不在你想停的地方。

        gdb中使用b *0x??????然后c继续程序,然后才能让exp继续运行。

        gdb通过ctrl + D退出后正常来说弹出的两个窗口都会关闭,此时可以重新运行脚本进行调试。

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值