不知不觉水了那么久,5月校赛出了一些密码动态题,其中遇到各种麻烦事,收到校内师傅很多帮助,集中写了这篇心得。
环境:Ubuntu64位,阿里云容器镜像服务 ACR 控制台 (aliyun.com)
面向平台:gzctf(应该也可以上西电平台,但没试过)
前期准备
- docker安装:每个人的环境不同,这一块网上教程挺多的
- 梯子
- 阿里云的账号:容器镜像服务 ACR 控制台 (aliyun.com),里面有教程,跟着教程创建好一个
动手
一、登录
1 | sudo docker login --username=[自己的名字] [仓库公网] |
有时候需要上梯子才能登录
二、项目编写
这一块讲如何写main.py
1 | import socketserver |
主要部分是
1 | def handle(self): # 主要处理交互的地方 |
这一块实现交互,可以按照你的需求来改(后面会有例子)
注意编码问题,如果你想发送中文,需要用UTF-8编码。
面向对象主要用Windows的话,可以用gbk编码等等
例子
nc连上后,会给选手一个数,让ta先判断是否为素数,然后再计算欧拉函数,一共20轮。0,11都给素数,让选手了解欧拉函数怎么计算,素数的欧拉函数计算。
1 | import socketserver |
三、docker启动!生成镜像
将上面的main.py替换下面文件夹中的同名文件
将整个文件夹传到虚拟机中
在相对应的地方输入命令
1 | docker build . |
成功后(可能遇到问题python拉去失败,下一节讲)查看镜像容器
1 | docker images |
看到有没刚刚建好的容器,接下来传到阿里云的私有仓库中
去到镜像仓库里面,有操作指南
1 | docker tag [ImageId] 仓库公网域名/名称/仓库名称:[镜像版本号] |
ImageId
是先前docker images
查看的IMAGE ID
镜像版本号就是前面命的名 tag
然后再push(就是把上条命令的tag和镜像id换成push)
1 | docker push 仓库公网域名/名称/仓库名称:[镜像版本号] |
这时候镜像就push到公网上了(西电平台好像直接可以传容器的)。
四、docker上传可能遇到的问题
1.python拉取失败
如下
1 | saga@saga-virtual-machine:~/ctf-docker-template-main/crypto-python_3.10-with_socket$ docker build . |
解决办法
单独拉去一下python
1 | docker pull python:3.10.13-slim-bullseye |
后面改成自己dockerfile里面用的
遇到网络问题,修改etc/docker/daemon.json为
1 | { |
然后
1 | sudo systemctl daemon-reload |
五、上传题目
登录gzctf平台
在红色框填写上面push命令中push后的内容 仓库公网域名/名称/仓库名称:[镜像版本号]
更换服务端口为dockerfile里面的数字
六、更换题目
需要删除前面生成的docker镜像
1 | docker rmi [镜像id] |
用shell工具上传更换新的文件后
然后重复上面步骤
1 | docker build . |
七、密码出题小tip
- 跟ai说需求,让它写
- 限制时间,防爆破
结语
累
如果上面有任何问题,请联系我 2146983392@qq.com