CTF 学习笔记

CTF

定义

CTF 就像一场 “黑客版的寻宝游戏”,参赛者通过破解密码、挖漏洞、逆向程序等技术手段,在虚拟世界里找到隐藏的 “flag”(一串特定字符),谁找得快、技术强谁就赢。

竞赛模式

  1. 解题模式(Jeopardy)

    * 核心机制 *:通过解决安全技术题目获取 flag,按题目分值和解题时间排名,常见于线上选拔赛。

    * 动态积分规则 *:题目初始分值随解题人数增加而递减,前三名(一血、二血、三血)获得额外奖励分。

    * 题型分类 *:Web 渗透、逆向工程、密码学、安全杂项(MISC)、二进制漏洞(PWN)等。

    玩法:像做试卷,题目分类型(如密码破译、逆向工程、Web 漏洞等),解出题目后提交隐藏的 flag 就能得分。

    特点

    • 题目难度越高分越多,但解题人数越多分越少(动态积分)。
    • 适合线上赛,比如预选赛,团队可自由组队,拼脑力和技术积累。

    举例:给你一个网站,找 SQL 注入漏洞拿 flag,类似 “黑客版奥数题”。

  2. 攻防模式(Attack-Defense) (黑客版真人 CS**

    * 核心机制 *:各队伍拥有相同漏洞的服务器(GameBox),攻击对手服务得分,修补自身漏洞防御扣分,实时对抗性强。

    * 计分规则 *:每轮得分取决于攻击成功次数和防御状态,服务宕机将扣分。

    * 特点 *:高强度持续 24-48 小时,考验团队协作和体力。

  3. ADP 攻防增强模式

    一句话总结就是 ==“黑客版的一题两吃”==:每个题目只需完成一次攻击(拿 flag)和一次防御(修漏洞),做完就扔,不用反复折腾。

    举个栗子🌰:

    ​ 假设题目是一个带漏洞的网站,ADP 模式下你要做两件事:

    ​ 1️⃣ 攻击:找到漏洞(比如 SQL 注入),拿到 flag 提交得分(类似解题模式)。

    ​ 2️⃣ 防御:给漏洞打补丁(比如过滤 SQL 语句),上传补丁到平台验证,确认修好后得分。

    这题就算完事了! 之后不用再管它,专心搞其他题目就行。

    和传统攻防(AwD)的区别

    对比项传统攻防(AwD)ADP 攻防增强
    攻击方式全程用脚本批量攻击对手,抢 flag 刷分每个题只需攻击一次,提交 flag 就停手
    防御方式边修漏洞边防对手攻击,服务崩了会疯狂扣分修好漏洞并验证通过后,这题永远不扣分了
    选手压力熬夜修漏洞 + 写攻击脚本,像打仗一样累像做作业,一题两步骤,做完就躺平
    主办方压力要维护几十台服务器,防止被选手打崩题目环境用完就删,省电省服务器

    ADP 的核心优势

    1. 选手省力:不用写自动化脚本,不用盯着服务是否崩溃,专注解题和修漏洞本身。
    2. 主办方省钱:题目环境用完就销毁,不用扛住几百个队伍的持续攻击。
    3. 题目灵活:比赛过程中可以随时换题(比如旧题下线,新题上线),增加新鲜感。

    适合谁玩?

    • 新手友好:适合刚接触攻防模式的小白,不用学写攻击脚本
    • 中小型比赛:比如企业内训、高校校赛,运维成本低。
    • 专精 Web/PWN 的选手:ADP 通常只出这两种题型,其他方向(如逆向、密码学)不参与。

    总结ADP 就是 **“简化版攻防”**,把持续对抗拆成单次任务,让选手和主办方都轻松点~

  4. 混合模式(Mix) (解题 + 攻防二合一

* 机制 *:结合解题与攻防,解题获取基础分后进入攻防对抗,分数动态增减。

* 典型赛事 *:iCTF 国际赛、RealWorld CTF(RWCTF)。

  1. 其他衍生模式

*KoH(抢占山头)*:攻击并控制中央服务器,写入队伍标识后防御加固,定期判定得分。

RW(真实世界):模拟真实漏洞利用,比如攻击物联网设备。

* 战争分享模式 *:队伍互相出题 + 解题 + 分享思路,综合评分。

*AI 自动化(RHG)*:编写自动化程序(bot)全自动挖掘漏洞并提交 flag。

CTF 主要题型及考察重点

1
2
3
4
5
6
7
8
9
| 题型          | 考察内容                  | 常用工具/技能                              |
|---------------|--------------------------------------------------------------------------|--------------------------------------------|
| **Web** | SQL注入、XSS、文件上传、代码审计等漏洞利用 | Burp Suite、sqlmap、浏览器开发者工具 |
| **Reverse** | 软件逆向分析、反编译、反调试 | IDA Pro、OllyDbg、GDB |
| **PWN** | 二进制漏洞利用(栈溢出、堆溢出等) | pwntools、ROPgadget |
| **Crypto** | 古典密码(如凯撒密码)、现代加密算法(AES、RSA)及自创加密技术破解 | CryptoSearcher、RSATool2 |
| **MISC** | 隐写术、流量分析、电子取证、数据编码/解码 | Stegsolve、Wireshark、Binwalk |
| **Mobile** | 安卓逆向分析、APK反编译 | AndroidKiller、jd-gui |
| **PPC** | 编程算法实现(如批量数据处理) | Python、C语言

CTF 学习路线

  1. 初期基础

    *Web 开发 *:HTML/CSS/JS、PHP+MySQL 开发动态网站,掌握基础漏洞原理(如 SQL 注入)。

    * 工具入门 *:Burp Suite 抓包改包、Python 脚本编写(requests 库)。

  2. 中期漏洞专项

    * 核心漏洞 *:SQL 注入、文件上传、命令执行(RCE)、XSS/CSRF。

    * 靶场练习 *:sqli-labs、upload-labs、DVWA。

  3. 后期综合实战

    * 赛事参与 *:BUUCTF、CTFHub 等平台刷题,参与校赛 / XCTF 联赛。

    * 知识扩展 *:逆向工程(《加密与解密》)、二进制漏洞(《IDA Pro 权威指南》)。

比赛形式

CTF 比赛一般分为线上赛和线下赛。通常来说,线上赛多为 初赛 ,线下赛多为 决赛 ,但是也不排除直接进行

线上

选手通过主办方搭建的比赛平台在线注册,在线做题并提交 flag,线上比赛多为解题模式,攻防模式较为少见。通常来说对于长时间未解出的题目,主办方会酌情给出 == 提示 ( Hint )== 来帮助选手做题。

线下

选手前往比赛所在地,现场接入比赛网络进行比赛,线下多为 AWD 模式,近年来随着比赛赛制的不断革新,线下赛也会出现多种模式混合进行,例如结合解题 + AWD解题 + RW 等等

题目类型

​ 在 CTF 中主要包含以下 5 个大类的题目,有些比赛会根据自己的侧重点单独添加某个分类,例如 == 移动设备(Mobile) , 电子取证(Forensics) == 等,近年来也会出来混合类型的题目,例如在 Web 中存在一个二进制程序,需要选手先利用 Web 的漏洞获取到二进制程序,之后通过逆向或是 Pwn 等方式获得最终 flag

Web

​ Web 类题目大部分情况下和网、Web、HTTP 等相关技能有关。主要考察选手对于 Web 攻防的一些知识技巧。诸如 == SQL注入XSS代码执行代码审计 == 等等都是很常见的考点。一般情况下 Web 题目只会给出一个能够访问的 URL。部分题目会给出附件

Pwn

​ Pwn 类题目重点考察选手对于 == 二进制漏洞的挖掘和利用 能力,其考点也通常在 堆栈溢出格式化漏洞UAFDouble Free == 等常见二进制漏洞上。选手需要根据题目中给出的二进制可执行文件进行逆向分析,找出其中的漏洞并进行利用,编写对应的漏洞攻击脚本 ( Exploit ),进而对主办方给出的远程服务器进行攻击并获取 flag 通常来说 Pwn 类题目给出的远程服务器信息为 nc IP_ADDRESS PORT ,例如 nc 1.2.3.4 4567 这种形式,表示在 1.2.3.4 这个 IP 的 4567 端口上运行了该题目

Reverse

Re 类题目考察选手 逆向工程 能力。题目会给出一个可执行二进制文件,有些时候也可能是 Android 的 APK 安装包。选手需要逆向给出的程序,分析其程序工作原理。最终根据程序行为等获得 flag

Crypto

​ Crypto 类题目考察选手对 密码学 相关知识的了解程度,诸如 RSAAESDES 等都是密码学题目的常客。有些时候也会给出一个加密脚本和密文,根据加密流程逆推出明文。

Misc

​ Misc 意为杂项,即不包含在以上分类的题目都会放到这个分类。题目会给出一个附件。选手下载该附件进行分析,最终得出 flag。

​ 常见的题型有图片隐写、视频隐写、文档隐写、流量分析、协议分析、游戏、IoT 相关等等。五花八门,种类繁多。

刷题网站

CTFHub

Misc

流量分析
数据库流量
  • Mysql 流量

服务端回一个 Response OK , 至此,登录验证就算是完成啦~

后面客户端向服务端发起查询请求:

==select @@version_comment limit 1==

注意得选择分组字节流才行

  • Redis 流量
  • MongoDB 流量

注意:搜索时要这样才行 ==ctfhub {== 不然找不到。

协议流量分析
  • ICMP-data

注意:tshark - r 「xxx」 -Y 「相关筛选命令」 -T fields -e data > xxx

关键参数

  • -Y 「icmp && icmp.type==8」:过滤 ICMP 类型为 8(Echo Request)的包 。
    • 这边等于 0 和 8 都可以,8 代表请求包,0 代表应答包
  • -T fields -e data:仅输出 data 字段的十六进制内容 。
  • flag.txt:将结果重定向到文件。

常见 CTF 题型分析
单向传输(Type 8):
Flag 数据通过客户端发送的多个请求包传输(如每个包携带一个字符)。

​ 解法:过滤 Type 8 并提取 data。
​ 双向传输(Type 8 + Type 0):
​ Flag 可能分散在请求和响应包中(需同时分析两者)。

​ 解法:过滤 icmp(不限制 Type),再根据包方向(ip.src/ip.dst)分类处理。

​ 隐蔽回传(Type 0):
​ 恶意程序通过响应包将敏感数据回传给攻击者(如数据外泄)。

​ 解法:过滤 Type 0 并提取 data。

总结

  • Type 8 vs Type 0:取决于 Flag 数据的传输方向(谁发送的包)。
  • CTF 经验法则: 如果题目提示 “客户端发送了异常 Ping 包”,优先用 Type 8 ;若提示 “服务器返回了异常应答”,则用 Type 0

python 代码

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
26
27
# coding = utf-8
# --author:valecalida--
from os import system as get_hex
# 调用tshark时需要将tshark加入环境变量,且脚本需要与流量包在一个路径下

get_hex("C:\\HelloCTF\\Toolkit\\Forensic\\Wireshark\\tshark -r C:\\Users\\HelloCTF_OS\\Desktop\\868_11254f60d1efdd79d251ec10b3db0f455262726b\\icmp_data.pcap -Y \"icmp && icmp.type==8\" -T fields -e data > flag.txt")
f = open('flag.txt', 'r')
flag = ''
for line in f.readlines():
#int(..., 16)将十六进制字符串转为十进制整数
flag += chr(int(line[16:18], 16))
print(flag)
f.close()


#使用pyshark解析并获取flag
import pyshark

# 显式设置tshark路径
# pyshark.tshark.tshark.TSHARK_PATH = r'C:\\HelloCTF\\Toolkit\\Forensic\\Wireshark\\tshark.exe'

cap = pyshark.FileCapture("C:\\Users\\HelloCTF_OS\\Desktop\\868_11254f60d1efdd79d251ec10b3db0f455262726b\\icmp_data.pcap", display_filter="icmp && icmp.type==8")
flag = ''
for i in range(0, 25):
flag += chr(int(str(cap[i].icmp.data_data)[24:26], 16))
print(flag)
cap.close()
  • ICMP-Length
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
# coding = utf-8
# --author:valecalida--
from os import system as get_code
# # 调用tshark时需要将tshark加入环境变量,且脚本需要与流量包在一个路径下

get_code("C:\\HelloCTF\\Toolkit\\Forensic\\Wireshark\\tshark -r C:\\Users\\HelloCTF_OS\\Desktop\\869_0a362d3ce368678532f6a8e9fdf8cb531ec48572\\icmp_len.pcap -Y \"icmp && icmp.type==0\" -T fields -e data.len > flag.txt")
f = open('flag.txt', 'r')
flag = ''
for line in f.readlines():
flag += chr(int(line.strip()))
print(flag)
f.close()


#使用pyshark来对流量进行解析

# coding = utf-8
# --author: valecalida--
import pyshark
cap = pyshark.FileCapture('C:\\Users\\HelloCTF_OS\\Desktop\\869_0a362d3ce368678532f6a8e9fdf8cb531ec48572\\icmp_len.pcap', display_filter="icmp && icmp.type==8")
flag = ''
for i in range(0, 18):
flag += (chr(int(cap[i].icmp.data_len)))
print(flag)
cap.close()

彩蛋

首页

在 FuzzDomain 工具中,{fuzz}.ctfhub.com 的设计核心是自动化生成测试目标。具体来说:

  • 动态占位符作用
    • {fuzz} 是一个动态替换标记,相当于批量操作的 "通配符"。工具会从您指定的字典文件(图中路径 Dicwww.txt)中逐行读取内容,将每一行文字替换到 {fuzz} 的位置,生成如 www.ctfhub.com、api.ctfhub.com 等完整域名进行探测。
  • 安全测试实战场景
    • 这种设计特别适用于 CTF 竞赛 / 渗透测试中:假设攻击者想找出目标网站(如 ctfhub.com)隐藏的子域名,但无法穷举所有可能性。通过加载包含常见子域名字段的字典(如 admin、test、dev 等),工具可自动化生成并验证数千种组合,快速定位有效域名。
  • 扩展性设计
    • 界面下方的字符规则 pqrstuvwxyz0123456789 Min 1 Max 3 表明:除了使用预设字典,工具还支持按字符规则自动生成测试内容。例如当勾选该规则时,会自动生成 1-3 位包含指定字符的随机组合(如 p1、2qr 等),与 {fuzz} 配合实现双重探测策略。

这种 {占位符}+ 字典 / 规则的组合方式,在保证测试覆盖率的同时大幅提升效率,是网络安全工具中常见的设计范式

1
2
3
4
软件名称:FuzzDomain
源码地址:https://github.com/Chora10/FuzzDomain
下载地址:https://pan.baidu.com/s/1o8bMaca 密码:is5f
官方博客:http://www.ms509.com/
彩蛋
题目入口(该题需要之前的题目提交 flag 后不关闭环境,但是我这边提交后自动关闭环境没有办法实现)
WriteUp
工具

在 CTFHub 工具 页面翻到最后发现 egg

赛事
真题
投稿提交

https://github.com/guyoung/CaptfEncoder 或者使用随波逐流即可

flag[36:42]:a5f3a8

https://writeup.ctfhub.com/Other/ 投稿说明 /eaed3abd.html

AES 解密http://tool.chacuo.net/cryptaes

Web

目录遍历

知识点

​ 目录遍历是 web 中常见的基础操作,我们通常会通过目录的遍历来发现是否存在对我们有用的信息。

PHPINFO
  • ​ PHPinfo:输出 PHP 当前状态的大量信息,包含了 PHP 编译选项、启用的扩展、PHP 版本、服务器信息和环境变量(如果编译为一个模块的话)、PHP 环境变量、操作系统版本信息、path 变量、配置选项的本地值和主值、HTTP 头和 PHP 授权信息 (License)。
  • ​ phpinfo () 同时是个很有价值的、包含所有 EGPCS (Environment, GET, POST, Cookie, Server) 数据的调试工具。
备份文件下载
网站源码
  • 知识点
    • 常见的网站源码的文件名有:『web』, 『website』, 『backup』, 『back』, 『www』, 『wwwroot』, 'temp’等等。
    • 常见的网站源码备份文件后缀有:『tar』, 『tar.gz』, 『zip』, 'rar’等等。

先使用 /www.zip 等给的不同来试,发现只有 /www.zip 有东西,而且直接打开还没有信息,只能网站打开才行

bak 文件

bak 文件泄露

​ 有些时候网站管理员可能为了方便,会在修改某个文件的时候先复制一份,将其命名为 xxx.bak。而大部分 Web Server 对 bak 文件并不做任何处理,导致可以直接下载,从而获取到网站某个文件的源代码

得加入 /index.php.bak 尤其是最后面的.bak 才行

vim 缓存

​ vim 交换文件名

  • 在使用 vim 时会创建临时缓存文件,关闭 vim 时缓存文件则会被删除,当 vim 异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
  • 以 index.php 为例:
    • 第一次产生的交换文件名为 .index.php.swp
  • 再次意外退出后,将会产生名为 .index.php.swo 的交换文件
  • 第三次产生的交换文件则为 .index.php.swn

vim 一旦异常退出就会生成 swp 文件,且是隐藏文件。隐藏文件要加点,首页也说了 flag 在 index.php 源码中 所以 /.index.php.swp 直接下载。

.DS_Store
  • .DS_Store 是 Mac 下 Finder 用来保存如何展示文件 / 文件夹的数据文件,每个文件夹下对应一个
  • 如果开发 / 设计人员将.DS_Store 上传部署到线上环境,可能造成文件目录结构泄漏,特别是备份文件、源代码文件。
  • 在发布代码时未删除文件夹中隐藏的.DS_store,被发现后,获取了敏感的文件名等信息。

下载后打开之后得用 linux 中的 cat 查看并且再用 URL 接着执行查看即可

Git 泄露

BUUCTF

Web

[极客大挑战 2019] EasySQL
思路

找输入点、试闭合符、构造万能密码

  1. 万能密码构造公式

    1
    2
    3
    4
    5
    6
    7
    SQL' or 1=1 # 
    -- 或带闭合的版本(如本题用`' or true #`

    万能密码构造公式
    SQL
    ' or 1=1 #
    -- 或带闭合的版本(如本题用`' or true #`)
  2. 进阶操作 若过滤了空格用 /**/ 代替,过滤 or|| 连接符等

  3. 工具使用 HackBar 直接修改 URL 参数发送请求(GET 传参用 %23 代替 #

Crypto

一眼就解密
MD5

md5 在线解密破解,md5 解密加密

Url 编码
看我回旋踢

synt=flag

摩丝
password(一开始有点懵,算是一种 iq 题)

判断出是 10 个数,数字占 8 个,那么就从姓名缩写来看了

变异凯撒

​ 上面的 acsii 码值对比表可以看到 == 第一个字符向后移了 5,== 第二个向后移了 6, 第三个向后移了 7, 以此类推,很容易想到变异凯撒即每个向后移的位数是前一个加 1

Quoted-printable

Quoted-printable 将任何 8-bit 字节值可编码为 3 个字符:一个等号 "=" 后跟随两个十六进制数字 (0–9 或 A–F) 表示该字节的数值。
​ 例如,ASCII 码换页符(十进制值为 12)可以表示为 "=0C", 等号 "="(十进制值为 61)必须表示为 "=3D",gb2312 下 “中” 表示为 = D6=D0。除了可打印 ASCII 字符与换行符以外,所有字符必须表示为这种格式。

原文链接:https://blog.csdn.net/MikeCoke/article/details/105877373

篱笆墙的影子
Rabbit
RSA

python 代码

1
2
3
4
5
6
import gmpy2
p = 473398607161
q = 4511491
e = 17
d = int(gmpy2.invert(e,(p-1)*(q-1)))
print(d)
丢失的 MD5

python 代码

1
2
3
4
5
6
7
8
9
import hashlib
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update('TASC'.encode('utf-8')+chr(i).encode('utf-8')+'O3RJMV'.encode('utf-8')+chr(j).encode('utf-8')+'WDJKX'.encode('utf-8')+chr(k).encode('utf-8')+'ZM'.encode('utf-8'))
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print (des)
Alice 与 Bob

在线分解质因数计算器工具 - 在线计算器 - 脚本之家在线工具

CTF 在线工具 - 哈希计算 | MD5、SHA1、SHA256、SHA384、SHA512、RIPEMD、RIPEMD160

大帝的密码武器

密文发现 C 为大写字母,而 C 移 13 位应该是大写 P,替换后,得到最终 flag。

rsarsa

使用 RSA Tool2 工具解题

python 代码

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
26
# import gmpy2
# e = 65537
# p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
# q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
# n = p*q
# #密文
# C = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

# d =gmpy2.invert(e,(p-1)*(q-1))
# print(d)
# #求明文
# M = pow(C,d,n) #快速求幂取模运算
# print(M)

e = 65537
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
n = p*q
#密文
C = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977

#求明文
M = pow(C,d,n) #快速求幂取模运算
print(M)
Windows 系统密码

两个都用 Md5 试一下。

信息化时代的步伐

题目说结果为中文,结合 36(4x9)位的纯数字密文,猜测为中文电码解密。

电报码在线翻译(国际摩尔斯电码及中文电码) - 千千秀字

凯撒?替换?呵呵!

Quipqiup - Cryptoquip 和 Cryptogram 求解器

萌萌哒的八戒

binwalk 然后猪圈密码即可

权限获得第一步

Misc

金三胖

使用随波逐流、StegSolve-FrameBrower

你竟然赶我走

使用 strings、随波逐流、010Editor 方法

二维码

可以使用 010Editor 或者是 strings 进行查看,发现里面还有文件,所以采用了修改后缀名为 zip 发现有密码,或者使用 Binwalk 进行也可以,然后使用 archar 或者 ziperllo 进行爆破,出来密码即可。

大白
python 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import zlib
import struct

with open("C:\\Users\HelloCTF_OS\\Desktop\\dabai.png", "rb") as f:
data = f.read()
crc32_original = int(data[29:33].hex(), 16) # 原始 CRC

for w in range(4096):
for h in range(4096):
# 重构 IHDR 数据块
ihdr_data = data[12:16] + struct.pack('>i', w) + struct.pack('>i', h) + data[24:29]
crc32 = zlib.crc32(ihdr_data) & 0xffffffff
if crc32 == crc32_original:
print(f"正确宽高:{w} x {h} (Hex: {hex(w)}, {hex(h)})")
exit()

使用随波逐流或者 010Editor 进行修改宽高比

wireshark

http && http.request.method == 「POST」

分析图片信息
乌镇峰会种图

strings 就行

N 种方法解决

使用随波逐流工具

https://the-x.cn/encodings/Base64.aspx

基础破解

使用 archpr 工具即可,选数字

文件中的秘密

EXIF 信息.org:https://exifinfo.org](https://exifinfo.org/

zip 伪加密
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
26
27
28
29
30
31
32
33
34
35
36
步骤1:识别ZIP文件结构
ZIP文件由三部分组成,其十六进制特征如下:

压缩源文件数据区(Local File Header)

起始标志:50 4B 03 04
全局方式位标记位置:起始标志后的第3-4字节(偏移+2处)
功能:存储实际文件数据,若未加密则标记为00 00。

压缩源文件目录区(Central Directory)

起始标志:50 4B 01 02
全局方式位标记位置:起始标志后的第5-6字节(偏移+4处)
功能:记录文件路径信息,伪加密的关键修改位置在此处。

目录结束标志(End of Central Directory)
起始标志:50 4B 05 06,用于定位整个压缩包结构。

步骤2:使用010 Editor定位数据区与目录区
打开文件:
用010 Editor打开ZIP文件,通过搜索功能(Ctrl+F)输入以下特征码快速定位:
数据区:搜索50 4B 03 04,每个匹配项对应一个文件的头部 。
目录区:搜索50 4B 01 02,每个匹配项对应一个目录条目。
检查全局方式位标记:
数据区:查看50 4B 03 04后的第3-4字节(偏移+2),未加密应为00 00,加密为09 00 。
目录区:查看50 4B 01 02后的第5-6字节(偏移+4),伪加密时此处为09 00,需改为00 00 。
步骤3:修改伪加密
判断加密类型:
无加密:数据区和目录区的全局方式位均为00 00。
伪加密:数据区为00 00,目录区为09 00 。
真加密:两者均为09 00。
修改目录区标记:
定位到目录区的50 4B 01 02,将其后第5-6字节的09 00改为00 00 。
注意:若存在多个目录条目(如多层子文件夹),需逐个检查并修改
保存并验证:
保存修改后的文件,尝试解压。若成功则伪加密已解除;若失败需检查其他可能的加密位或多级目录结构.

一找 PK 头,二看标志位,奇改偶,伪加密解除

将 09 改为 00 即可

被嗅探的流量
LSB

先单蓝后双红绿,三通道组合最后试

Alpha 通道碰不得,藏密必选 RGB

位平面选择原则(三句黄金口诀)

口诀①:「LSB 隐写 0 位藏,9 成题目在此方」 口诀②:「红绿蓝三原色,同步勾选效率强」 口诀③:「高位平面先别慌,特殊变形才要防」

  • 为何只勾选 0 位? LSB 隐写本质是将数据藏在像素值二进制的最低位(第 0 位),如同把字写在纸的最边缘。 示例:像素值 255 的二进制是 11111111 ,修改第 0 位后变为 11111110 (差值仅 1,肉眼不可见)

  • 什么情况要勾选 1/2 位? 当题目明确提示 "高位隐写" 或常规 0 位无结果时(约占 CTF 题 10%),按以下优先级排查:

    1
    2
    3
    4
    5
    6
    # 位平面优先级顺序(覆盖99%题目)
    priority = [
    (0,0,0), # 红绿蓝0位(基础题)
    (0,1,0), # 红0+绿1+蓝0(进阶组合)
    (1,1,1) # 三通道1位(反套路题)
    ]
rar

使用 archpr 工具即可,选数字

qr

使用 qr serach 工具扫一下即可

镜子里面的世界

使用 steg 里面的 dataexract 选择三个 0 即可

爱因斯坦

binwalk -e 『/mnt/c/Users/HelloCTF_OS/Desktop/ 爱因斯坦 /misc2.jpg』

1
2
3
# 真加密:数据区(50 4B 03 04后)和目录区(50 4B 01 02后)均含09 00 
# 伪加密:仅目录区含09 00
hexdump -C '/mnt/c/Users/HelloCTF_OS/Desktop/爱因斯坦/_misc2.jpg.extracted/109B3.zip' | grep -A1 "PK.."
ningen
安装 Binwalk
1
2
3
4
5
6
7
8
9
10
# 克隆仓库并切换到稳定分支(推荐 v2.3.2)
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
git checkout v2.3.2 # 切换到稳定版本

# 安装依赖脚本(关键步骤!)
sudo ./deps.sh # 此脚本会安装编译所需的 Python 模块和系统库

# 编译并安装到系统路径
sudo python3 setup.py install --force # --force 覆盖旧文件

使用 BInwalk 提取,或者使用 010 删除前面保存 rar 然后密码破解即可

小明的保险箱

通过 ff d9 发现 rar

easycap

通过追踪流查看

隐藏的钥匙

使用 strings 发现 flag 然后 Base64 解密即可

另外一个世界

ASCII 文本,十六进制,二进制,十进制,Base64 转换器

使用二进制解密即可

s

数据包中的线索

通过追踪流发现有 = 号,判断可能是 base64, 但是过长考虑可能是图片转 base64 那么,需要通过网站并且添加头 ==“data:image/jpeg;base64,” 点击追加 img 标签 ==,

图片在线转换 base64 编码 - 在线 base64 编码转换成图片工具 (jsons.cn)](http://www.jsons.cn/img2base64/)

神秘龙卷风

BrainFuck 解密

FLAG

使用 stegsolve 进行 rgb 查看,然后保存 1.zip, 因为是 pk 开头

假如给我三天光明

得到解压密码是 kmdonowg

Morse Code Audio Decoder

解码得:CTFWPEI08732?23D 换成 flag 还要换小写 flag

后门查杀

使用 D 盾或者火绒安全进行查找然后再找到对应的文件查看即可

webshell 后门 (少 zp 文件)
来首歌吧

使用在线工具进行解密

  1. MorseFM https://morsefm.com/ (支持 WAV/MP3 等格式,支持多语言,适合快速解码)

  2. Morse Code Magic https://morsecodemagic.com/morse-code-audio-decoder/ (专注 WAV/MP3 解码,4 分钟音频 5 秒完成)

面具下的 flag

可以先用 strings 提取,但是需要对比两个找不同,发现少两个 + 号再解析不然出错

荷兰宽带数据泄露

NirSoft - freeware utilities: password recovery, system utilities, desktop utilities

搜索 username 或者 password,这可能是一个路由器配置文件 (bin),所以用到 RouterPassView 软件

九连环

通过随波逐流发现有伪加密,所以搜索 50 4B 01 02 修改

安装命令:sudo apt update && sudo apt install steghide

执行命令:steghide extract -sf 『/mnt/c/Users/HelloCTF_OS/Desktop/389a0c11-d0df-4180-829a-b529e6b0a1bc/_123456cry.jpg.extracted/asd/good - 已合并.jpg』

认真你就输了

随波逐流发现文件头是 zip 文件,要么修改文件要么 binwalk 就行

被偷走的文件

pcap 文件用 wireshark 并且发现 ftp-data 有 rar 文件进行到处对象导出即可。

导出文件三种方法:

  1. 到处对象
  2. 追踪流然后原始数据导出即可
  3. 导出字节流
被劫持的神秘礼物

使用 wireshark 发现 ==(application/x-www-form-urlencoded)==,之后根据题意找到账号密码拼接,使用如下命令即可。

1
2
3
echo -n "adminaadminb" | md5sum

php -r "echo md5('adminaadminb');"
藏藏藏

打开 010 发现 pk 删除前面所有内容保存 zip 解压后扫码即可

佛系青年

伪加密修改后查看 fo.txt 底下那句话使用随波逐流解密即可

你猜我是个啥

使用 strings 查看即可

秘密文件

筛选后发现有 ftp 优先查看,发现里面有 rar 文件,还有一点其实随波逐流里面也可以直接查看并且通过分离破解即可获取 flag.

刷新过的图片
1
java Extract ``/``图片的绝对路径 [``-``p 密码] [``-``e 输出文件]

题目说 “刷新过的图片”,结合键盘上刷新键为 F5 可判断此题为 F5 隐写,运用工具 F5-steganography 可以对其中的内容进行提取

项目首页 - F5-steganography:F5 steganography - GitCode

cd F5-steganography-master

java Extract 『/mnt/c/Use
rs/HelloCTF_OS/Desktop/a05ed035-b476-49d6-9b32-462ff13c5944/Misc.jpg』

鸡你太美

发现缺少 gif 头,47 49 46 38.

just_a_rar

破解密码然后查看 exif 信息即可

snake (原先的网站没有了,所以解析不了)
1
flag{who_knew_serpent_cipher_existed}

Serpent Encryption – Easily encrypt or decrypt strings or files

菜刀 666

菜刀使用 http.request.methodPOST,并且查看 z1 和 z2,发现 z2 有 FF D8 是 jpg 导入 010 发现密码,然后解压即可

一叶障目

可以使用之前的 Python 脚本或者随波逐流即可

纳尼

如果 git 分帧查看不了,那么就用 stegsolve 的 framebrower 来查看即可。

神奇的二维码

Python 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#长内容base64
import base64

def decode(f):
n = 0;
while True:
try:
f = base64.b64decode(f)
n += 1
except:
print('[+]Base64共decode了{0}次,最终解码结果如下:'.format(n))
print(str(f,'utf-8'))
break

if __name__ == '__main__':
f = open('C:\\Users\\HelloCTF_OS\\Desktop\\base64.txt','r').read()
decode(f)

粗线条是 - , 细线条是 .

excel 破解

使用 strings 或者随波逐流查看即可

来题中等的吧

粗细记录摩斯密码即可

谁赢了比赛?

使用 Binwalk 进行分离并且破解密码,之后使用 qcr 进行二维码解析

[ACTF 新生赛 2020] outguess

发现 exif 再通过社会主义解密,然后通过题目猜测发现是 outguess,通过一下密码解密

1
2
3
#outguess -k 密钥 -r 输入文件 输出文件

outguess -k 'xxx' -r mmm.jpg flag.txt

outguess -k 『abc』 -r 『/mnt/c/Users/HelloCTF_OS/Desktop/attachment/tmp/huhuhu/mmm.jpg』 『/mnt/c/Users/HelloCTF_OS/Desktop/attachment/tmp/huhuhu/flag.txt』

梅花香之苦寒来

使用 gnuplot 画图即可

生成文本后使用 plot xxx.

python 代码

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
26
27
28
29
# with open('C:\\Users\\HelloCTF_OS\\Desktop\\hex.txt', 'r') as h:     # hex.txt为要转换的文本文件
# val = h.read()
# h.close()

# with open('C:\\Users\\HelloCTF_OS\\Desktop\\result.txt', 'w') as re: # 转换完成后写入result.txt
# tem = ''
# for i in range(0, len(val), 2):
# tem = '0x' + val[i] + val[i+1]
# tem = int(tem, base=16)
# print(chr(tem), end="")
# re.write(chr(tem))
# re.close()

with open('C:\\Users\\HelloCTF_OS\\Desktop\\result.txt', 'r') as res: # 坐标格式文件比如(7,7)
re = res.read()
res.close()

with open('C:\\Users\\HelloCTF_OS\\Desktop\\gnuplotTxt.txt', 'w') as gnup: # 将转换后的坐标写入gnuplotTxt.txt
re = re.split()
tem = ''
for i in range(0, len(re)):
tem = re[i]
tem = tem.lstrip('(')
tem = tem.rstrip(')')
for j in range(0, len(tem)):
if tem[j] == ',':
tem = tem[:j] + ' ' + tem[j+1:]
gnup.write(tem + '\n')
gnup.close()
[WUSTCTF2020] find_me(在线网站打不开)

使用 exiftool xxx,然后盲文在线加解密:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen

1
flag{y$0$u_f$1$n$d$_M$e$e$e$e$e}

穿越时空的思念

之前使用静音删除左声道,单声道导出右声道 wav 使用在线网站但是解析有些许错误,所以使用手动解析

[GUET-CTF2019]KO

使用 brainfuck 解密即可

[ACTF 新生赛 2020] base64 隐写

python 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
binstr=""
strings = open(r'C:\Users\HelloCTF_OS\Desktop\attachment\tmp\近在眼前\ComeOn!.txt').read()
e = strings.splitlines()
for i in e:
if i.find("==") > 0:
temp = bin((base64.find(i[-3]) & 15))[2:]
# 取倒数第3个字符,在base64找到对应的索引数(就是编码数),取低4位,再转换为二进制字符
binstr = binstr + "0" * (4 - len(temp)) + temp # 二进制字符补高位0后,连接字符到binstr
elif i.find("=") > 0:
temp = bin((base64.find(i[-2]) & 3))[2:] # 取倒数第2个字符,在base64找到对应的索引数(就是编码数),取低2位,再转换为二进制字符
binstr = binstr + "0" * (2 - len(temp)) + temp # 二进制字符补高位0后,连接字符到binstr
str = ""
for i in range(0, len(binstr), 8):
str = str + chr(int(binstr[i:i + 8], 2)) # 从左到右,每取8位转换为ascii字符,连接字符到字符串
print(str)
[SWPU2019] 我有一只马里奥

notepad 1.txt:flag.txt

使用工具 NtfsStreamsEditor 或 AlternateStreamView 打开存放 1.txt 文件的文件夹,扫描出现隐藏文件文件,导出后打开,得到 flag。

AlternateStreamView (跳转页面后,向下滑动,下载对应的 32 或 64 位软件)

[MRCTF2020]ezmisc

修改宽高

[GXYCTF2019]gakki

python 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding:utf-8 -*-
#Author: mochu7
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- =\\{\\}[]"
strings = open(r'C:\Users\HelloCTF_OS\Desktop\attachment\_wolaopo.jpg.extracted\218E8\flag.txt').read()

result = {}
for i in alphabet:
counts = strings.count(i)
i = '{0}'.format(i)
result[i] = counts

res = sorted(result.items(),key=lambda item:item[1],reverse=True)
for data in res:
print(data)

for i in res:
flag = str(i[0])
print(flag[0],end="")
[HBNIS218]caesar

python 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def decrypt(ciphertext, shift):
"""移位解密函数"""
plaintext = ''
for char in ciphertext:
if char.isalpha(): # 如果是字母,进行移位解密
if char.isupper():
plaintext += chr((ord(char) - shift - 65) % 26 + 65) # 大写字母移位解密
else:
plaintext += chr((ord(char) - shift - 97) % 26 + 97) # 小写字母移位解密
else: # 如果不是字母,直接输出
plaintext += char
return plaintext

# 加密密文和移位数
ciphertext = 'gmbhjtdbftbs'
shift = 3
ciphertext = ciphertext.lower()
# 小写易于观察
# 枚举所有可能的移位数,输出所有解密结果
for i in range(26):
plaintext = decrypt(ciphertext, i)
print("%d %s"% (i, plaintext))

随波逐流

[SUCTF2018]single dog

aaencode 编码

黑客帝国

导入十六进制,然后发现打开不了,换成 jpg 头,也就是 FF D8 4A46 之前的删除掉

[HBNIS2018] 低个头

键盘按键

[SWPU2019] 伟大的侦探

使用 010 Editor 打开密码.txt 文件,选择编辑方式为 EBCDIC (B),找到明文密码

之后对照跳舞的小人即可

[BUUCTF SWPU2019] 伟大的侦探 1 - 阿里云开发者社区

[MRCTF2020] 你能看懂音符吗

修改 62 51 为 51 62 然后保存解压,之后发现 Binwalk 有文件,之后 document.xml 里查到音符,使用芊芊秀字(但是失效了)就可以了。

我吃三明治

foremost -i /mnt/c/Users/HelloCTF_OS/Desktop/attachment/flag.jpg, 发现有两张图片,但是打开还是之前的那张,通过题解发现 FF D8 是开头,FF D9 是结尾,在 FF D8 和 FF D9 之间有信息。

[ACTF 新生赛 2020] NTFS 数据流

跟之前的一道题类似使用 alternatestreamview-x64 打开文件在导出即可。

[SWPU2019] 你有没有好好看网课?

使用数字发现四位不够,一位位加到 6 位即可,

使用 kinovea 软件,根据图片说的 5.20 和 7.11 其实是 5.67 左右在灯上出现内容,然后第一处为敲击码

CTF 在线工具 - 在线敲击码 | 敲击码编码 | 敲击码算法 | tap code

基于 5×5 方格波利比奥斯方阵来实现的,不同点是是用 K 字母被整合到 C 中,因此密文的特征为 1-5 的两位一组的数字,编码的范围是 A-Z 字母字符集,字母不区分大小写。
..... ../... ./... ./... ../

解码方法: 每组 / 分隔的符号对应一个字母,例如:

  • ..... .. → 第 5 行第 2 列 → W
  • ... . → 第 3 行第 1 列 → L
  • 完整密文 WLLM → 转为小写 wllm

也可以通过 52313132 来解码,就是数点即可。

然后根据 7.37 时候发现编码

之后拼接起来两个解码信息进行解压,然后使用 strings 或者随波逐流即可查看信息.

扩展知识:

​ 查询多个信息

​ 逻辑或

​ strings xxx | grep -iE 「flag|ctf」

  • -i :忽略大小写
  • -E :启用扩展正则表达式,允许使用 | 符号分隔多个模式

​ 逻辑与

​ strings xxx | grep -i 「flag」 | grep -i 「ctf」

查找并显示头尾匹配结果

1
2
trings xxx | grep -iE "flag|ctf" | head -n 10  # 显示前10条匹配结果
strings xxx | grep -iE "flag|ctf" | tail -n 10 # 显示后10条匹配结果

结合十六进制查看工具 如果需要分析二进制文件的特定偏移:

1
2
xxd xxx | head -n 20  # 查看文件头部十六进制内容
hexdump -C xxx | tail -n 20 # 查看文件尾部十六进制内容

xxd:生成十六进制和 ASCII 表示
hexdump -C:经典格式的十六进制转储

sqltest
1
2
3
4
5
6
7
8
9
tshark -r /mnt/c/Users/HelloCTF_OS/Desktop/sqltest.pcapng -Y "http.request" -T fields -e http.request.full_uri > data.txt

'''
-r 读取文件
-Y 过滤语句
-T pdml|ps|text|fields|psml,设置解码结果输出的格式
-e 输出特定字段
http.request.uri http请求的uri部分
'''

python 代码

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# import urllib.parse
# f = open(r"C:\Users\HelloCTF_OS\Desktop\data.txt","r").readlines()

# s = []
# for i in range(627,972):
# data = urllib.parse.unquote(f[i]).strip()
# payload = data.split("and")[1]
# positions = payload.find("from db_flag.tb_flag limit 0,1)), ")
# data1 = payload[positions+35:].split(",")[0]
# data2 = payload[positions+35:].split(">")[1]
# s.append([data1,data2])

# for i in range(1,len(s)):
# if s[i][0]!=s[i-1][0]:
# print(chr(int(s[i-1][1])),end="")
# print(chr(int(s[-1][1])))

import urllib.parse

with open(r"C:\Users\HelloCTF_OS\Desktop\data.txt", "r") as file:
lines = file.readlines()

s = []
for i in range(627, min(972, len(lines))): # 防止越界
try:
data = urllib.parse.unquote(lines[i]).strip()
parts_and = data.split("and")
if len(parts_and) < 2:
continue
payload = parts_and[1]

positions = payload.find("from db_flag.tb_flag limit 0,1)), ")
if positions == -1:
continue

suffix = payload[positions+35:]
parts_comma = suffix.split(",", 1)
if len(parts_comma) < 1:
continue
data1 = parts_comma[0]

parts_gt = suffix.split(">", 1)
if len(parts_gt) < 2:
continue
data2 = parts_gt[1]

s.append([data1, data2])
except Exception as e:
print(f"Skipping line {i} due to error: {e}")

# 输出逻辑
for i in range(1, len(s)):
try:
if s[i][0] != s[i-1][0]:
print(chr(int(s[i-1][1])), end="")
except ValueError:
print(f"? (Invalid: {s[i-1][1]})", end="")

try:
print(chr(int(s[-1][1])))
except ValueError:
print(f"? (Invalid: {s[-1][1]})")
[UTCTF2020]docx

进行 Binwalk 然后再 media 一张张图 png 查看信息

john-in-the-middle

先用导出对象发现很多图片,逐个使用 stegsolve 发现有信息

扩展知识:

zsteg 功能支持 LSB 隐写、zlib 压缩数据、OpenStego 等检测,常用于 CTF 比赛的图片隐写分析

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
26
27
28
29

#步骤 1:安装 Ruby 和 Gem 环境
#若系统中没有 Ruby 或 Gem,需先安装:
sudo apt-get update && sudo apt-get install ruby ruby-dev # 适用于 Debian/Ubuntu/Kali

#步骤 2:更换 Gem 国内源(加速下载)
gem sources --remove https://rubygems.org/
gem sources -a https://gems.ruby-china.com/
gem sources -l # 确认仅显示国内源

#步骤 3:安装 zsteg
sudo gem install zsteg # 需要 root 权限

zsteg -a xxx
zsteg xxx

#导出隐藏图片:
zsteg -e "b8,a,lsb,xy" input.png -> out.png # 提取特定通道生成新图片

#提取隐藏内容:
zsteg -E "b1,bgr,lsb,xy" image.png > output.txt # 导出指定通道数据
zsteg --prime --invert image.png # 反转比特并提取素数像素

#高级功能
#检测zlib压缩数据:
zsteg zlib.bmp -b 1 -o xy -v # -b指定起始比特位,-v显示详细信息

#生成隐写分析报告:
zsteg --all --strings longest image.bmp # 检测所有类型并筛选长字符串
[ACTF 新生赛 2020] swp

发现 zip 文件导出然后使用 strings 查看即可

[GXYCTF2019]SXMgdGhpcyBiYXNlPw==

python 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import base64

def int2Bin(digit):
return bin(digit)[2:] #将索引转成二进制,去掉'0b';


def binAsc(string): #二进制转成ASCII码
temp = ''
for i in range(int(len(string) / 8)):
temp += chr(int(string[i * 8 : i* 8 + 8] , 2))
return temp

def readBase64FromFile(filename):
Base64Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #Base64字符集 已按照规范排列
result = ''
with open(filename ,'r') as f:
for data in f.readlines():
if data.find('==') > 0:
result += int2Bin(Base64Char.index(data[-4]))[-4:] #根据隐写原理,‘==’情况取等号前最后一个字符转换后取后4位
elif data.find('=') > 0:
result += int2Bin(Base64Char.index(data[-3]))[-2:] #根据隐写原理,‘=’情况取等号前最后一个字符转换后取后2位
print(binAsc(result))

readBase64FromFile(r'C:\Users\HelloCTF_OS\Desktop\attachment\flag.txt')
间谍启示录

使用 foremost 然后用 tree 发现文件,重要的是开启隐藏的文件,机密文件查看即可。

小易的 U 盘

使用修改后缀名或者是 foremost 查看,然后根据 strings 或者使用 IDA 查看也行。

1
INF是Device INFormation File的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,是Windows操作系统下用来描述设备或文件等数据信息的文件。INF文件中包含硬件设备的信息或脚本以控制硬件操作。在INF文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等等。

喵喵喵

使用 zsteg 查看然后使用 stegsolve 进行 lsb 隐写保存图片之后修改宽高,使用 QR 进行查看链接下载,注意的是得用 winrar 解压才行,不然 NTFS 查看不到,然后使用 pyc 反编译,使用脚本。

pyc 反编译:https://tool.lu/pyc/

python 代码

1
2
3
4
5
6
7
8
9
10
11
12
ciphertext = ['96', '65', '93', '123', '91', '97', '22', '93', '70', '102', '94', '132', '46', '112', '64', '97', '88',
'80', '82', '137', '90', '109', '99', '112']
ciphertext = ciphertext[::-1]
flag = ''
for i in range(len(ciphertext)):
if (i % 2 == 0):
a = int(ciphertext[i]) - 10
else:
a = int(ciphertext[i]) + 10
a = i ^ a
flag = flag + chr(a)
print(flag)
[WUSTCTF2020] 爬

使用 file 文件查看后缀名,然后转换 word 删除图片,使用十六进制转字符查看即可

https://www.bejson.com/convert/ox2str/

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

微信支付

支付宝

贝宝