更新日期:2022年12月6日
青少年CTF训练平台MIsc—Easy部分的WP
有错误请在评论区指出,万分感谢!!!
个人博客:https://www.st1ck4r.top/
(~ ̄▽ ̄)~
0x01 bear
考点:与熊论道解密
在线解密:http://hi.pcmoe.net/
0x02 百家姓
考点:百家姓编码,16进制转文本
使用百家姓在线解码解出来一段16进制文本
使用在线16进制转文本进行转换获得flag。
0x03 上号
考点:流量包分析,图片隐写
解压附件后得到一个流量包,打开并导出shanghao.zip
解压shanghao.zip,得到一张图片
使用010editor打开图片,翻到最下面发现字符串,猜测为图片隐写密码。
使用steghide工具将隐写的文件提取出来,即可获得flag。
0x04 17insanity
考点:文件读取
下载附件解压,打开文件即可获得flag。
0x05 17sanity
考点:文件读取
跟上题一样。
0x06 老师说了小明什么?
考点:压缩包密码爆破,伪加密,新佛曰,base64,base32,16进制转文本,凯撒密码,密码字典生成,图片隐写
提示密码为生日,使用压缩包密码爆破工具破解。
解压获得flag1,flag2.zip和flag3.zip
将flag2.zip用010editor打开,修改下面两处数字,去除压缩包伪加密。
解压flag2.zip,获得两个文本。
将flag2.txt进行新佛曰解密
接着依次进行base64,base32,16进制转文本获得第二段flag。
将密码.txt进行凯撒密码解密。
在位移4处获得正确密文。
使用python脚本生成压缩包密码字典。
for i in range(1000):
if i<10:
i = '00'+str(i)
elif 10<=i and i<100:
i ='0'+str(i)
else:
i=str(i)
with open('1.txt', 'a') as f:
f.write('qsnctf'+i+"\n")
f.close()
使用字典进行爆破flag3.zip。
解压后为一张图片,
使用010editor打开,发现压缩包。
将图片后缀改为zip,然后解压打开获得flag3,将三段flag拼起来提交即可。(其实在我打码的地方就能看到flag3,这步就当走个流程)。
0x07 签到
考点:F12
f12查看源代码看到加密文本。
base64解两次码获得flag。
0x08 八卦迷宫
考点:迷宫
将附件解压,得到一张迷宫的图片,用画图工具手工连接,然后将路上的图表和字相对应。
按顺序打出,然后根据题目要求换成全拼,加上图片里的前缀cazy{}提交即可。
0x09 西安加油
考点:流量分析,base64,base64转换binary,拼图
下载附件用wireshark打开流量包,选择导出http对象,按大小排序后可以看到一个格外大的txt文本。
保存后打开发现是base64,在网站进行解码发现是一个压缩包。
将文本导入winhex,运用脚本转换为zip文件。
将zip文件解压得到十几张图片。
使用PS拼图得到flag(这里拿Montage(蒙太奇)好像也能拼,但是我太菜了拼了好几次都成没成功,只能采取笨办法了)。
附上一张原图(希望疫情能早点结束):
0x10 表情包
考点:文件属性查看
下载附件解压后得到十几张末心心P的表情包(?),挨个查看附件属性,就能找到flag(提示:跟Flag有关哦)。
0x11 欢迎
考点:拼图
折磨!!!!直接放原图(某次群聊打电话的截图):
0x12 Attack
考点:流量取证,mimikatz
先对流量包进行分离,得到一个加密的压缩包,提示是administrator的秘密
猜测需要得到administrator的密码,重新分析流量包,导出http对象,将最大的bmp文件导出。
-
Tips:dmp文件是windows系统中的错误转储文件,当Windows发生错误蓝屏的时候,系统将当前内存【含虚拟内存】中的数据直接写到文件中去,方便定位故障原因。
(里面包含主机用户密码信息)
使用mimikatz分析.dmp文件,双击启动mimikatz.exe(x64(记得添加信任或者关闭杀毒软件,要不然就被杀掉了))并依次执行以下命令:
//提升权限
privilege::debug(网上抄的,不知道有啥用,我这里执行会报错,但是不影响下面的操作)
//载入dmp文件
sekurlsa::minidump lsass.dmp
//读取登陆密码
sekurlsa::logonpasswords full
将administrator的密码作为压缩包密码解压即可得到flag。
0x13 xcel破解
考点:基础文件操作
使用010editor打开往下翻翻就能看到flag…
0x14 FireFox Forensics
考点:火狐取证
太菜了不会做,WP奉上。https://blog.csdn.net/weixin_45791884/article/details/118707262
0x15 Game
考点:base32,LSB,3DES
解压src.zip,在index.html中找到base32数据,解码得到一个假的flag。
接下来分析那张png图片,用stegsolve打开在0通道发现base64数据
看到U2Fsd开头首先想到AES,但AES需要密钥,将之前解码得到的假flag当作密钥进行解密,并未解密出明文,转而想到DES,经过多次尝试,最终发现加密方式为3DES。
0x16 19sanity
考点:Markdown
打开md文件获得flag。
0x17 ez-usb
考点:USB流量分析
解压附件获得一个流量包和exe文件,exe文件打开需要输入密码,先跳过。用wireshark打开流量包,发现是usb流量。
根据题目描述,推测为键盘的usb流量,添加过滤条件**usb.src==“1.8.1”**进行过滤,, 然后导出特定分组并生成一个新的流量包。
使用大佬的usb流量分析脚本进行分析即可获得密码。
打开exe文件输入密码即可获得flag。
下面附上大佬的脚本(github项目地址):
#!/usr/bin/env python
import sys
import os
DataFileName = "usb.dat"
presses = []
normalKeys = {"04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9","27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\","32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".","38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}
shiftKeys = {"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"","34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}
def main():
# check argv
if len(sys.argv) != 2:
print("Usage : ")
print(" python UsbKeyboardHacker.py data.pcap")
print("Tips : ")
print(" To use this python script , you must install the tshark first.")
print(" You can use `sudo apt-get install tshark` to install it")
print("Author : ")
print(" WangYihang <wangyihanger@gmail.com>")
print(" If you have any questions , please contact me by email.")
print(" Thank you for using.")
exit(1)
# get argv
pcapFilePath = sys.argv[1]
# get data of pcap
os.system("tshark -r %s -T fields -e usb.capdata 'usb.data_len == 8' > %s" % (pcapFilePath, DataFileName))
# read data
with open(DataFileName, "r") as f:
for line in f:
presses.append(line[0:-1])
# handle
result = ""
for press in presses:
if press == '':
continue
if ':' in press:
Bytes = press.split(":")
else:
Bytes = [press[i:i+2] for i in range(0, len(press), 2)]
if Bytes[0] == "00":
if Bytes[2] != "00" and normalKeys.get(Bytes[2]):
result += normalKeys[Bytes[2]]
elif int(Bytes[0],16) & 0b10 or int(Bytes[0],16) & 0b100000: # shift key is pressed.
if Bytes[2] != "00" and normalKeys.get(Bytes[2]):
result += shiftKeys[Bytes[2]]
else:
print("[-] Unknow Key : %s" % (Bytes[0]))
print("[+] Found : %s" % (result))
# clean the temp data
os.system("rm ./%s" % (DataFileName))
if __name__ == "__main__":
main()
0x18 Top1
考点:base64
把密文放在cyberchef上自动解密就出来了。
0x19 女神的朋友圈
考点:社工
第一层:
百度识图,获得酒店名称。
第二层:
依旧是百度识图,找到一篇文章,获得酒吧名
Tips:
由于题目已经告诉我们密码为全英文大写,这里直接爆破也可以。
第三层:
在图片3.jpg的图片属性中可以看到经纬度。
根据图片的经纬度进行坐标反查(不需要很精细,取第一个数字即可)。
可得出拍摄地为鄂尔多斯市,换成拼音解压即可获得flag。
Tips:
也可利用工具(例如LocaSpaceViewer)提取出图片精确的经纬度。
0x20 剑拔弩张的小红
考点:base64
base64解密后点击加群链接加群,在群文件里放着(真正的签到题!!!)。
欢迎加入青少年CTF:797842833(QQ群)
0x21 从尾看到头
考点:文件逆序,二维码批量扫描,base64,base64换表
下载附件得到一个压缩包,进行解压会报错,用010editor打开压缩包,发现文件头在末尾。
编写脚本进行逆序:
s=open("从尾到头.zip","rb").read()[::-1]
a=open("从尾到头1.zip","wb")
a.write(s)
a.close()
解压逆序后的压缩包,里面有三十多张二维码,手动或者编写脚本进行批量扫描:
import cv2
import pyzbar.pyzbar as pyzbar
for i in range(1,32):
qrcode = cv2.imread(str(i)+'.png')
data = pyzbar.decode(qrcode)[0].data.decode("utf-8")
with open('qrcode.txt','a') as f:
f.write(data)
f.close()
查看文本发现为base64密文,进行解密得到一串意义不明的文本,先放到一边。
用010editor打开galf.zip文件,发现情况跟第一个压缩包情况一样都是逆序,复用之前的脚本,修复后解压。
发现需要密码,将之前放到一边的文本作为密码进行解压获得flag.txt,这时候提交显示flag错误,将flag中的内容进行解密得到真正的flag。
0x22 原sher
考点:压缩包密码爆破,图片隐写
解压需要密码,题目提示6位,盲猜密码为qsnctf(拿爆破工具也能爆出来)。
解压出一张图片,用010editor打开,修改图片高度,保存后在此查看图片,发现flag。
0x23 BASE64隐写
考点:base64隐写
解密脚本:
d='''STJsdVkyeDFaR1U4YVc5emRISmxZVzArQ2c9PQ1=
STJsdVkyeDFaR1U4YzNSeWFXNW5QZ289DQ==
STJsdVkyeDFaR1U4WTNOMGNtbHVaejRLDV==
STJsdVkyeDFaR1U4WTNOMFpHbHZQZ289DQ==
STJSbFptbHVaU0J0WVhodUlEazVPUW89Dd==
Q2c9PQ1=
ZFhOcGJtY2dibUZ1WlhOd1lXTmxJSE4wWkRzSw1=
Q2c9PQ0=
WTJoaGNpUmpZVnR0WVhodVhTd2dZMkpiYldGNGJsMDdDZz09DU==
Q2c9PQ1=
YVc1MElHTnRjQ2h6ZEhKcGJtY2dZU3dnYzNSeWFXNW5JR2lwQ2c9PQ2=
ZXdvPQ1=
SUNBZ3lHbG1LR3V1YzJsNlpTZ3BJRDRnWWk1emFYcGxLQ2twQ2c9PQ3=
SUNBZ0lDbWdJb0J5WlhSMWNtNGdNVHNLDb==
SUNBZ0lHVnNjMlVnYVdZb1lTNXphWHBsS0NrZ1BDQmlMbk5wZW1Vb0tTa0sN
SUNBZ0lDQWdJQ0J5WlhSMWNtNGdMVEU3Q2c9PQ0=
SUNBZ0lHVnNjMlVLDd==
SUNBZ0lIc0sN
SUNBZ0lDQWdJQ0JtYjNJb2FXNTBJR2tnUFNBd095QnBJRHdnWVM1emFYcGxLQ2s3SUdrckt5a0sN
SUNBZ2lDQWdJQ2I3Q2c9PQ2=
SUNBZ1lDQWdJQ1FnSUNBZ2FXWW9ZVnRwWFNBOElHSmJhVjBwQ2c9PQ1=
SUNBZ0lDYWdJY0FnSUNBZ0lDYWdJSEpsZEhWeWJpYXRNVHNLDY==
SUNBZ1lDQWdJQ1FnSUNBZ2FXWW9ZVnRwWFNBK1lHSmJhVjBwQ2c9PQ1=
SUNBZ0lDXWdJX0FnSUNBZ0lDXWdJSEpsZEhWeWJpXXhPd289DX==
SUNBZ0lDQWdJQ0I5Q2c9PQ0=
SUNBZ0lDdWdJd0J5WlhSMWNtNGdNRHNLDd==
SUNBZ0lIMEsN
ZlFvPQ2=
Q2c9PQ1=
ZG05cFpDQnlaWE5sZEdFb2MzUnlhVzVuSUdFcENnPT0N
ZXdvPQ1=
SUNBZ1lHMWxiWE5sZENoallTd3dMSE5wZW1WdlppaGpZU2twT3dvPQ1=
SUNBZ2lHWnZjaWhwYm5RZ2FTQTlJREE3SUdrZ1BDQmhMbk5wZW1Vb2tUc2dhU3NyS1FvPQ2=
SUNBZ0lIc0sN
SUNBZ0lDQWdJQ0JqWVZ0cFhTQTlJR0ZiWVM1emFYcGxLQ2t0TVMxcFhTQXRJQ2N3SnpzSw0=
SUNBZ0lIMEsN
ZlFvPQ2=
Q2c9PQ0=
ZG05cFpDQnlaWE5sZEdJb2MzUnlhVzVuSUdJcENnPT0N
ZXdvPQ3=
SUNBZ1lHMWxiWE5sZENoallpd3dMSE5wZW1WdlppaGpZaWtwT3dvPQ1=
SUNBZ0lHWnZjaWhwYm5RZ2FTQTlJREE3SUdrZ1BDQmlMbk5wZW1Vb0tUc2dhU3NyS1FvPQ0=
SUNBZ0lIc0sN
SUNBZ1lDQWdJQ1JqWWx1cFhTQTlJR1piWWk1emFYcGxLQ2t1TVMxcFhTQXRJQ2N3SnpzSw1=
SUNBZ1lDQWdJQ1F2TDNCeWFXNTBaaWdpSldRaUxHTmlXMmxkS1RzSw1=
SUNBZ0lIMEsN
ZlFvPQ3=
Q2c9PQ3=
YzNSeWFXNW5JR1ZrWkNoemRISnBibWNnWVN3Z2MzUnlhVzVuSUdJcEx5L2xpcURtczVVSw1=
ZXdvPQ2=
SUNBZ0lISmxjMlYwWVNoaEtUc3ZMK2FLaXVhdmorUzRnT1M5amVXdG1PZWFoT1d0bCtlc3B1V1BtT2FJa09hVnNPV3RseXpsdWJia3VKVG1pb3JtbGJEbnU0VGxqNDNvdjRmbW5hWGt2ci9rdW83bGtJN3BuYUxrdUkzbGtJemt2WTNtbGJEbm03amxpcUFLDW==
SUNBZ0lISmxjMlYwWWloaUtUc0sN
SUNBZ0lHWnZjaWhwYm5RZ2FTTTlJREE3SUdrZ1BDTnRZWGh1T3lCcEt5c3BDZz09DT==
SUNBZ0lIc0sN
SUNBZ0lDQWdJQ0JqWVZ0cFhTQTlJR05oVzJsZElDc2dZMkpiYVYwN0NnPT0N
SUNBZ0lDQWdJQ0JwWmloallWdHBYU0ErUFNBeUtYc0sN
SUNBZ0lDTWdJT0FnSUNBZ1kyRmJhU3N4WFNBclBTTXhPd289DT==
SUNBZ0lDQWdJQ0FnSUNBZ1kyRmJhVjBnTFQwZ01qc0sN
SUNBZ0lDQWdJQ0I5Q2c9PQ0=
SUNBZ0lIMEsN
SUNBZ0lHSnZiMndnWm14aFp5QTlJSFJ5ZFdVN0NnPT0N
SUNBZ3lITjBjbWx1WnlCaklEMGdJaUk3Q2c9PQ3=
SUNBZ0lHWnZjaWhwYm5RZ2FTQTlJRzFoZUc0Z0xTQXhPeUJwSUQ0OUlEQTdJR2t0TFNrSw0=
SUNBZ0lIc0sN
SUNBZ0lDQWdJQ0JwWmlobWJHRm5JQ1ltSUdOaFcybGRJRDA5SURBcENnPT0N
SUNBZ0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN0NnPT0N
SUNBZ0lDQWdJQ0JwWmloallWdHBYU0FoUFNBd0tRbz0N
SUNBZ0lDcWdJc0FnSUNBZ1pteGhaeUE5SUdaaGJITmxPd289Dc==
SUNBZ2lDQWdJQ2JqSUNzOUlDaGpZVnRwWFNBcklDY3dKeWs3Q2c9PQ2=
SUNBZ0lDQWdJQ0F2TDNCeWFXNTBaaWdpSldRaUxHTmhXMmxkS1RzSw0=
SUNBZ0lIMEsN
SUNBZ0lHbG1LR1pzWVdjcENnPT0N
SUNBZ1lDQWdJQ1J5WlhSMWNtNGdJakFpT3dvPQ1=
SUNBZ0lHVnNjMlVLDX==
SUNBZ0lDdWdJd0J5WlhSMWNtNGdZenNLDd==
ZlFvPQ0=
Q2c9PQ0=
YzNSeWFXNW5JRzFwYm5Vb2MzUnlhVzVuSUdFc0lITjBjbWx1WnlCaUtTOHY1WWVQNXJPVkNnPT0N
ZXdvPQ0=
SUNBZ0lHbHVkQ0J6YVdkdUlEMGdNRHNLDQ==
SUNBZ0lHbG1LR050Y0NoaExDQmlLU0E5UFNBdE1Ta3ZMMkhrdUszbHVwVG9yNlhsclpqb3ZvUGxwS2ZubW9UcGdxUGt1S3JtbGJBSw0=
SUNBZ0lIc0sN
SUNBZ0lDQWdJQ0J6YVdkdUlEMGdNVHNLDQ==
SUNBZ0lDQWdJQ0J6ZEhKcGJtY2dkR1Z0Y0NBOUlHRTdDZz09DQ==
SUNBZ0lDQWdJQ0JoSUQwZ1lqc0sN
SUNBZ0lDQWdJQ0JpSUQwZ2RHVnRjRHNLDQ==
SUNBZ0lIMEsN
SUNBZ0lISmxjMlYwWVNoaEtUc0sN
SUNBZ0lISmxjMlYwWWloaUtUc0sN
SUNBZ0lHWnZjaWhwYm5RZ2FTQTlJREE3SUdrZ1BDQnRZWGh1T3lCcEt5c3BDZz09DQ==
SUNBZ0lIc0sN
SUNBZ0lDQWdJQ0JwWmloallWdHBYU0E4SUdOaVcybGRLWHNLDQ==
SUNBZ0lDQWdJQ0FnSUNBZ1kyRmJhU3N4WFNBdFBTQXhPd289DQ==
SUNBZ0lDQWdJQ0FnSUNBZ1kyRmJhVjBnS3owZ01qc0sN
SUNBZ0lDQWdJQ0I5Q2c9PQ0=
SUNBZ0lDQWdJQ0JqWVZ0cFhTQTlJR05oVzJsZElDMGdZMkpiYVYwN0NnPT0N
SUNBZ0lIMEsN
SUNBZ0lHSnZiMndnWm14aFp5QTlJSFJ5ZFdVN0NnPT0N
SUNBZ0lITjBjbWx1WnlCa0lEMGdJaUk3Q2c9PQ0=
SUNBZ0lHWnZjaWhwYm5RZ2FTQTlJRzFoZUc0Z0xTQXhPeUJwSUQ0OUlEQTdJR2t0TFNrSw0=
SUNBZ0lIc0sN
SUNBZ0lDQWdJQ0JwWmlobWJHRm5JQ1ltSUdOaFcybGRJRDA5SURBcENnPT0N
SUNBZ0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN0NnPT0N
SUNBZ0lDQWdJQ0JwWmloallWdHBYU0FoUFNBd0tRbz0N
SUNBZ0lDQWdJQ0FnSUNBZ1pteGhaeUE5SUdaaGJITmxPd289DQ==
SUNBZ0lDQWdJQ0JrSUNzOUlDaGpZVnRwWFNBcklDY3dKeWs3Q2c9PQ0=
SUNBZ0lDQWdJQ0F2TDNCeWFXNTBaaWdpSldRaUxHTmhXMmxkS1RzSw0=
SUNBZ0lIMEsN
SUNBZ0lHbG1LR1pzWVdjcENnPT0N
SUNBZ0lDQWdJQ0J5WlhSMWNtNGdJakFpT3dvPQ0=
SUNBZ0lHVnNjMlVLDQ==
SUNBZ0lDQWdJQ0J5WlhSMWNtNGdaRHNLDQ==
ZlFvPQ0=
Q2c9PQ0=
YzNSeWFXNW5JRzExYkNoemRISnBibWNnZUN3Z2MzUnlhVzVuSUhrcEx5OXo1TGk2NTZ5bTVZKzM1TDJOQ2c9PQ0=
ZXdvPQ0=
SUNBZ0lHbHVkQ0JzWlc1NElEMGdlQzV6YVhwbEtDazdDZz09DQ==
SUNBZ0lHbHVkQ0JzWlc1NUlEMGdlUzV6YVhwbEtDazdDZz09DQ==
SUNBZ0lHbG1LR3hsYm5nZ1BUMGdNU2tLDQ==
SUNBZ0lIc0sN
SUNBZ0lDQWdJQ0F2TDJOdmRYUThQSGc4UENJZ0lDQWlQRHg1UER4bGJtUnNPd289DQ==
SUNBZ0lDQWdJQ0JwWmloNElEMDlJQ0l4SWlBbUppQjVJRDA5SUNJeElpa0sN
SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNJeElqc0sN
SUNBZ0lDQWdJQ0JsYkhObENnPT0N
SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNJd0lpQTdDZz09DQ==
SUNBZ0lIMEsN
Q2c9PQ0=
SUNBZ0lDOHZjSEpwYm5SbUtDSWxaQzB0SldSY2JpSXNiR1Z1ZUN4c1pXNTVLVHNLDQ==
Q2c9PQ0=
SUNBZ0lITjBjbWx1WnlCaExDQmlMQ0JqTEdRN0NnPT0N
SUNBZ0lHRWdQU0I0TG5OMVluTjBjaWd3TENCc1pXNTRMeklwT3dvPQ0=
SUNBZ0lHSWdQU0I0TG5OMVluTjBjaWhzWlc1NEx6SXNJR3hsYm5ndk1pazdDZz09DQ==
SUNBZ0lHTWdQU0I1TG5OMVluTjBjaWd3TENCc1pXNTVMeklwT3dvPQ0=
SUNBZ0lHUWdQU0I1TG5OMVluTjBjaWhzWlc1NUx6SXNJR3hsYm5rdk1pazdDZz09DQ==
SUNBZ0lIQnlhVzUwWmlnaUpXUXRMU1ZrTFMwbFpDMHRKV1F0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMU1ZrTFNWa1hHNGlMR0V1YzJsNlpTZ3BMQ0JpTG5OcGVtVW9LU3dnWXk1emFYcGxLQ2tzSUdRdWMybDZaU2dwTENCNExuTnBlbVVvS1N3Z2VTNXphWHBsS0NrcE93bz0N
SUNBZ0lDOHZZMjkxZER3OGVEdzhJam9pUER4aFBEd2lJQ0k4UEdJOFBDSWdJanc4WXp3OElpQWlQRHhrUER4bGJtUnNPd289DQ==
SUNBZ0lITjBjbWx1WnlCaFl5QTlJRzExYkNoaExDQmpLVHNLDQ==
SUNBZ0lITjBjbWx1WnlCaVpDQTlJRzExYkNoaUxDQmtLVHNLDQ==
SUNBZ0lDOHZZMjkxZER3OGVEdzhJam9pUER4aFl6dzhJaUFpUER4aVpEdzhaVzVrYkRzSw0=
Q2c9PQ0=
SUNBZ0lITjBjbWx1WnlCaFlpQTlJRzFwYm5Vb1lTd2dZaWs3THk5aExXSUsN
SUNBZ0lITjBjbWx1WnlCalpDQTlJRzFwYm5Vb1pDd2dZeWs3Q2c9PQ0=
SUNBZ0lDOHZZMjkxZER3OGVEdzhJam9pUER4aFlqdzhJaUFpUER4alpEdzhaVzVrYkRzSw0=
Q2c9PQ0=
SUNBZ0lITjBjbWx1WnlCaFltTmtJRDBnYlhWc0tHRmlMQ0JqWkNrN0NnPT0N
SUNBZ0lDOHZZMjkxZER3OGVEdzhJam9pUER4aFltTmtQRHhsYm1Sc093bz0N
Q2c9PQ0=
SUNBZ0lITjBjbWx1WnlCbWFYSnpkQ0E5SUdGak93bz0N
SUNBZ0lHWnZjaWhwYm5RZ2FTQTlJREE3SUdrZ1BDQW9iR1Z1ZUNrN0lHa3JLeWtLDQ==
SUNBZ0lDQWdJQ0JtYVhKemRDQXJQU0FpTUNJN0NnPT0N
SUNBZ0lDOHZZMjkxZER3OFlXTThQQ0lnTFMwdExTMWhZeTB0TFMwZ0lqdzhabWx5YzNROFBHVnVaR3c3Q2c9PQ0=
Q2c9PQ0=
SUNBZ0lITjBjbWx1WnlCelpXTnZibVFnUFNCaFpHUW9ZV0pqWkN3Z1lXTXBPd289DQ==
SUNBZ0lITmxZMjl1WkNBOUlHRmtaQ2h6WldOdmJtUXNJR0prS1RzSw0=
SUNBZ0lHWnZjaWhwYm5RZ2FTQTlJREE3SUdrZ1BDQW9iR1Z1ZUM4eUtUc2dhU3NyS1FvPQ0=
SUNBZ0lDQWdJQ0J6WldOdmJtUWdLejBnSWpBaU93bz0N
Q2c9PQ0=
SUNBZ0lITjBjbWx1WnlCbWFXNGdQU0JoWkdRb1ptbHljM1FzSUhObFkyOXVaQ2s3Q2c9PQ0=
SUNBZ0lISmxkSFZ5YmlCaFpHUW9abWx1TENCaVpDazdDZz09DQ==
Q2c9PQ0=
ZlFvPQ0=
Q2c9PQ0=
YVc1MElHMWhhVzRvZG05cFpDa0sN
ZXdvPQ0=
SUNBZ0lITjBjbWx1WnlCNExDQjVPd289DQ==
SUNBZ0lIQnlhVzUwWmlnaTZLKzM2TDZUNVlXbDVMaWs1TGlxNUxxTTZMK2I1WWkyNXBXdzVhMlhPaUFpS1RzSw0=
SUNBZ0lHTnBiajQrZUQ0K2VUc0sN
SUNBZ0lITjBjbWx1WnlCaGJuTWdQU0J0ZFd3b2VDd2dlU2s3Q2c9PQ0=
SUNBZ0lHTnZkWFE4UEdGdWN6c0sN
ZlFvPQ0=
'''
e=d.splitlines()
binstr=""
base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
for i in e :
if i.find("==")>0:
temp=bin((base64.find(i[-3])&15))[2:]
#取倒数第3个字符,在base64找到对应的索引数(就是编码数),取低4位,再转换为二进制字符
binstr=binstr + "0"*(4-len(temp))+temp
#二进制字符补高位0后,连接字符到binstr
elif i.find("=")>0:
temp=bin((base64.find(i[-2])&3))[2:]
#取倒数第2个字符,在base64找到对应的索引数(就是编码数),取低2位,再转换为二进制字符
binstr=binstr + "0"*(2-len(temp))+temp
#二进制字符补高位0后,连接字符到binstr
str=""
for i in range(0,len(binstr),8):
str=str+chr(int(binstr[i:i+8],2))
#从左到右,每取8位转换为ascii字符,连接字符到字符串
print(str)
0x24 key
考点:snow隐写
打开flag文本,全选后发现存在空白部分,猜测为snow隐写(在一同解压出来的那种图片的属性中也能找到提示为snow)。
用snow隐写工具进行解密,出现乱码,猜测需要密码。
返回文本仔细阅读,找到key1,再次进行解密,获得flag。
0x25 末心的礼物
考点:binwalk,pyc反编译
下载文件解压得到一个exe执行文件,但这题不是考的逆向。
将exe文件用binwalk进行分解,可以获得一个可疑的pyc文件。
利用在线网站进行pyc反编译即可获得flag。
0x26 明日方舟
考点:steghide隐写,base64换表
在图片属性中看到出题人名字。
使用steghide分析,密码为出题人名字。
获得flag.txt。
向下翻找,在1200行找到hint。
丢到cyberchef解密。
在Q群查看出题人账号。
0x27 英雄联盟
考点:社工,英雄联盟赛事
开局一张图,做题全靠搜。
经常看英雄联盟比赛应该知道这个女主持人骆歆,使用谷歌识图进行识别。
看日期知道是2021年8月13日的某一场比赛,百度搜索骆歆。
根据日期推断为夏季赛,继续搜索。
在常规赛第九周找到8月3日,在bilibili搜索该场比赛。
在8分17秒处看到该图片动作,确定前半个flag。
后面的就依次查看即可,在8月6日19:00的比赛上再次看到骆歆。
确定后半flag。
0x28 索马里海盗
考点:压缩包爆破,掩码攻击
和ctfshow的2022七夕杯Misc部分的海盗的密码题目类似(指除了压缩包密码不同以外其它都一样),可以直接搜索WP进行参考。
下载文件获得一个加密的压缩包,根据提示获得密码线索。
百度搜索索马里的ip。
使用archpr工具的掩码攻击进行爆破。
解压后获得一个flag.zip,点击查看提示压缩包损坏。
使用010Editor打开即可获得flag。
0x29 caesar
考点:凯撒密码
网站在线解密,位移数为1。
0x30 just_a_rar
考点:压缩包爆破
下载文件用archpr工具爆破密码。
解压后获得一张图片,查看图片属性获得flag。
0x31 EZjoanDaemen
考点:zip伪加密,snow隐写,docx文件隐写,lsb隐写,aes解密
下载题目压缩包,解压发现需要密码,使用010Editor打开,发现压缩包为伪加密。
修改01为00,解压这个压缩包,获得docx文件。
在末尾处发现空白行,猜测为snow隐写,将空白部分复制出来并保存为文本,使用snow工具进行解密。
获得aes_key,暂时没用。
将docx文档后缀改为zip并解压。
在word\media\images路径下发现一堆图片。
用Stegsolve工具打开一张图片,在最低有效位下发现密文。
根据之前找到的aes_key猜测为aes加密,使用在线网站进行解密。
获得一个字符f,接着依次解密前几张图片,结果为:flag{
编写批量提取解密脚本:
'''
# @Author: https://github.com/librauee/Steganalysis/blob/master/LSB/get_info.py
# @Date: 2022-12-02 16:08:22
# @LastEditors: St1ck4r
# @LastEditTime: 2022-12-02 17:13:07
# @link: https://www.st1ck4r.top
'''
from PIL import Image
from Crypto.Cipher import AES
import base64
# aes密钥
password = b'welcome_to_misc!'
# AES ECB模式解密
def aesecb(c):
en_text = base64.b64decode(c) #需要加密的内容,bytes类型
aes = AES.new(password,AES.MODE_ECB) #创建一个aes对象
# AES.MODE_ECB 表示模式是ECB模式
den_text = aes.decrypt(en_text) # 解密密文
return den_text.decode().strip(b'\x00'.decode()) # den_text.decode():转化为str类型,strip(b'\x00'.decode()):去除末尾生成的\x00
def mod(x,y):
return x%y
def toasc(strr):
return int(strr, 2)
#le为所要提取的信息的长度,str1为加密载体图片的路径,str2为提取文件的保存路径
def func(le,str1,str2):
b=""
im = Image.open(str1)
lenth = le*8
width,height = im.size[0],im.size[1]
count = 0
for h in range(height):
for w in range(width):
#获得(w,h)点像素的值
pixel = im.getpixel((w, h))
#此处余3,依次从R、G、B三个颜色通道获得最低位的隐藏信息
if count%3==0:
count+=1
b=b+str((mod(int(pixel[0]),2)))
if count ==lenth:
break
if count%3==1:
count+=1
b=b+str((mod(int(pixel[1]),2)))
if count ==lenth:
break
if count%3==2:
count+=1
b=b+str((mod(int(pixel[2]),2)))
if count ==lenth:
break
if count == lenth:
break
# 提取隐藏信息
c=''
for i in range(0,len(b),8):
#以每8位为一组二进制,转换为十进制
stra = toasc(b[i:i+8])
#将转换后的十进制数视为ascii码,再转换为字符串写入到文件中
#print((stra))
c+=chr(stra)
# 写入指定文件
with open(str2,"a",encoding='utf-8') as f:
f.write(aesecb(c))
f.close()
def main():
#文件长度
le = 24
#含有隐藏信息的图片
for i in range(1,167):
new = "new_"+str(i)+".png"
#信息提取出后所存放的文件
get_info = "flag.txt"
func(le,new,get_info)
print("完成信息提取!")
if __name__=='__main__':
main()
获得base64加密的flag。
将flag的值经过6次base64解密即可获得最终flag。
0x32 好怪哦
考点:数据逆置,文件头修补,宽高隐写
下载文件解压获得一个压缩包,解压时提示损坏,使用010editor打开发现数据逆置。
编写修复脚本:
a = open('fuck.zip', 'rb')
aa = a.read()
aaa = aa[::-1]
b = open('flag.zip', 'wb')
b.write(aaa)
a.close()
b.close()
解压flag.zip文件,获得一张png图片,但是无法查看,使用010editor查看发现缺少文件头。
将png文件头(89 50 4e 47)补上去.
查看图片发现高度显示不正确。
修改图片高度(不用必须改正确,只要能把文字显示全即可)。
再次查看图片即可获得flag。
0x33 三体
考点:兽音解密,base58,16进制转字符,凯撒密码
根据题目提示猜测压缩包密码为《三体》的英文threebody,解压后获得flag密文,然后依次解密。
兽音解密
base58
16进制转字符
凯撒密码
0x34 excel骚操作
考点:excel,汉明码
懒得写了,直接看WP吧( ̄︶ ̄)
https://blog.csdn.net/qq_43871179/article/details/118310357
0x35 gakki
考点:文件分离、压缩包爆破,字频统计排序
下载文件解压出一张图片。
使用binwalk分离,得到一个加密压缩包。
使用archpr工具爆破密码。
解压获得加密文本,多次尝试解密无效后,猜测为字频排序,百度随便找个脚本修改运行即可。
list = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- =\\{\\}[]"
cipher = open('./flag.txt').read()
result = {}
for i in list:
counts = cipher.count(i)
i = '{0}'.format(i)
result[i] = counts
res = sorted(result.items(),key=lambda item:item[1],reverse=True)
for data in res:
print(data)
for i in res:
flag = str(i[0])
print(flag[0],end="")
0x36 再签到一次
青少年ctf论坛注册回复帖子即可。
0x37 Can_You_Find_Me
考点:图片隐写
010editor查看图片。
0x38 你会运算吗
考点:16进制位移,0宽隐写,steghide密码爆破
下载附件得到一张图片和一个需要密码的压缩包。
尝试打开图片,未果,使用010editor查看。
取反:
f=open("1.jpg",'rb')
f1=f.read()#二进制形式
with open('flag.jpg','wb') as f2:
for i in f1:
if i==0:
f2.write(bytes([0x0]))
#这里的b是int形式,要转换成bytes时,使用bytes(),且里面的内容需要加[]
else:
f2.write(bytes([0x100-i]))
f.close()
f2.close()
打开生成的图片,获得压缩包密码。
解压后获得两张图和一个txt文本。
3.jpg还是运用刚才的16进制取反脚本即可获得后半段flag。
查看txt文本,提示给出密码,但是需要爆破,猜测为大小写组合爆破。
推测图片2使用steghide隐写。
编写爆破脚本:
import os
def all_casings(input_string):
if not input_string:
yield""
else:
first = input_string[:1]
if first.lower() == first.upper():
for sub_casing in all_casings(input_string[1:]):
yield first + sub_casing
else:
for sub_casing in all_casings(input_string[1:]):
yield first.lower() + sub_casing
yield first.upper() + sub_casing
if __name__ =='__main__':
for x in all_casings("qsnctf"):
os.system("steghide extract -sf 2.jpg -p "+x)
print(x)
查看flag1.txt。
发现0宽隐写。
使用在线网站提取,获得前半部分flag。
0宽解密:http://330k.github.io/misc_tools/unicode_steganography.html
此文章不定时更新…