本来想看看reverse,结果没啥基础题,就只能摸鱼打比赛了。几道MISC过于脑洞。
BlockTrick
服务器源码 (自己改了py3的本地环境跑):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
29from Crypto.Cipher import AES
import os
def pad(a):
size = (16-len(a) % 16) % 16
a += bytes([size])*size
print(a)
return a
iv = os.urandom(16)
key = os.urandom(16)
enc = AES.new(key, AES.MODE_CBC, iv)
print(iv.hex())
for _ in range(2):
trick = input().strip('\n')
trick = pad(bytes.fromhex(trick))
print(trick)
cipher = enc.encrypt(trick)
if trick == cipher and trick != b"":
with open("flag.txt") as f:
print(f.read())
exit()
else:
print(cipher.hex())
print("Try again")
注意这里CBC模式下,你两次加密也会是一样地按照CBC模式,第二次的IV是上一次的密文结果。分组加密相关的trick,CBC模式下,前一段加密输出的密文会作为后一段明文的异或向量,随后再进行AES加密。首先我们输入给出的iv初始值即可,这样异或后AES加密的值时全0,得到AES对’\x00’* 16的加密。随后我们再将这个输出作为输入,与’\x0O’的密文相互异或,由于我们的输入也是’\x00’的密文,因此再次得到一组’\x00’,随后送入AES进行加密得到’\x00’的密文,而我们的输入正是’\x00’的密文。简单来说,复读即可,操作如下:
MISC
前面放几道纯脑洞,后面放的超级简单的题。无语子。
red_vs_blue
简单的交互题目,猜对66轮红蓝对抗的结果,试了几次发现每次连接上去给的答案是固定的,错了还可以重来,但是断开连接结果就不一样了,规定时间内爆破出答案即可:
脚本
1 | from pwn import remote |
得到flag: flag{41ef454c-a406-485d-8933-184f7ab237b8}
funny_maze
生成迷宫,每次只需要计算出走出迷宫需要的最短距离即可,DFS或者BFS搜索即可,比赛没有自己写脚本,找了现成的脚本,但是得注意下pwntool交互下接受的都是byte即可:
1 | from pwn import remote |
ezSteganography
这是唯一一道隐写没有特别多脑洞的题,其他题目过于脑洞,有点浪费时间。
原始png图片如下:
pngcheck,strings,binwalk之类的都没看出什么花里胡哨的东西,只能放stegsolve里面看看了:
red0 通道发现猫腻:
单独看G plane通道的图片没有发现有用信息,应该就是G通道的LSB隐写,果然发现png头:
提取出来保存为png,得到第一部分
提示了QIM,quantization index modulation,一种加水印的方法,github上面有提供脚本,它针对的是向量处理的,设置步长为20,提取水印如下
1 | from __future__ import print_function |
当然,提取出来的水印看上去是全黑的,注意前面的提示是somethings in G plane,因此再看看该水印的G plane,得到第二部分
flag{2e9ec6480d05150c211963984dcbc9f1}
Just A GIF
一张gif,identify看一下
1 | $ identify -format "%s %T \n" Just_a_GIF.gif |
451张图片,间隔均是10,。
ffmpeg分解gif图片,或者找一个在线网站分解也一样
1 | $ ffmpeg -i Just_a_GIF.gif /images/image%d.jpg |
如下图,11张一个周期,后面就是脑洞试一试了,肯定不同周期内图片会有差异
比较部分结果如下,可以发现,每张图片之间有部分像素点存在差异,并且只是象征性地加一(255则减一),可以试一下把这些不同的像素点拼起来(反正就硬猜,就很没意思)。每个周期内图片都与第一个周期内图片比较。
1 | ----------------compare 1 and 12---------------------- |
提取如下:
1 | from PIL import Image |
结果如下,得到9张碎片图和两张拼接顺序图
之后拼接起来是DataMatrix,反正不知道是啥,去barcode的online网站扫一下就出来了。
WEB
cat flag
1 |
|
神奇的绕过姿势,给了提示管理员曾经访问过flag,那么在访问日志里面应该有记录,一般网站用的是Nginx文件系统,去找对应的文件系统日志存放路径即可:
日志目录:/var/log/nginx/access.log
可以看到对应flag文件的文件名,想要绕过正则并且正确执行cat this_is_final_flag_e2a457126032b42d.php
。
这里关键的一点是 escapeshellarg($cmd)
这个函数,虽然这个函数限制了我们只能传一个参数,并且会过滤引号之类的符号,防止执行其他指令,但是它同时会直接去掉非ASCII值的字节,因此我们可以用这个绕过正则匹配,在flag中间插一个非ASCII值的字节即可。
1 | http://1ab97075-546e-4d38-af96-eefb21dfd83b.node4.buuoj.cn/?this_is_final_fl%81ag_e2a457126032b42d.php |