🗃️用CTFd搭建自己的CTF靶场

为什么要搭建 1.发现好多平台的题库都有一些旧 2.自己打比赛的时候会留下很多题目需要去复现(总是zip压缩之后就放在硬盘吃灰了) 搭建过程 这个博客是直接python本地跑的的并没有用Docker。 想用Docker的话就用下面的指令。 sudo docker run -d -p 8000:8000 -it ctfd/ctfd 开始正文 1.下载解压 cd ~ mkdir CTFd cd CTFd wget https://github.com/CTFd/CTFd/archive/refs/tags/3.7.2.zip unzip unzip 3.7.2.zip 2.创建python虚拟环境 python3 -m venv myvenv source myvenv/bin/activate 3.跟着官方安装教程来 pip install -r requirements.txt 也可以用prepare.sh来操作 可以根据需要来配置CTFd/config.ini,里面有安全配置,数据库和Redis什么的,我是在本地跑的完全不需要。 我直接运行了,默认使用SQLite数据库。 python server.py 因为我是跑在虚拟机里,host是127.0.0.1,虚拟机外访问不到,编辑一下server.py 把host改为0.0.0.0,其实也可以吧debug关了。 现在就能在虚拟机之外访问了。 访问4000开始配置,over 4.一键运行脚本 因为是在python venv跑的,写一个service刚才没搞出来。。先用个sh凑活一下 写一个run.sh #!/bin/bash source /home/yalois/CTFd/CTFd-3.7.2/myvenv/bin/activate nohup python /home/yalois/CTFd/CTFd-3.7.2/serve.py > /home/yalois/CTFd/CTFd-3.7.2/output.log 2>&1 & deactivate 运行脚本run.sh ...

July 15, 2024 · 1 min · Yalois

🐬MySQL数据库高级管理---备份恢复

参考教材: MySQL数据库技术与应用 张素青、翟慧、黄静 ○ 主编 数据库的备份和恢复 数据库的备份 直接在命令行执行,而不用登录MySQL数据库 备份单个数据库: mysqldump -u username -h host -p dbname [tbname1,tbname2,….] > filename.sql 备份多个数据库 mysqldump -u username -h host -p –databases dbname1 [dbname2 dbname3 …] > filename.sql 备份所有数据库 mysqldump -u username -h host -p –all-databases > filename.sql username: 用户名 (root … host: 主机名 (localhost… tbname: [tbname1,tbname2,….] 参数若缺省代表备份整个数据库 可以直接在命令行输入密码 -p123456 (-p和密码之间不能有空格),-p单独使用回车后会要求用户输入密码 > 重定向符号 ,重定向输入到 filename.sql filename.sql 备份后的文件名 –databases 后边 至少要指定一个数据库 多个数据库用空格隔开 ...

July 3, 2024 · 1 min · Yalois

🐻‍❄️给Bear主题加一个文章分页

前言 记得hugo是有官方的文章分页的,但是我这个主题没有,我也不想去研究怎么使用,直接自己造一个,折腾一下!改! 之前我改过很多次了,直接找到目录,MyBlog\themes\bearblog\layouts。 目录下的文件就是网页的框架(模板。 hugo是go开发的所以是go模板(go html template)。 我对go不太熟悉,然后问了好多次GPT,也学到了不少关于go的东西。 下面直接说我的思路吧。 问题思考 本来的主题是直接一个ul列表,我需要按指定数量给分页。 本来是想要在hugo生成静态文件的时候,10个一页,然后给每一页生成一个html文件, 比如/blog/1.html和/blog/2.html 分别代表第一页目录和第二页目录,然后点下一页的时候跳转,但是这样有些丑陋。还有就是我不会… 看了看别人的博客案例,大概都是hugo在生成静态文件的时候,为每一页专门分一个目录,比如 /page/1/文章xxx /page/2/文章xxx 大概率和主题有关,我的网站目录结构默认不是这样的( 如果是这样可能就有分页功能了, 我的博客文章的链接直接就是/blog/xxx。 在简の单的思考了之后,✨一个想法在我脑中浮现, 生成出所有目录页,都放在一个页面,然后根据css display:none 来隐藏和显示某一个目录页。 比如我有10个文章,3个分一页 我能分4页。 本来网站上只有一个ul来显示目录,现在我3个文章生成一个目录。 ---- <ul>目录</ul> ---- --- <ul>目录1</ul> 显示 <ul>目录2</ul> 隐藏 <ul>目录3</ul> 隐藏 <ul>目录4</ul> 隐藏 --- 然后轮流隐藏显示。 代码 用VSCode读代码找到了\themes\bearblog\layouts\_default\list.html这个文件是目录模板文件, 原来的目录生成代码如下 <ul class="blog-posts"> {{ range .Pages }} <li> <span> <i> <time datetime='{{ .Date.Format "2006-01-02" }}' pubdate> {{ .Date.Format (default "02 Jan, 2006" .Site.Params.dateFormat) }} </time> </i> </span> <a href="{{ .Permalink }}">{{ .Title }}</a> </li> {{ else }} <li> No posts yet </li> {{ end }} </ul> 原来是直接遍历Pages来生成一个列表。我就需要在这里进行魔改。 ...

July 1, 2024 · 2 min · Yalois

✒️Vim基础使用学习

Tips: 光看不练可不行,多操作几遍,把常用的操作记下来。 参考url 知乎学习地址 b站学习视频 vim的三种模式(状态) 命令模式(Command mode) 插入模式(Insert mode) 尾行模式(Last line mode) 命令模式下的指令 文本插入命令 i:在光标所在字符前开始插入 a:在光标所在字符后开始插入 o:在光标所在行的下面另起一行插入 s:删除光标所在的字符并开始插入 I:在光标所在行的行首开始插入 如果行首有空格则在空格之后插入 A:在光标所在行的行尾开始插入 O:在光标所在行的上面另起一行开始插入 S:删除光标所在行并开始插入 光标操作命令 单个字符移动: h: 向左移动 l: 向右移动 j: 向下移动 k: 向上移动 xh: 向左移动x个字符距离 (hjkl都能用) 输入数字后会在最下面显示数字 $: 将光标移动到当前行的行尾 0: 将光标移动到当前行的行首 ^: 将光标移动到当前行的第一个非空字符(行首和当前行非空字符不是一个位置) 2|: 移到当前行的第2列 fx: 将光标移动到当前行的第一个字符x上 3fx: 将光标移动到航前行的第3个字符x上 tx: 将光标移动到目标字符x的前一个字符上 fx和tx可以通过;和,进行重复移动,一个是正向重复,一个是反向重复 %: 用于符号间的移动,它会在一对()、[]、{}之间跳跃 Ctrl+f 向前翻页 forward Ctrl+b向后翻页 backward Ctrl+u向上翻半页 Ctrl+d向下翻半页 G:快速跳转到文件的最后一行 gg:跳转到文件第一行 100G:跳转第100行 (:50到五十行一样效果) 文本操作命令 yy 复制一行内容 ...

June 29, 2024 · 1 min · Yalois

🏹Java学习之RMI远程调用

在学习序列化的时候发现了一个东西叫RMI,来学习一下 概念 远程调用 RMI(Remtoe Method Invocation) 顾名思义就是本地JVM通过网络远程调用另一个JVM上的某个方法。采用客户端/服务器通信方式(C/S)。需要在服务器上部署提供服务的远程对象,然后在客户端请求访问服务器上远程对象的方法。 RMI框架采用代理(Proxy)来负责客户端和服务端之间通信的细节。RMI框架分别生成了客户端代理和服务端代理。位于客户端的代理被称为存根(Stub),位于服务端的代理类被称为骨架(Skeleton)。 存根(Stub): 客户端调用远程对象时,实际上是通过本地代理对象(Stub)来进行的。Stub负责将方法调用转发到远程对象。 骨架(Skeleton): 位于服务端的代理对象,用于接受来自客户端的请求,并将请求转发给实际的远程对象。 使用流程 1.创建远程接口 远程接口,需要直接或者间接的继承Remote(java.rmi.Remote)接口,远程接口声明了可以被客户端访问的远程方法。而且接口中的方法都要抛出RemoteException(java.rmi.RemoteException)异常。 这里实现了一个求和方法。 import java.rmi.Remote; import java.rmi.RemoteException; interface HelloServer extends Remote { public int Sum(int a,int b) throws RemoteException; } 2.创建远程类 远程类用于实现远程接口。为了使远程类的实例能够提供服务,还需要把它导出为远程对象。有下面两种途径: 子类化UnicastRemoteObject import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; class HelloServerImpl extends UnicastRemoteObject implements HelloServer{ //远程类的构构方法必声明抛出RemoteException异常 public HelloServerImpl() throws RemoteException{ } @Override public int Sum(int a, int b) throws RemoteException { return a+b; } } 调用exportObject方法(如果远程类已经继承了其他类,无法继承UnicastRemoteObject。) import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; class HelloServerImpl [extends OtherClass] implements HelloServer{ public HelloServerImpl() throws RemoteException { //端口0代表监听任意一个匿名端口 UnicastRemoteObject.exportObject(this, 0); } @Override public int Sum(int a, int b) throws RemoteException { return a+b; } } 3.创建服务器程序 RMI有一个注册表,注册表将一个名称映射到远程对象。 服务器使用注册表注册其远程对象,以便可以查找它们。 客户端想要调用远程对象上的方法时,它必须首先使用其名称查找远程对象。 ...

June 13, 2024 · 2 min · Yalois