CTF密码做题记录以及base系列的编码了解

文章详细介绍了CTF比赛中的四道题目,涉及自定义Base64加密、循环Base系列解密、栅栏解码和凯撒密码等内容,以及Base16、Base32、Base64和Base64url的基本原理和Python实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:CTF五道题(三道必做,两道选做)

1.[BJDCTF 2020]base??

本题是自定义的base64加密表变表,可以创建一个数组来存放自定义的加密表,再将其转换为字符串放入key1中,接下来我们用字符串key2来存放标准加密表,再用一个字符串存放密文,寻找密文在换表中的下标并转换为标准表的密文,图片如下:

题目解出

 

2. [AFCTF 2018]BASE

本题给的文件巨大,需要循环进行base系列解密,直到解不出为止,代码如下

第二题通过

 

3.[LitCTF 2023]Is this only base?

根据提示,先进行栅栏解码,栏数为23

 发现w型符合base64的特点

得到的结果是凯撒密码偏移的结果

 第三题完成

4. [SWPUCTF 2021 新生赛]crypto6

观察给出的文本(由0-9的数字以及A-F的字母组成)可推知最终输出结果为base16代码;根据提示可知源代码进行的编码顺序应为base64-base32-base16
根据结果逆推初始代码:base16-base32-base64

第四题完成

 

5.[SWPUCTF 2021 新生赛]ez_caesar

 先进行 base64解码

 阅读源代码,得出凯撒密码的偏移量是 5,使用工具解密

第五题解出

 

二:base系列编码了解

Base16编码

Base16编码表格

Base16字符表: 0123456789ABCDEF

下标

编码值

下标

编码值

0

0

8

8

1

1

9

9

2

2

10

A

3

3

11

B

4

4

12

C

5

5

13

D

6

6

14

E

7

7

15

F

下标编码值下标编码值

0088

1199

2210A

3311B

4412C

5513D

6614E

7715F

Base16编码⽅式

1. 将数据(根据ASCII编码,UTF-8编码等)转成对应的⼆进制数

2. 然后将所有的⼆进制全部串起来,4个⼆进制位为⼀组,转化成对应⼗进制数。

3. 根据⼗进制数值找到Base16编码表⾥⾯对应的字符

base16是4个⽐特位表⽰⼀个字符,原码是1个字节(8个⽐特位)表⽰⼀个字符,也就是说原先如果使⽤ASCII编码后的⼀个字符,现在转化成两个字符。数据量是原先的2倍。

 

也就是LOVE加密后是4C4F5645

Base32编码

Base32编码表格

Base32字符表: ABCDEFGHIJKLMNOPQRSTUVWXYZ234567

Base32编码⽅式

  1. 将数据(根据ASCII编码,UTF-8编码等)转成对应的⼆进制数
  2. 然后将所有的⼆进制全部串起来,5个⼆进制位为⼀组,若不⾜5位则低位补0,转化成对应⼗进制数。
  3. 若不⾜40位,则补"="

⼀个"="相当于5位,补满40位为⽌。

例:

最后01不⾜5位,低位补全0。补为01000,也就是8然后这才35位,需要末尾补⼀个"="

所以LOVE⽤Base32编码后得到JRHVMRI=

Base32伪代码|实际环境

v3 = 0;

v4 = 0;

v28 = 0;

v5 = 0;

v25 = 0;

v6 = 0;

if ( v30 )

{

do

{

if ( !*(_BYTE *)(v6 + v2) )                 // v2为字符串⾸地址,v60开始遍历

break;

++v6; v5 += 8;

++v3;

}

while ( v6 < v30 );                            // 循环完,v5为将所有字符转换为⼆进制位、的位数

//

v28 = v3;

}

switch ( v5 % 40 )                                // 这⾥对位数是否能整除40做判断,来判断是否添加'='

// v4等于多少就添加⼏个'='

{

case 8u:

v4 = 6;

goto LABEL_10; case 16u:

v4 = 4;

goto LABEL_10; case 24u:

v4 = 3;

goto LABEL_10; case 32u:

v4 = 1;

LABEL_10:

v25 = v4;

break; default: break;

}

v29 = (8 * v3 + 4) / 5;                          // 除以5,算⼀下转换后数据个数

// +4的原因是,向上取整,让余数也算⼀个数据

Base64编码

Base64编码表格

使⽤了ASCII编码中64个可打印的字符(⼤写字母A ~ Z,⼩写字母a ~ z,数字0~9以及"+","/") Base64字符表: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Base64编码⽅式

  1. 将数据(根据ASCII编码,UTF-8编码等)转成对应的⼆进制数
  2. 然后将所有的⼆进制全部串起来,6个⼆进制位为⼀组,若不⾜6位则低位补0,转化成对应⼗进制数。
  3. 若不⾜24位,则补"="

⼀个"=“想当于6个⼆进制位。例:

最后只有4位,低位补全0,则为111100然后3*6=18 不⾜24位,加上⼀个”=" LO加密后是TE8=

Base64伪代码|实际环境

当函数头是这种时候,⼤概率是Base64加密,然后根据字符集来确认

Base64url 编码

字符表中的 ‘+’ → ‘-’ , ‘/’ → ‘_’

总结

名称

下标数字的位个数

编码表字符串

位数不⾜是否会补全=

编码后数据量变化

base16

4

数字0~ 9和字母A~F

不会,位数刚好是4的倍数

由⼀个8位表⽰⼀个字符 变成 4位表⽰⼀个字符,数据量变为原来的2倍

base32

名称

下标数5字的位

⼤写字母A~ Z 和 数字2~7

编码表字符串

位数不⾜是否会补

变为 8/5

编码后数据量变化

个数

⼤写字母A~ Z,⼩写字母a~ z,数字0~9

全=

base64

6

以及"+","/"

变为 8/6=4/3

Base加解密|Python实现

Base16加解密实现

Base16加解密(原始字符表

import base64

original = 'wo tai nan le'

print("1 original: ",type(original),original)

print("2 original.encode('utf-8'): ",type(original.encode('utf-8')),original.encode('utf-8')) str_encode = base64.b16encode(original.encode('utf-8'))

print("3 str_encode: ",type(str_encode),str_encode)

print("4 str(str_encode,'utf-8'): ",type(str(str_encode,'utf-8')),str(str_encode,'utf-8')) str_decode = base64.b16decode(str_encode)

print("5 str_decode: ",type(str_decode),str_decode)

print(str(str_decode,'utf-8'))

输出结果为

关键代码:

base64.b16encode(<'bytes'>) #base16编码

base64.b16decode(<'bytes'>) #base16解码

base64.b16encode(X)  其中需要加密的类型为’bytes

(其中16可⾃⾏替换为16 32 64)

同时,加密后的类型也为’bytes类型

所以加密的时候需要将 str 类型先转换为 bytes 类型:

例如:origin是⼀个 str 类型,则 origin.encode('utf-8') 则为 bytes 类型

⽽将 bytes 类型先转换为 str 类型:

代码: str(origin,'utf-8') 其中origin是需要转换的 bytes 类型数据

Base16加解密(⾃定义字符表

Base16的原始字符表为: 0123456789ABCDEF

倘若我们替换成 abcdef0123456789

⽤到两个⽅法

str.maketrans(intab, outtab) //⽤于创建字符映射的转换表 intab -- 字符串中被替代的字符组成的字符串。

outtab -- ⽤来替换的字符串。后者替换前者

#第三个参数此处不讨论

此处的str不可改

str.translate(table[, deletechars]) //根据参数table给出的表转换字符串的字符 table -- 翻译表,翻译表是通过maketrans⽅法转换⽽来。

deletechars -- 字符串中要过滤的字符列表。#第⼆个参数此处不讨论

此处的str为需要转换的字符串,⾃⾏根据⾃⼰字符串取的名称进⾏更换

实例:

intab = "like" outtab = "love"

biao = str.maketrans(intab, outtab)

origin = "I like you" print(origin.translate(biao))

加解密实例

import base64

origin = 'wo tai nan le!!'

biao1 = str.maketrans("0123456789ABCDEF","abcdef0123456789") str_encode = base64.b16encode(origin.encode('utf-8'))

encode = str(str_encode,'utf-8').translate(biao1) print(encode)

biao2 = str.maketrans("abcdef0123456789","0123456789ABCDEF") str_decode = base64.b16decode(encode.translate(biao2).encode('utf-8'))

print(str(str_decode,'utf-8'))

输出

1109ca1e0b03ca080b08ca060fcbcb

wo tai nan le!!

Base32加解密实现

同Base16加解密,将b16改为b32即可

Base64加解密实现

同Base16加解密,将b16改为b64即可

<think>嗯,用户想了解如何用AI技术解决CTF题目,需要方法和工具。首先我得回忆一下相关的知识。之前看过一些资料提到像DeepSeek这样的AI工具,可能可以用来生成代码或者分析漏洞。还有CTF常见的题型,比如Web、逆向、密码学这些,AI在不同方向的应用可能不同。 首先,应该分步骤来回答。比如,先介绍AI解题的基本原理,然后分类型讨论应用方法,再推荐工具,最后举例子。这样结构清晰。可能需要引用已有的引用资料,比如引用[2]里提到用DeepSeek和Docker制作赛题,或许解题也有类似方法。 还要考虑用户可能的背景,可能对CTF有一定了解,但不太清楚AI如何具体应用。需要解释清楚每个步骤,比如代码分析、漏洞模式识别、自动化脚本生成等。比如在Web方向,AI可以帮忙分析可能的注入点或生成payload;逆向工程中可能辅助反编译或识别算法。 工具方面,除了DeepSeek,可能还有ChatGPT、GitHub Copilot,这些都能辅助代码编写。另外,像CTFd这样的平台是否有AI整合?或者有没有专门针对CTF的AI工具?需要查证引用资料。引用[1]提到CTF常用工具,但用户问的是AI相关的,所以可能需要结合引用[2]中的内容,重点在AI工具的应用。 另外,用户可能想知道具体的操作步骤,比如如何用AI生成exp,或者如何训练模型识别加密算法。这里可能需要举例子,比如给出一个简单的密码题,用AI分析其是否为Base64编码,或者生成爆破脚本。 还要注意潜在的局限性,比如AI可能无法处理复杂混淆的代码,或者需要大量数据训练。这时候需要提醒用户结合人工分析,AI作为辅助工具。 最后,生成相关问题时要围绕方法和工具展开,比如不同题型的AI应用差异,训练模型的方法,或者现有工具的优缺点。确保问题能引导用户进一步探索。</think>### 如何利用 AI 技术辅助解 CTF 题目 #### 一、AI 解题的核心原理 AI 技术主要通过以下方式辅助 CTF 解题: 1. **模式识别**:分析代码、流量或加密数据的特征,例如识别 $Base64$ 编码或 $RSA$ 算法参数[^4] 2. **自动化生成**:根据题目描述生成可能的 payload 或 exploit 代码 3. **知识检索**:快速关联漏洞库(如 CVE)与题目特征 4. **逆向辅助**:解析二进制文件结构或反编译代码逻辑 #### 二、分方向应用方法 ##### 1. Web 方向 - **漏洞扫描**:通过 AI 分析 HTTP 请求/响应,识别如 SQL 注入、XSS 等漏洞模式 - **Payload 生成**:自动构造特殊字符串绕过过滤,例如生成 ${{7*7}}$ 测试 SSTI - **流量分析**:解析加密的 WebSocket 或 API 通信数据 ##### 2. 逆向工程 - **函数识别**:使用预训练模型识别加密算法(如 $RC4$、$AES$ 的 S-Box 特征) - **反混淆辅助**:解析控制流平坦化或字符串加密逻辑 - **符号执行**:生成路径约束公式并求解,例如通过 $$ \exists x \ (x^3 + 2x == 42) $$ 类方程求解 ##### 3. 密码学 - **算法识别**:根据密文特征判断加密类型(如区分 $ECB$ 和 $CBC$ 模式) - **密钥爆破**:结合概率模型缩小搜索空间[^4] - **数学运算**:分解大整数因数(如针对 $n=pq$ 的 RSA 题目) #### 三、推荐工具及使用示例 1. **DeepSeek-R1[^2]** ```python # 请求示例:分析 base64 编码 response = model.generate("识别以下编码解码:VEhJU19JU19GTEFH") # 返回结果:THIS_IS_FLAG (Base64 decoded) ``` 2. **ChatGPT-4o** ``` 用户:请为这段 Python 反编译代码添加注释: def check(s): return sum([ord(c)^0x20 for c in s]) == 1234 AI 回复: # 计算字符串各字符 ASCII 码与 0x20 异或后的总和 # 需要构造输入使 sum(ord(c)^32 for c in s) = 1234 ``` 3. **CTF-AI 集成工具链** - **angr+AI**:混合符号执行与神经网络路径预测 - **Ghidra 插件**:自动标注加密函数区域 #### 四、实战案例演示 **题目**:已知加密代码片段 $$ E(m) = (m^{65537} \mod n) $$ 其中 n=114514*1919810,求明文 m 使得密文为 42 **AI 辅助步骤**: 1. 调用因数分解接口:`factor(114514*1919810)` 2. 计算 φ(n) = (p-1)(q-1) 3. 生成解密指数 d ≡ 1/65537 mod φ(n) 4. 输出解密公式 $m = 42^d \mod n$ #### 五、注意事项 1. **误报处理**:AI 可能将正常代码误判为漏洞(如混淆的 JS 代码) 2. **依赖验证**:所有 AI 生成结果需人工复核,特别是涉及 $$ \exists x(P(x)) $$ 类存在性断言时 3. **规则合规**:部分 CTF 比赛禁止使用自动化工具,需提前确认规则
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值