生成题目附件

编写

放一个ret2libc的模板在这里,注意尽量将主要逻辑放在单独的函数中,并且在进入这个函数之前要设置流,否则docker中需要换行才能有输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void init() {
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 2, 0);
setvbuf(stderr, 0, 2, 0);
}

void vuln() {
char buffer[64];
printf("Do u know ret2libc?\n");
gets(buffer);
}

int main() {
init();
vuln();
return 0;
}

编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#gcc 未编译文件名 -o 编译完成后文件名
#默认保护全开
gcc csu.c -o csu
#部分开启got表,关闭stack保护,关闭pie,-o 编译完成文件名,未编译文件名
gcc -z lazy -fno-stack-protector -no-pie -o csu csu.c
#gcc编译中的集中保护打开和关闭
# 关闭NX / 开启NX
-z execstack / -z noexecstack
# 关闭canary / 开启canary
-fno-stack-protector / -fstack-protector-all
# 关闭pie / 开启pie
-no-pie / -pie
# 关闭relro / 部分开启relro / 完全开启relro
-z norelro / -z lazy / -z now

CTF-Xined项目获取

1
2
3
4
5
sudo apt-get update
#下载地址,下载完成后拷贝到服务器中
https://github.com/CTF-Archives/ctf-docker-template
#或者直接git获取
git clone https://github.com/CTF-Archives/ctf-docker-template

image-20240901230107147

选择对应版本的ubuntu

2.23->16.04
2.27->18.04
2.31->20.04
2.35->22.04

image-20240901230354417

将刚刚编译好的附件放入src文件夹

找到这几个文件,分别位于:

1
2
3
./config/ctf.xinetd
./service/docker-entrypoint.sh
./Dockerfile

image-20240901231232704

然后将刚刚编译完成的文件名替换上图中红框框起来的地方,如果需要自己定义静态flag,可以在./service/docker-entrypoint.sh文件的INSERT_FLAG=”flag{TEST_Dynamic_FLAG}”处替换为自定义的flag,如果不想每次运行docker的时候都输出flag的值,可以把./service/docker-entrypoint.sh文件第24行的tee删去

完成以后使用下列命令构建docker并运行和检查flag等是否设置正确

docker基本命令

构建image

在Dockerfile目录下运行:

1
docker build -t code_cube .

code_cube是构建出的镜像名

1
docker images

image-20240901232834661

运行容器

现在应该能看到docker镜像,用这个镜像运行一个容器(my_code_cube是运行的容器名称):

1
docker run -it --name my_code_cube code_cube:latest /bin/bash

这时换一个终端输入:

1
docker ps

应该会有

image-20240901233324270

此时输入下面这条命令就可以进入这个docker,可以检查一下flag的值是否正确

1
2
docker exec -it my_code_cube /bin/bash
docker exec -it [CONTAINER ID] /bin/bash

这里顺便记录一下怎么在本地彻底删除这个docker(当然也可以在创建的时候使用-rm参数,这里不做记录,读者自行研究)

显示容器列表

1
docker ps -a

可以查看所有容器,包括已经停用的

image-20240901234153455

可以对比看一下

删除容器:

1
docker rm [CONTAINER ID]

image-20240901234255963

如果是正在运行的容器,需要先停止,再rm

1
2
docker start [CONTAINER ID]
docker stop [CONTAINER ID]

image-20240901234611602

显示镜像列表:

1
docker images

删除镜像(remove image):

1
docker rmi

image-20240901234806906

导出docker备份为tar文件:

1
docker save -o code_cube_image.tar code_cube:latest

image-20240902000810481

1
docker load -i code_cube_image.tar