GHCTF 2025
[GHCTF 2025]LockedSecret
这是一个展开tea
点击查看代码
#include <stdio.h>
#include <Windows.h>
#include <stdint.h>
void decrypt(uint32_t* v, uint32_t* k){
uint32_t delta = 0x5E2377FF;
uint32_t v0 = v[0], v1 = v[1], sum = delta*8;
for (int i = 0; i < 8; i++)
{
v1 -= ((v0<<4) + k[2]) ^ (v0 + sum) ^ ((v0>>5) + k[3]);
v0 -= ((v1<<4) + k[0]) ^ (v1 + sum) ^ ((v1>>5) + k[1]);
sum -= delta;
/* code */
}
v[0] = v0;
v[1] = v1;
}
int main()
{
uint32_t Key[] =
{
0x423DF72D,0x5F59A01,0x633FCF1D,0x77D19122
};
uint32_t EncFlag[] = {
0x31e45dc,0x2776e989,0x1234847,0x64ced270,0x33467fda,0xa34903b1,0x2cd10027,0x75bdb337 };
for (int i = 0; i < 8; i+=2)
{
EncFlag [i] ^= 0xf;
(EncFlag [i+1]) ^= 0xf;
decrypt(&EncFlag[i] , Key);
}
printf("%.32s\n",EncFlag);
return 0;
}
[GHCTF 2025]Mio?Ryo?Soyo?
点击查看代码
en = bytes([
57,
118,
33,
114,
68,
56,
117,
115,
34,
52,
52,
95,
78,
40,
49,
59,
95,
85,
63,
122,
54,
33,
77,
110,
49,
54,
34,
109,
106,
122,
60,
92,
108,
91,
61,
51,
42,
62,
35,
38,
52,
67,
62,
122,
116,
48,
76,
50,
67,
51,
59,
41,
122,
45,
45,
51,
90
])
for i in en:
print(chr(i), end='')
#9v!rD8us"44_N(1;_U?z6!Mn16"mjz<\l[=3*>#&4C>zt0L2C3;)z--3Z
这里面有一个我踩的坑
如果对en直接print的话输出结果为
b'9v!rD8us"44_N(1;_U?z6!Mn16"mjz<\\l[=3*>#&4C>zt0L2C3;)z--3Z'
对比一下发现反斜杠\是两个,这样cyberchef就梭不出来了
原因如下:
bytes类型表示二进制数据的类型,它是一个不可变的字节序列
当直接打印bytes对象时,Python 会尝试将其内容解释为 ASCII 字符,并以b'...'的形式显示。
- 如果字节值在可打印的 ASCII 范围内(32 到 126),则显示对应的字符。
- 如果字节值不在可打印的 ASCII 范围内,则显示转义序列(如
\xHH,其中HH是十六进制值)
92-->\\反斜杠, 显示为\\是因为反斜杠是转义字符 ,避免歧义
for循环打印字符(不会有歧义)- 当你使用
for循环遍历bytes对象并打印每个字节对应的字符时,Python 会将每个字节值转换为对应的 ASCII 字符。chr(i)函数将整数i转换为对应的 Unicode 字符。
所以92应该转为\
base45改过编码表
点击查看代码
for i in range(48,93):
print(chr(i),end="")
#0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\


浙公网安备 33010602011771号