Pwn出题简单总结

https://www.cnblogs.com/ve1kcon/p/18128333

https://xz.aliyun.com/t/14507?time__1311=GqAhDIqIxUxmx0yx4%2BgrxgQAPi%3Dkf3x

https://cn-sec.com/archives/3119494.html

环境

由于docker的原因,要开启clash的tun和服务模式

重启docker环境之后平台也要重启,容器顺序不一定按修改的先后顺序排列

编译环境

docker是ubuntu的,所以建议在Ubuntu上编译二进制文件,如果没有特定版本就用docker构建

编译特定glibc版本的附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 使用Ubuntu 16.04作为基础镜像
FROM ubuntu:16.04

# 换源
RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list && \
sed -i 's@//.*security.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
# 更新软件包并安装必要的依赖
RUN apt-get update && apt-get install -y \
build-essential \
gcc \
libc6-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /app

# 将你的C代码复制到容器中
COPY test.c /app/

# 编译你的C代码并将编译后的二进制文件保存到/app目录中
RUN gcc -z norelro -fno-stack-protector -no-pie -z execstack -o test test.c

# 保持容器运行,以便主机访问容器内的编译结果
CMD ["sleep", "infinity"]

gcc编译

  • NX :-z execstack / -z noexecstack (关闭 / 开启) 不让执行栈上的数据,于是JMP ESP就不能用了
  • Canary :-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 栈里插入cookie信息
  • PIE :-no-pie / -pie (关闭 / 开启) 地址随机化,另外打开后会有get_pc_thunk
  • RELRO :-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启) 对GOT表具有写权限

得到特定二进制文件

sudo docker run -it glibc2.23 /bin/bash

sudo docker cp 947e24ecf60a:/app/format_master ~/Desktop/

一般选择直接部署到服务器上,因为本地部署完会出现nc 127.0.0.1 端口 无回显的情况

常见docker命令

docker相关命令都要sudo权限

查看容器:sudo docker ps

停止容器:sudo docker stop 8b

删除镜像:sudo docker rmi e1

进入容器:sudo docker exec -it your_stack /bin/bash

退出容器:ctrl+d

根据镜像创建容器:docker build -t format_master .

GZCTF动态flag部署

https://cn-sec.com/archives/3119494.html

https://skynionkrz.github.io/2024/08/22/%E5%87%BA%E9%A2%98%E6%B5%81%E7%A8%8B/

echo ghp_ZcmbShK0PitZqOfHDF…… | docker login ghcr.io –username j1ya-22 –password-stdin

docker tag format_master ghcr.io/j1ya-22/format_master:latest

docker push ghcr.io/j1ya-22/format_master:latest

比赛没开始的时候得到的flag

实际效果

平台开启测试容器,服务器就能生成有后缀的对应容器

遇到的问题

glibc_xx not found

用kali22的gcc编译得到的二进制文件需要glibc2.34,但是dockerfile默认是ubuntu16

在本地搭一个特定版本的docker来编译二进制文件

./执行no such file

题目本身需要libc文件加载,不然无法在远程运行

把libc.so.6文件(实际lbc-2.23.so)放到和二进制文件同一目录,其他如ld-2.23.so都不需要

远程函数真实地址随机

puts等函数真实地址不一定是0x7f开头,但如果是0x7c等开头也能打通,主要是地址随机化的缘故

需要关闭系统地址随机化bash -c “echo 0 > /proc/sys/kernel/randomize_va_space”


Pwn出题简单总结
https://j1ya-22.github.io/2025/05/11/Pwn出题简单总结/
作者
j1ya
发布于
2025年5月11日
许可协议