就写了决赛的。累了,太菜了,想退役了。
[签到] 网安知识大挑战-FINAL
1 | 密文: 570fc2416dad7569c13356820ba67ba628c6a5fcbc73f1c8689612d23c3a779befeacf678f93ff5eb4b58dc09dcb9a89 |
选择题是肯定不会做的,反正也就 4^10 种可能性,想着直接写个脚本跑一下就行了。但是这 IV 怎么只有 8 字节,常见的 AES-CBC 不是需要 16 字节吗,ZeroPadding 还是 PKCS7Padding?全都尝试了以下怎么什么都跑不出来?
哦,居然是 Triple DES,被思维定势限制了。写代码吧:
1 | from Crypto.Cipher import DES3 |
[Web] wucanrce
1 |
|
无参 RCE,之前在 XYCTF 的 pharme 做过这个考点,直接把 PoC 抄过来改改。大致思路是把要进一步执行的代码往 HTTP Header 里面塞,然后无参把这个 Header 读出来执行。
1 | import requests |
[Misc] FinalSign
1 | 恭喜你来到这里,你能解开下面的秘密吗? |
不难注意到,文件中一堆 Tab 和 Space 在。直接尝试一下 SNOW:
1 | $ ./SNOW.EXE -C FinalSign.txt |
直接拿它去 xor 文件中那串十六进制就是了。
1 | cipher = bytes.fromhex('2c243f2f3b3114345d0a0909333f06100143023b2c55020912') |
[Misc] 非黑即白
给了一个莫名其妙的二进制文件,翻到文件尾看一下,好家伙 a98FIG
,这不 GIF 文件(但是前后颠倒)吗?翻回来:
1 | open('非黑即白'[::-1]+'.gif', 'wb').write(open('非黑即白', 'rb').read()[::-1]) |
发现是一堆或全黑或全白的帧,直接拿 ScreenToGif 给它帧全导出了,然后搓个脚本读一下黑白,直接转写成二进制文件:
1 | import os |
一看导出来的是个 Zip 文件,看了一眼有密码:
1 | $ file extracted.hex |
那就找密码呗… 事实上最后找了半天(赛中我是在那对着文件字节扒的,当时还没意识到这个是帧持续时间的标记,一头雾水)。ScreenToGif 里面可以看到每一帧的持续时间,前 14 帧持续时间是变化的,其他帧都是 100ms,所以直接把前 14 帧持续时间按多少个 10ms 抄出来按 ASCII 码转换出来就是密码。或者你也可以(这段代码是赛后写的):
1 | from PIL import Image |
[Crypto] MyCode
爆破就爆破呗,反正 decrypt
函数都已经给出来了:
1 | from MyCode import decrypt |
哦对了,string
里面有个 hexdigits
,但是它同时包括了大写和小写的字母,就变成了 22^5 而不是 16^5,我一开始没意识到然后爆了半天…
[数据安全] datasecurity_classify1
直接按要求搓代码就行了:
1 | import sys |
赛时我还手搓了一堆校验,但是后来发现这题完全没有脏数据,按长度分分类就行了。
[数据安全] datasecurity_classify2
拿 Wireshark 看了看,一堆 HTTP POST。直接 tshark dump 出来:
1 | $ tshark -r 附件/data.pcapng -T fields -Y "http && data" -e data > data.hex |
然后写个脚本过滤一下(代码在赛后改过,但是应该问题不大):
1 | import sys |
This article is authored by Luoingly and is licensed under CC BY-NC 4.0
Permalink: https://luoingly.top/post/cybersectf-zj-2024-writeup/