YLB’s CAPTCHA

第一次从这里知道易霖博,毕竟这个比赛是入门CTF两个月就上手打的,全靠题目图一乐,对系统的知识完全没有了解,大概搜了一下这个验证码相关的事儿,大概就是验证码很恶心难以辨认,一开始还以为是啥web题。毕竟输入了很多次都是0分,想着是不是可以绕过之类的,可是又有很多人过了,也不认为是什么高深的技术手段。后来认认真真的输入了一次,加了一分,真就直接输入验证码呢。
输错了会把分数清零重来,连续输对10次就能得到flag。

阴阳人编码

文本是只由 就这. 就这¿ 不会吧! 组成联想到ook,使用Ctrl+H批量替换,ook解密可得flag

爷的历险记

在data里用记事本打开各种文件,能够直接看到flag

1
UNCTF{WelC0me_70_UNCTF2oZ0~}

YLB绝密文件

吃了不会python的亏,三个hint文件都拿到了,不会写脚本跑。到处报错。
各种追踪流可以得到xor.py和secret.python-38.pyc,后者反编译一下得到KEY

1
key= 'YLBSB?YLBNB!'

binwalk可以得到zip文件,解压出来是一个异或后的文件,必然是需要使用解密脚本去跑的
对照着加密脚本去写一个解密脚本,报错,不会写。卡在这了
以下是官方的解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
##coding:utf-8
import base64
key="YLBSB?YLBNB!"
file = open("YLBSB.docx", "wb")
enc = open("YLBSB.xor", "rb")
count = 0
cipher = enc.read()
for c in cipher:
d = chr(c ^ ord(key[count % len(key)]))
file.write(d.encode())
count = count + 1
enc.close()
file.close()
file = open("YLBSB.docx", "rb")
plain = base64.b64decode(file.read())
file.close
file = open("YLBSB.docx", "wb")
file.write(plain)
file.close()

解码可得YLBSB.docx

最后一行白色的文字即为flag

EZ_IMAGE

百度搜misc拼图之类的关键词,照着步骤去做,调整一下参数就行

1
montage unctf*.jpg -tile 15x15 -geometry 60x60+0+0 test.jpg

1
gaps --image=test.jpg --generation=30 --population=300 --size=60


因为配环境的时候有些报错,耽误了时间,不然能拿三血

baba_is_you

之前pi播过这个游戏,还蛮喜欢的,而且目标也是一个flag,就觉得非常亲切。
图片丢winhex可以找到一个视频链接,进入评论区拿flag。

你能破解我的密码吗

shadow文件,搜一下就知道是大概是什么,有一段奇特的字符串
guguguguji:$1$AH$xtjky.3kppbU27tR0SDJT.:18556:0:99999:7:::
扔进kali里john一下

1
john -show shadow

得到

1
2
3
guguguguji:123456:18556:0:99999:7:::

1 password hash cracked, 0 left

密码就是123456,对其md5加密取32位小写得flag

1
unctf{e10adc3949ba59abbe56e057f20f883e}

被删除的flag

扔进kali里

1
strings flag

最后一行就能发现flag

1
unctf{congratulations!}

应该是一个非预期,strings对付一些题特别好用。
官方wp:
file命令看一下发现是ext3文件,题目提示flag被删除了,用extundelete恢复文件

躲猫猫

excel文件可以改为zip文件,解压之后一个个点开看,就能找到base64加密的flag,解密就是

一开始还以为是什么小语种,傻傻的去查词典,查了半天也没个结果,和@Hh0 师傅讨论,师傅说可能是零宽。尝试之后成功。
在线解密地址 http://330k.github.io/misc_tools/unicode_steganography.html

ET-msg

看了hint,google了一下Arecibo,发现了阿雷西博信息,但是没有什么思路
另一个hint是30 80 7 也没思路。
官方wp:
将01绘制成30*80图片后,第一部分为七进制0-6 的二进制表示(最下方点仅表示此处存在数字)

大括号中为七进制构成的flag,三个七进制一组,对照第一部分解出flag

网络深处1

解压,wav文件去DTMF解密,密码:15975384265
解压得到的第二个wav文件扔进audacity里,查看频谱

google搜索Tupper发现Tupper自我指涉公式,有几篇文章附有python脚本,跑了发现报错。
进而找到对应的wiki,wiki上有在线画图脚本,输入字符串即可得到图片

1
flag{Y29pbA==}

其实拿到flag后我还拿里面的base64解密了,以为解密后才是flag,解密之后还社工了一下,搜coil,其实没啥东西。

mouse_click

一看就知道是usb流量分析,在kali下直接tshark提取,之后以为要去除空行,其实发现几万行的空行,然后批量替换的话也会把有效的换行也替换掉,也很多,之后就懒得搞了
然后找了脚本搞了半天没出来,其实流量包里有废流量,tshark也会一并提取
需要先过滤掉没用的流量,只留下长度为31的流量

文件→导出特定分组,我保存为mouse.pcapng,之后可以tshark提取了,得到正常的数据
从网上抄一个把数据转换成坐标的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#sniffer.py
nums = []
keys = open('usbdata.txt','r')
result=open('result.txt','w')
posx = 0
posy = 0
for line in keys:
x = int(line[2:4],16)
y = int(line[5:7],16)
if x > 127 :
x -= 256
if y >115 :
y -=256
posx += x
posy += y
btn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothing
if btn_flag == 1 :
result.write(str(posx)+' '+str(-posy)+'\n')
keys.close()
result.close()
1
2
# gnuplot
plot "result.txt"


走了超多的弯路,但是也学到了很多,很不错的一道题

撕坏的二维码

官方wp居然反应有人说题目太难,一点感觉也没有,虽然它碎了,但是只需要傻瓜式地补上右边的两个角,就能扫出来
体会到二维码的顽强,这东西真耐操,不错。

倒影

拿到了一血。这题特别简单,但是不知道为什么解的人不是特别多
下载下来解压是个exe文件,丢进winhex里查看头是一张jpg文件,最后有一段base64加密过的东西,解密后是一串字符串

1
0000000000B4000000A500100010000000006050B405106D6A9EA24E5767106D7AD58AC22940106D7AD58AC229400081001000000000000200A0478747E27616C666000000000000000200000000000000420080000000910000005297D4535E1555E5C90000801000A000F32010B405B4ECC7E9889EDF1BA30C6FF71836EBCFE9A735EFD6E501CE14109505827764B69DC37C6E2E478747E27616C66600000080000000910000005297D4535E1555E5C90000801000A04030B405

最后的4030B405,倒过来就能发现就是zip文件的文件头504B0304,写两行脚本逆序
唯一一个会写的脚本哈哈

1
2
s = '0000000000B4000000A500100010000000006050B405106D6A9EA24E5767106D7AD58AC22940106D7AD58AC229400081001000000000000200A0478747E27616C666000000000000000200000000000000420080000000910000005297D4535E1555E5C90000801000A000F32010B405B4ECC7E9889EDF1BA30C6FF71836EBCFE9A735EFD6E501CE14109505827764B69DC37C6E2E478747E27616C66600000080000000910000005297D4535E1555E5C90000801000A04030B405'
print(s[::-1])

得到逆序后的串,粘贴进010editor保存为zip,里面就是flag.txt,发现有密码,搞了好一会不知道密码,还以为要从图片里面得到,对jpg进行了各种detect,无果,后来直接爆破,密码为658745
flag:

1
2
UNCTF{Th13_Is_@_F1@G}

bashsecret

下下来是一个命名为pwn的文件,丢进kali,file一下发现是个ELF文件,strings、cat、binwalk皆无果,不会了。而且实名制看不懂官方的wp,大概感觉是需要pwn的知识,纯misc的瓶颈就到这了,继续努力。
官方wp:
报错使sha值为空

第二个输入空则可以使得判断相等

唯一注意报错时候 所带的指令cat可以执行即可。

太极八卦

不会,请会算法的小同学来处理,也没思路。
下面是官方wp:
这一题打开可以看到文本内全是八卦字符,两两一组,中心是=和○,结合hint可以知道○没用,所以根据=可以想到base家族,再根据八卦字符有八种且两两一组,可以联想到八八六十四种情况对应base64,再根据hint可以猜到文本内是双螺旋矩阵,前方高能,眩晕警告:


按照双螺旋矩阵读取成两个字符串,然后根据可以猜到八卦符号中的”—“为1”- -“为0,一个符号从上至下组成一个三位二进制数字,两个三位二进制数对应到b64编码表组成的矩阵中:

图中0是

第一位,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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
#unctf2020 出题
#coil

import base64
import numpy
numpy.set_printoptions(threshold=numpy.inf)

gua = "☷☳☵☱☶☲☴☰"
base64_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

def ToBase64(file):
with open(file, 'rb') as fileObj:
image_data = fileObj.read()
base64_data = base64.b64encode(image_data)
return base64_data.decode()
def ToFile(fileObj, file):
base64_data = fileObj.read()
ori_image_data = base64.b64decode(base64_data)
fout = open(file, 'wb')
fout.write(ori_image_data)

txt1 = ToBase64("image0.bmp")
print(txt1)
txt1 = list(txt1)
txt2 = ToBase64("image1.bmp")
print(txt1)
txt2 = list(txt2)

l = int(pow((max(len(txt1),len(txt2)))*2,0.5))+1
m = "="*(pow(l,2))
m = list(m)
m = numpy.array(m, dtype=numpy.unicode_)
m = m.reshape(l, l)

pl = []
pl.append(l)
for i in range(l-2,1,-2):
pl.append(i)
pl.append(i)
pl.append(1)

start = [0,-1]
plsum = 0
for i in range(len(pl)):
if plsum == 1612:
break
if i%4 == 0:
index = 1
for j in range(pl[i]):
start[index] += 1
m[start[0],start[1]] = txt1[plsum]
plsum += 1
elif i%4 == 1:
index = 0
for j in range(pl[i]):
start[index] += 1
m[start[0],start[1]] = txt1[plsum]
plsum += 1
elif i%4 == 2:
index = 1
for j in range(pl[i]):
start[index] -= 1
m[start[0],start[1]] = txt1[plsum]
plsum += 1
elif i%4 == 3:
index = 0
for j in range(pl[i]):
start[index] -= 1
m[start[0],start[1]] = txt1[plsum]
plsum += 1

start = [l-1,l]
plsum = 0
for i in range(len(pl)):
if plsum == 1612:
break
if i%4 == 0:
index = 1
for j in range(pl[i]):
start[index] -= 1
m[start[0],start[1]] = txt2[plsum]
plsum += 1
elif i%4 == 1:
index = 0
for j in range(pl[i]):
start[index] -= 1
m[start[0],start[1]] = txt2[plsum]
plsum += 1
elif i%4 == 2:
index = 1
for j in range(pl[i]):
start[index] += 1
m[start[0],start[1]] = txt2[plsum]
plsum += 1
elif i%4 == 3:
index = 0
for j in range(pl[i]):
start[index] += 1
m[start[0],start[1]] = txt2[plsum]
plsum += 1
m[int(l/2),int(l/2)] = '○'

decode_s = ""
for x in range(m.shape[1]):
for y in range(m.shape[0]):
c = m[x,y]
pos = base64_alphabet.find(c)
if pos == -1:
decode_s += c*2 +" "
else:
pos = oct(pos)
pos = str(pos).lstrip("0o")
pos = pos.zfill(2)
decode_s += gua[int(pos[0])]+gua[int(pos[1])]+" "
decode_s += "\n"

with open("out.txt", "wb") as outf:
outf.write(decode_s.encode("utf-8"))

得到的b64字符串解码写文件可以得到两个bmp图片:

根据hint和文本中的两个○,可以猜到是将两个图片融合,这里我们使用融合卡融合stegsolve.jar打开image0.bmp,再用analyse-image combiner打开image1.bmp,第一个就是异或:

可以得到flag是

1
flag{t@1Ji_6A-Gu4_b64}

总结:

hint -> 知识点 -> 工具

hint1,hint3 -> 双螺旋矩阵 ->

hint2,”=” -> b64 -> audacity

b64解码后BM开头 -> bmp文件头 ->

hint1,hint3,”○” -> 图片异或 -> stegsolve.jar