前言

最近发现对AI的编写脚本能力越来越依赖,以至于不用ai的时候感觉什么都不会,对程序语言的掌握也只是停留在看的懂的层面。故写此文章来督促和要求自己在遇到Re题以及其他需要编写脚本的题目时候,尽量使用手搓。当然,完全手搓肯定是比较浪费时间的。毕竟在比赛的时候没有那么多时间留出来去慢慢写。所以我们的目标就是,对于一些基础的脚本和标准算法的脚本可以快速实现改造。遇到不同的题可以改为对应可以用的脚本。尽量不依赖ai去生成现有的。这样的一个好处是在线下断网的时候也可以在编写脚本的时候游刃有余

本篇会基于遇到的题目,持续更新。。。。

准备工具以及语法了解

这个模块介绍CTF中常用函数库和脚本编写时用到的语法和函数都有哪些

PyCryptodome

通过 pip install pycryptodome 安装,这个库在CTF经常会使用到,无论是在密码学领域还是在逆向领域,使用都十分频繁

from Crypto.Cipher import AES

从库中导入 AES 算法模块

1. 基本功能

它的核心作用是:将每两个十六进制数字解析为一个字节(Byte,取值范围 $0$ 到 $255$)。

语法:

1
bytes.fromhex("十六进制字符串")

常见标准算法以及爆破脚本

1
2
3
4
5
6
7
8
9
10
11
12
// 获取seed后生成固定随机数 示例,算法部分可改
#include<stdio.h>
#include<stdlib.h>

int main(){
srand(0x1BF52u);

for(int i=0; i <16; i++){
int a = rand();
printf("%.2x", (a % 255) ^ 0x17); // %.2x是以十六进制数来打印出数据
}
}

代码一:[VNCTF 2025]Fuko’s starfish

3. AES 常用参数对比表

参数名 常用取值 说明
Key 16, 24, 或 32 字节 分别对应 AES-128, AES-192, AES-256
Mode MODE_ECB 电子密码本模式(无需 IV)
Mode MODE_CBC 密码分组链接模式(需要 IV,安全性更高)
IV 16 字节 初始化向量(仅在 CBC, CFB 等模式使用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from Crypto.Cipher import AES

def main():
# bytes.fromhex("十六进制字符串") 将每两个十六进制数字解析为一个字节(Byte,取值范围 0 到 255)可以自动处理空格的hex密文
key = bytes.fromhex("09e5fdeb683175b6b13b840891eb78d2")
enc = bytes.fromhex(
"3d011c190ba090815f672731a89aa474"
"97362167ab2eb4a09418d37d93e646e7"
)
aes = AES.new(key,AES.MODE_ECB) # 初始化解密器
final = aes.decrypt(enc) # 调用解密方法

print("final message-->", final.hex())
flag = final.decode("utf-8")
print("flag-->", flag)
main()

左移&右移

1
2
3
4
5
def rol8(b, n=3):
return ((b << n) & 0xFF) | (b >> (8 - n))

def ror8(b, n=3):
return ((b >> n) | ((b << (8 - n)) & 0xFF)) & 0xFF

程序示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-
def rol8(b, n=3):
return ((b << n) & 0xFF) | (b >> (8 - n))

def ror8(b, n=3):
return ((b >> n) | ((b << (8 - n)) & 0xFF)) & 0xFF

def to_hex(bs):
return bs.hex()

def main():
s = "一个示例"
data = s.encode("utf-8")

enc = bytes(rol8(b, 3) for b in data)
dec = bytes(ror8(b, 3) for b in enc)

print("enc_hex:", to_hex(enc))
print("dec_hex:", to_hex(dec))

if __name__ == "__main__":
main()