unctf{We1come_new_ctfer}
cGFzc3dvcmQgaXMgVTZudTJfaTNfYjNTdA==
—> base64 —> password is U6nu2_i3_b3St
unctf{N1_sH3_D0n9_L0g_dE!}
无所谓我会出手
,解开之前尾部保存的zip文件,得到flag.txt, flagisnothere.zip
flag.txt:
我提交了一下,是不对的。
ZipCenOp
解开的。pass.png:
六氯环己烷
别名叫六六六,所以flag.pptx的打开密码就是666
(当然也是试了好几次出来的)
上面密码留空,然后确定,文档的密码就没了。
ctrl+shift+f
搜索unctfUNCTF{y0u_F1nd_1t!}
找得到我吗.docx
后缀名改成zip,解压。
vscode搜索
flag{You_find_me!}
湖南
,加上古城。所以就是凤凰古城
,然后md5,再大写。
UNCTF{4F0198127A45F66C07A5B1A2DDA8223C}
lanqiu.jpg
打不开,那我们就先解决它。010editor打开一看就是reverse了,所以我们reverse一下就能回去,这个太简单了,我没写代码,你们不会的百度找个代码吧,我用的是自己的集合的那种脚本。
得到关键字:Go_p1ay
(注意是1不是l,我就被这个卡半天了)
zhiyin.png
,尾部明显的morse密码。使用CyberChef,链接:https://ctf.mzy0.com/CyberChef3/
得到关键字:_UNC7F!!!
—> 小写 —> _unc7f!!!
(我就因为没有小写,然后解压不开flag.zip,卡了半天)
所以正确的密码是:Go_p1ay_unc7f!!!
flag{M1sic_1s_greAt}
去哔哩哔哩搜索清和,第一个就是,它的内容刚刚好和手办有关系。
所以解压密码为:
MKM.png
有lsb隐写,所以解压密码为:qq857488580
,解压阿和的真实竟然身份是?.zip
神秘电波.wav
,打开一听就是rot36,再加上36s我更加确定,我使用的是MMSSTV
又得到关键字:V@mpir3
,解压flag.zip
flag.txt
,这一看就是有零宽。unctf{wha1e_wants_a_girlfriend_like_alicia}
key.txt
,找到最下面的a2V5MQ==
—> base64 —> key1
cloacked-pixel
out
就是看到flag了flag{faf5bdd5-ba3d-11da-ad31-d33d75182f1b}
然后改一下格式:
UNCTF{faf5bdd5-ba3d-11da-ad31-d33d75182f1b}
In_the_Morse_Garden.pdf
UNCTF{5L6d5Y+k5q+U5Y+k546b5Y2h5be05Y2h546b5Y2h5be05Y2hIOS+neWPpOavlOWPpOeOm +WNoeW3tOWNoSDnjpvljaHlt7TljaHkvp3lj6Tmr5Tlj6Qg5L6d5Y+k5q+U5Y+k5L6d5Y+k5q+U5Y+k5 46b5Y2h5be05Y2h546b5Y2h5be05Y2h5L6d5Y+k5q+U5Y+k546b5Y2h5be05Y2hIOS+neWPpOavlO WPpOeOm+WNoeW3tOWNoSDnjpvljaHlt7TljaHkvp3lj6Tmr5Tlj6Qg5L6d5Y+k5q+U5Y+k5L6d5Y+k 5q+U5Y+k546b5Y2h5be05Y2h546b5Y2h5be05Y2h5L6d5Y+k5q+U5Y+k546b5Y2h5be05Y2hIOeOm +WNoeW3tOWNoeeOm+WNoeW3tOWNoSDkvp3lj6Tmr5Tlj6TnjpvljaHlt7TljaEg546b5Y2h5be05Y 2h5L6d5Y+k5q+U5Y+k546b5Y2h5be05Y2hIOS+neWPpOavlOWPpOeOm+WNoeW3tOWNoSDkvp3 lj6Tmr5Tlj6Tkvp3lj6Tmr5Tlj6TnjpvljaHlt7TljaHnjpvljaHlt7TljaHkvp3lj6Tmr5Tlj6TnjpvljaHlt7TljaEg54 6b5Y2h5be05Y2h5L6d5Y+k5q+U5Y+k5L6d5Y+k5q+U5Y+k5L6d5Y+k5q+U5Y+kIOS+neWPpOavlOW PpOeOm+WNoeW3tOWNoSDnjpvljaHlt7TljaHkvp3lj6Tmr5Tlj6TnjpvljaHlt7TljaEg5L6d5Y+k5q+U5Y +k546b5Y2h5be05Y2hIOS+neWPpOavlOWPpOeOm+WNoeW3tOWNoSDkvp3lj6Tmr5Tlj6Tnjpvlja Hlt7TljaEg5L6d5Y+k5q+U5Y+k546b5Y2h5be05Y2hIOS+neWPpOavlOWPpOeOm+WNoeW3tOWN oSDnjpvljaHlt7TljaHkvp3lj6Tmr5Tlj6TnjpvljaHlt7TljaHkvp3lj6Tmr5Tlj6TnjpvljaHlt7TljaHnjpvljaHlt7T ljaE=}
依古比古玛卡巴卡玛卡巴卡 依古比古玛卡巴卡 玛卡巴卡依古比古 依古比古依古比古玛卡巴卡玛卡巴卡依古比古玛卡巴卡 依古比古玛卡巴卡 玛卡巴卡依古比古 依古比古依古比古玛卡巴卡玛卡巴卡依古比古玛卡巴卡 玛卡巴卡玛卡巴卡 依古比古玛卡巴卡 玛卡巴卡依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古依古比古玛卡巴卡玛卡巴卡依古比古玛卡巴卡 玛卡巴卡依古比古依古比古依古比古 依古比古玛卡巴卡 玛卡巴卡依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古玛卡巴卡 玛卡巴卡依古比古玛卡巴卡依古比古玛卡巴卡玛卡巴卡
根据题目的Morse的提示,所以这是摩斯密码。
摩斯密码在线网站:http://www.all-tool.cn/Tools/morse/
UNCTF{WAN_AN_MAKA_BAKAAAAA!}
我小心海也绝非鳝类.png
,发现尾部base64字符串。RUFTWUxTQg==
—> base64 —> EASYLSB
,得到关键信息:EASYLSB
得到关键信息:flaginmd5
cloacked-pixel
8FA14CDD754F91CC6554C9E71929CCE72DB95E8E1A9267B7A1188556B2013B330CC175B9C0F1B6A831C399E269772661B2F5FF47436671B6E533D8DC3614845DF95B70FDC3088560732A5AC135644506F1290186A5D0B1CEAB27F4E77C0C5D68E1671797C52E15F763380B45E841EC322DB95E8E1A9267B7A1188556B2013B334A8A08F09D37B73795649038408B5F33D95679752134A2D9EB61DBD7B91C4BCC6F8F57715090DA2632453988D9A1501BE1671797C52E15F763380B45E841EC32B14A7B8059D9C055954C92674CE60032E358EFA489F58062F10DD7316B65649ED95679752134A2D9EB61DBD7B91C4BCCB14A7B8059D9C055954C92674CE600326F8F57715090DA2632453988D9A1501B865C0C0B4AB0E063E5CAA3387C1A874103C7C0ACE395D80182DB07AE2C30F0344A8A08F09D37B73795649038408B5F33CBB184DD8E05C9709E5DCAEDAA0495CF
out的文本内容能被32整除,所以大概率就是32位md5代表一个字符,和本次比赛的Crypto方向的md5-1,基本一模一样。写个python代码:
import string
import hashlib
# 1.create dic
dic = {hashlib.md5(i.encode()).hexdigest().upper(): i for i in string.printable}
with open("out.txt", "r") as f:
data = f.read()
for i in range(0, len(data), 32):
print(dic.get(data[i:i+32]), end="")
flag{welcome_to_misc}
改一下格式:
UNCTF{welcome_to_misc}
这题我的wp应该是非常规解法,为什么是非常规,这个锅必须sublime text
背!!!
1.txt
可以看到是有零宽的很明显,我得到了乱码,所以这个地方我开始就没做出来。
2.txt
的crc32是1E153DBB
,原本的1.txt
的crc32是5CE71FFF
,所以这两个内容肯定不相同,所以不能明文攻击。
但是,你只要自己新建一个文件,然后写上线索就在眼前,你能利用并找到flag吗
现在crc32和文件里面的crc32一样了,现在可以用压缩攻击压缩然后明文攻击了。
我为什么没有人出题人的解法呢?因为sublime text
首先,我复制了1.txt
的内容到了1 - 副本.txt
,然后我把能看见的零宽字符删掉了,也就下图这样:
crc32显示c5c55f26
,所以我就没办法明文攻击了。
可能有人就好奇了,为什么你把零宽都删掉了,怎么crc32不一样啊,有没有一种可能,我根本就没把零宽字符删干净,我们把1 - 副本.txt
复制到kali里面去。
使用vim打开,你会发现还有一堆的零宽字符,所以说我们根本没有删干净,但是sublime text上面并没有显示零宽字符了!
所以我就没办法明文攻击,但是虽然不能攻击2.txt,但是我们可以攻击flag.zip。
为什么可以攻击flag.zip,这是因flag.zip的算法为ZipCrypto Store
https://github.com/kimci86/bkcrack
,不太会的可以看我之前的一个视频教程,戳我打开。首先我构造了一个zip的文件尾部,但是我当时也没有把握能攻击出来,因为压缩文件如果有注释的话,那我百分比攻击不出来,有注释的话偏移就变了。(也就是以前在这个位置上,现在不在这个位置了)
攻击命令如下:
-o 239
是根据flag.zip的大小 - 22字节
得到的。
-x 0 504B03041400
这个是zip的文件头部。
可以看到成功得到了12字节的key。
修改压缩包的密码为easy
easy
去解压,得到一个新的flag.zip
,这里面就是flag了,但是需要密码这个压缩包的密码就在一开始零宽里面。
然后我们下载解密后的隐藏数据,使用sublime text打开
密码:PAsS_w0rD
这个地方花了我很久时间,因为我是真的忘记了还可以隐藏二进制数据,因为上面的文本一直得不到有意义的文字,我滑动到了下面的窗口,然后我试了一下,果然是二进制数据。
解压新的flag.zip
,得到flag:
unctf{d4a3a242-cd32-4dd5-bac6-84bdf13f527f}
改一下格式:
UNCTF{d4a3a242-cd32-4dd5-bac6-84bdf13f527f}
Picture
添加后缀zip,解压,得到两个文件:dat
和 flag.png
dat
用010editor打开乱码,所以我就用我的脚本试了一下,也就是检测文件头和文件尾的,出来了异或0x8e
这个时候就有人说了,那我没有你的脚本这题咋办呢??也好办!
你的电脑肯定有python吧,pip3 install xortool
,pip3或者pip都可以,只要你能安装这个库到你的python3上就可以。
使用xortool.exe -c 00 dat
这个0.out
打开一看你会发现就是zip的了,这个xortool
会自动帮你进行检测然后保存。
-c 00 一般软件或者文件使用, -c 20 一般是文本文件使用
无符号字节,操作数8e,十六进制,确定。
一看就是zip了,修改备注为zip,没有密码,解压得到encode.py
from PIL import Image as im
flag = im.open('flag.jpg','r')
l,h=flag.size
puzzle=im.new('RGB',(h,l))
print(puzzle)
for i in range(l):
for j in range(h):
r,g,b=flag.getpixel((i,j))
r=r^g
g=g^b
b=b^r
puzzle.putpixel(((i*787+j)//1200,(i*787+j)%1200),(b,g,r))
puzzle.save('flag.png')
flag.close()
puzzle.close()
根据加密流程写一个解密:
from PIL import Image
img = Image.open("flag.png")
with open("bgr.txt", "w") as f:
for x in range(img.width):
for y in range(img.height):
b, g, r = img.getpixel((x, y))
b = b ^ r
g = g ^ b
r = r ^ g
f.write(f"{b} {g} {r}" + "\n")
如果你实在不知道为什么要向上面那样写解密脚本:
# 这是刚刚的加密,解密的脚本
r, g, b = 3, 4, 5
# 加密
r = r ^ g
g = g ^ b
b = b ^ r
print(r, g, b)
# 解密
b = b ^ r
g = g ^ b
r = r ^ g
print(r, g, b)
运行结果:
7 1 2
3 4 5
所以说有时候加密流程搞不懂,你就写个demo试试。
运行解密脚本后,会得到一个bgr.txt
文件
运行该脚本之前,手动新建一个images
的文件夹,因为我这个脚本会把图片写入的images
的文件夹里面。
import cv2
import numpy as np
with open("bgr.txt", "r") as f:
data = f.read().splitlines()
img = []
for line in data:
img.append(list(map(lambda x: int(x), line.split(" "))))
img = np.array(img, dtype=np.uint8)
for width, height in {1: 944400, 2: 472200, 3: 314800, 4: 236100, 5: 188880, 6: 157400, 8: 118050, 10: 94440, 12: 78700, 15: 62960, 16: 59025, 20: 47220, 24: 39350, 25: 37776, 30: 31480, 40: 23610, 48: 19675, 50: 18888, 60: 15740, 75: 12592, 80: 11805, 100: 9444, 120: 7870, 150: 6296, 200: 4722, 240: 3935, 300: 3148, 400: 2361, 600: 1574, 787: 1200, 1200: 787, 1574: 600, 2361: 400, 3148: 300, 3935: 240, 4722: 200, 6296: 150, 7870: 120, 9444: 100, 11805: 80, 12592: 75, 15740: 60, 18888: 50, 19675: 48, 23610: 40, 31480: 30, 37776: 25, 39350: 24, 47220: 20, 59025: 16, 62960: 15, 78700: 12, 94440: 10, 118050: 8, 157400: 6, 188880: 5, 236100: 4, 314800: 3, 472200: 2}.items():
img = img.reshape(height, width, 3)
cv2.imwrite(f"./images/{width}_{height}.png", img)
images目录下面出现了很多的图片了
我们肉眼可以看到1200x787.png
是一张完美的图片,我们打开后,左转90°,再垂直翻转一下,就得到了flag。
UNCTF{93bb442f-2a76-2b6f-c42f-c2297f5fdaf9}
补充:
我是如何得到那些宽高的?
bgr.txt
一共有944400个像素点,我们就找能被整除的数,也就是假设一个width,如果944400 % width == 0,那你们能被整除,那它们就有可能是真实的宽度和高度。
'''
Example:
N = 61366
输出:
{1: 61366, 2: 30683, 61: 1006, 122: 503, 503: 122, 1006: 61, 30683: 2}
{X1: Y1, X2: Y2, ..., Xn: Yn}
'''
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-t', type=int, default=None, required=True,
help='输入数字')
args = parser.parse_args()
N = args.t
ret = {X: int(N / X) for X in range(1, N) if N % X == 0}
print(f"一共有 {len(ret)} 种情况:")
print(ret)
题干:
Tom和Jerry是一对欢喜冤家,这天Jerry偷走了芝士,Tom需要把他抓回来。
Jerry一会跳到屏幕上,一会跳到键盘上,Tom很是头晕。
你能帮助Tom看清Jerry的踪迹吗?
说明:
flag内容由若干大写英文单词组成,单词间以"_"间隔,flag格式:UNCTF{解出的字符串}
过滤命令:tshark.exe -r .\CatchJerry.pcapng -Y "usbhid.data" -T fields -e usbhid.data > out.txt
out.txt:
0000000000000000
0000010000000100
0000010000000100
0000020000000200
0000010000000100
0000020000000200
...
使用代码把这个数据转换为鼠标的坐标:
with open("out.txt", "r") as f:
keys = f.read().splitlines()
with open("LEFT.txt", "w") as left, open("RIGHT.txt", "w") as right, open("ALL.txt", "w") as all:
posx, posy = 0, 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
# 1 for left , 2 for right , 0 for nothing
btn_flag = int(line[:2], 16)
if btn_flag == 1: # 1 代表左键,2代表右键
left.write(f'{posx} {str(-posy)}' + '\n')
elif btn_flag == 2:
right.write(f'{posx} {str(-posy)}' + '\n')
all.write(f'{posx} {str(-posy)}' + '\n')
得到3个文件分别是ALL.TXT
, LEFT.txt
, RIGHT.txt
,RIGHT.txt
没有内容,也就是说没有右键的流量。
复制LEFT.txt
到kali中,安装gnuplot
,不会安装的百度一下。
得到关键字:TOM
,JERRY
,FRIENDS
根据题干所以还有flag在键盘流量里面,但是我们如果在wireshark
中过滤器用usb.capdata
,你会发现没有任何流量,所以说键盘的流量也在usbhid.data
里面。
根据 USB协议数据部分在Leftover Capture Data域中,数据长度为八个字节,刚好所有数据都是八字节。
击键信息集中在第3个字节,每次击键都会产生一个数据包。
所以下面的代码就是读取第3个字节,然后输出键盘按键的信息。
mappings = { 0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G", 0x0B:"H", 0x0C:"I", 0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]", 0X2B:" ", 0x2C:" ", 0x2D:"-", 0x2E:"=", 0x2F:"[", 0x30:"]", 0x31:"\\", 0x32:"~", 0x33:";", 0x34:"'", 0x36:",", 0x37:"." }
nums = []
with open('out.txt', "r") as f:
data = f.read().splitlines()
for i in data:
num = int(i[4:6], 16)
if num in mappings:
print(mappings[num], end="")
得到关键字:AND
,BEST
所以flag为:
UNCTF{TOM_AND_JERRY_BEST_FRIENDS}
提示1:如果明文攻击失败,尝试使用bandzip
提示2:会动的鼠标
得到密码:b4s31sN1ce
flag
的文件一堆base64,base64隐写了,用我的软件也可以,因为软件偷懒没写多线程,然后这个base64文本又比较多,所以会出现卡死,但是并不是真的死了,需要稍微等一会,Github链接:https://github.com/Byxs20/Base64-Tools,打开后在右边的Release下载。(目前最新版本已经增加多线程,但是由于这个base64文本40mb,文本添加到输出框的时候还是会有点小卡顿,请等一会儿!)
复制下面的然后粘贴到CyberChef上面
然后保存这个文件保存下来
这个时候,就开始难起来了,Macro
翻译是宏,.mrd
这个格式找了半天也没找到啥软件。
不过我的思路就是肯定是一款软件,而且他是鼠标宏的,因为提示2:会动的鼠标
,鼠标和宏一起,就是鼠标宏,鼠标宏才会动,鼠标是不会莫名其妙的移动的。
现在就是必须要找到那款软件。
最终下载了一款叫MacroRecorder
的软件,官网链接:https://www.dcode.fr/solveur-sudoku
打开Macro.mrd
这个时候打开画图软件,点一下Play
你的鼠标就会变成移动的鼠标喽~嘎嘎乱动
UNCTF{b4s3_1s_v3ry_g0od!!}
这个时候距离比赛还有4小时左右,我一觉睡醒,这题0解变成2解,我一看就知道排名掉了,果然20名开外,然后我就硬肝这题了,还好肝出来了!
提示1:带密码的eye
如果使用我的项目的话,需要手动去添加一些字符集,添加字符集,才可被爆破出来,不然爆破不出来;另外这个crc32的项目也是需要手动下载的,详细看我github项目的食用教程!
配置好后,运行效果如下:
2.txt
对应W0RD
,3.txt
对应P@Ss
,组合一起就是W0RDP@Ss
,去解压这个zip,没成功。
然后我把顺序换了一下,使用P@SsW0RD
这个密码解压就成功了!
为什么要这样?因为bmp里面没有密码可以更改了,而且提示是带密码的eye
,但是bmp就没有密码修改的地方,所以我想起来了之前bugku做的一道题目,就是用了上面的手段,题目叫什么我忘记了。
所以我就各种尝试,最后试出来了:Image quality: normal,Type:AES256,Key:P@SsW0RD
。
flag.txt
是加密的,而看好你.jpg
是没有加密的。flag.txt
内容如下:3(%2 .V%QSQTP KRPV_K" 'RKPWS KWQ%Q'W$QWPS".
还有一张图片看好你.jpg
:
3(%2 .V%QSQTP KRPV_K" 'RKPWS KWQ%Q'W$QWPS".
和P@SsW0RD
作为密码,都没成功,又卡住了。UNCTFH0C75726F-4609-DFA4-615F-17C7A1B7165DH
UNCTF{0C75726F-4609-DFA4-615F-17C7A1B7165D}