2023ISCC-MISC

好看的维吾尔族小姐姐


此时拿到一张png的图片;根据以往的思路和这张图片感觉高度被修改过;所以此时我们先使用工具来恢复一下

此时发现这个码不像是二维码;像是Data Matrix 条码;此时利用网站来帮助我们 https://demo.dynamsoft.com/barcode-reader/?ref=www.hackjie.com 解码;此时结果是unicode编码的一种形式;我们只需要倒序输出之后在unicode解码即可

汤姆历险记

此时拿到是一张jpg的图片;根据以往的思路此时可以怀疑这张图片里面可能藏有东西;此时我们先使用kali对其进行一个binwalk;此时果然发现了一个zip压缩包;此时我们使用foremost对其进行一个分离;解压时发现需要密码

接下来我们把这张照片利用记事本打开;此时发现了一段奇怪的编码;事出反常必有妖

此时这个是字频分析;利用脚本

1
2
3
4
5
6
7
8
from collections import Counter 
import os
ss="”
str1 = ss
result = Counter(str1)
print("".join([i[0] for i in result.most_common()]))
这段代码的作用是统计字符串 ss 中每个字符出现的次数,并按照出现次数从高到低对这些字符进行排序,最后输出排序后的字符。
它首先导入了 Python 中的 collections 模块,并从中引入了 Counter 类。接着定义了一个字符串变量 ss,并将其赋值给变量 str1。然后使用 Counter 类构造函数 Counter(str1) 统计了字符串 str1 中每个字符出现的次数,并将结果存储在 result 变量中。接下来,使用了列表生成式 [i[0] for i in result.most_common()],获取了 result 中出现次数最多的字符(即出现次数排名前几的字符),并将它们连接成一个新的字符串。最后通过 print() 函数将这个新的字符串输出

然后输入密码解压得到一篇文章

然后此时仔细观察这篇文章发现他的段落与段落之间的行距是不同的;这个时候我们进行首行缩进把段落与段落行距不同的区别出来;此时发现行距存在两种情况,分别是1.5倍和1倍此时的隐写可能是对应二进制的01或则莫斯电码的.-;
此时提取出来后是:…/-./-../-../.-/-.-/./.-;然后进行莫斯电码的解码后利用密码本进行一个替换即可

人生之路

此时获取到一张图片和一个压缩包;此时解压压缩包需要密码;根据题目的提示windows下大图标模式查看,成功的密码就在脚下;我们可以得知压缩包的密码即是人生之路.jepg;此时看到一串奇怪的字符

1
sOpXhOpXsO pOhXsOhXpO pOhOsO pOhOsO pXhXpXsXhXsX sOpOhOpXsO hOsO hOlOsOhXpO hOlOsOhXpOsOhX pOhOsO hOsOlO sOpOhOpXsO hOlOsOhOpO sOpOhXsOpOhXsO hOsO sOpXhOpXsO hsXlsXhpXhX pOlOsOhOhsX hOlOsOhXpO hOsO sXhXsXpXhXpX 

此时继续看提示:人生之路充满着迷茫,也许成功的密码就在脚下,也许需要我们行走四方,也许我们旅途的记录会发生整体漂移,也许我们已经记不清走了多少路,分不清旅途的方向(flag以大写字母组成)。

1
2
3
4
此时的行走四方-->可能代表的是上下左右四个方向
然后根据四个方向键awsd
可以推测此时的旅途的记录会发生漂移-->是经过凯撒密码加密后得到包含awsd的字符串
此时旅途的方向还是继续的暗示着我们-->方向键

此时我们先将压缩包内的字符串进行凯撒密码的爆破得到关于awsd的字符串;此时11的偏移量可得到

1
dZaIsZaIdZ aZsIdZsIaZ aZsZdZ aZsZdZ aIsIaIdIsIdI dZaZsZaIdZ sZdZ sZwZdZsIaZ sZwZdZsIaZdZsI aZsZdZ sZdZwZ dZaZsZaIdZ sZwZdZsZaZ dZaZsIdZaZsIdZ sZdZ dZaIsZaIdZ sdIwdIsaIsI aZwZdZsZsdI sZwZdZsIaZ sZdZ dIsIdIaIsIaI

此时使用学长编写的脚本即可获得flag

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
a = ['saIsIwIdIwaIsdIsI',
'sZwZdZsZaZdZsZaZ',
'aZsZdZ',
'sZwZdZsZaZ',
'dZaZsIdZaZsIdZ',
'dZaZsZaIdZ',
'aZsZdZwIaI',
'sZwIdZwIsZ',
'dZaIsZaIdZ',
'dZaIsZaI',
'sZwIdIdwIsaIsdI',
'sZdZ',
'wZsdIwdIsZ',
'<unknown>',
'sZdZwZaZ',
'sZwZdZsIaZ',
'aZwZdZsZsdI',
'sZwZdZsIaZdZsI',
'aZsIdZsIaZ',
'dZaIsZ',
'sZdZwZ',
'sIsdIdwIwI',
'sdZwdZsdZwdZ',
'sdZwaIwdIsaZ',
'sdIwdIsaIsI',
'<unknown>']

b = 'dZaIsZaIdZ aZsIdZsIaZ aZsZdZ aZsZdZ aIsIaIdIsIdI dZaZsZaIdZ sZdZ sZwZdZsIaZ sZwZdZsIaZdZsI aZsZdZ sZdZwZ dZaZsZaIdZ sZwZdZsZaZ dZaZsIdZaZsIdZ sZdZ dZaIsZaIdZ sdIwdIsaIsI aZwZdZsZsdI sZwZdZsIaZ sZdZ dIsIdIaIsIaI'
c = b.split(' ')

flag = ''

print(c)

for i in c:
for j in range(len(a)):
if i == a[j]:
flag += chr(j+0x41)
break
elif i == 'aIsIaIdIsIdI':
flag += '{'
break
elif i == 'dIsIdIaIsIaI':
flag += '}'
break
else:
flag += '?'

print(flag)

mystery of bits

此时依旧是给了一个压缩包和图片;而且这个图片的格式是png格式的;此时我们先恢复宽高看看能不能有啥发现,此时通过binwalk也没有发现隐藏什么,那么我们此时StegSolve.jar打开,切换颜色通道找到
sudo python3 setup.py install

此时通过把这张图片旋转拉伸得到压缩包的密码是ysafao245hfdisi

然后得到一个wav文件;经过尝试可以得到此题可能是stegpy隐写;此时使用stegpy时发现需要密码;这时我们将这段音频使用010打开后在文件末尾发现了password:ISCC2023

然后提取后发现是一串二进制的字符串

此时玩法就有很多了;最后确定是二进制转二维码
脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from PIL import Image
from zlib import *

t = '0000000000000000000000000000000011111110101010111111101111111001000001011101011100000100000100101110101111000111110010111010010111010101000000101001011101001011101010110100101000101110100100000100010110000001010000010011111110101010101010101111111000000000010011001101000000000000010101101010101010111110111110011110000111111100010100101110000010111010010110110101101111000011100000011100000111000001110001001011101001011010010110100000000110100000111000001110000000001011101001011010010110100100010001101001100111011101010100001010011111010110011101001111100000011001100100001101100101000010100010011000010000011000100001011100001011001110110110100100101011100111110101111111101100000000000100001010110100010001001111111001000110010010101010000100000101101111001001000111110010111010011101110101111110101001011101010111011001101110101000101110100010111010101110111010010000010110011001000110011110001111111000010001000010010100000000000000000000000000000000000'
MAX = 31 # 数字的长度为一个整数的平方(如36^2=1296)
pic = Image.new("RGB",(MAX,MAX))
i=0
for y in range(0,MAX):
for x in range(0,MAX):
if(t[i] == '1'):
pic.putpixel([x,y],(0,0,0))
else:pic.putpixel([x,y],(255,255,255))
i = i+1
pic.show()
pic.save("flag.png")

通讯方式

这题的考点在于左右声道差值的提取
exp1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import scipy.io.wavfile as wavfile //从scipy.io包中导入模块wavfile并将其别名为wavfile。

samplerate, data = wavfile.read('telegram2wechat.wav') //使用wavfile.read()读取WAV文件'telegram2wechat.wav'。该函数返回两个值:音频文件的采样率(samplerate)和音频数据本身(data)。

left = []

right = [] //创建两个空列表来存储左右声道的音频数据。

for item in data: //循环遍历音频数据中的每个项目

left.append(item[0])

right.append(item[1]) //将item的第一个项目(左声道)附加到left列表中,并将item的第二个项目(右声道)附加到right列表中。

diff = [left - right for left, right in zip(left, right)] //使用列表推导式计算每个样本中左右声道之间的差异。 zip(left,right)创建来自left和right的相应项目对,表达式left-right从每个对中减去左声道值的右声道值。

print(diff)

运行得到0,1,2一些数字和字符,从里面找到1,2的部分其余的删掉;我们单独写入一个txt文件里,然后我们把多余的符号去掉,并且转化为一个新的 RGB 图像
此时接着利用脚本计算其个数然后接着开平方
exp2

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
fp = open('通讯.txt').read().split(',') //通过逗号分隔并获取结果列表的长度。

print(len(fp))

from PIL import Image

img = Image.new('RGB', (49,49)) //Image.new 和for循环所需要的数字都为平方根得到的数字

i = 0

for x in range(49):

for y in range(49):
//然后它使用 PIL(Python Imaging Library)创建一个新的 RGB 图像,大小为 45x45,并遍历每个像素。

if fp[i] == ' 1':

img.putpixel((x,y), (0,0,0))

else:

img.putpixel((x,y), (255,255,255))

i += 1
//对于每个像素,它检查“fp”列表中相应的值是否等于“1”。如果是,则将像素设置为黑色(0,0,0),否则将其设置为白色(255,255,255)。最终生成的图像使用“show”方法显示出来。
img.show()

扫描后得到一串数字

此时根据前面的提示可知道这个以往是使用电报的形式进行信息传递;所以此时我们可以猜测这个是一串电码;然后经过验证这个是中文的电码;使用网站进行解码后在利用谐音即可获得flag
ps:https://www.qqxiuzi.cn/bianma/dianbao.php 中文电码解码

消息传递

此时选择导出IMF;发现了存在邮件

刚好和题目的信息传递对应;所以此时我们选择导出IMF文件;并进行查看时发现了存在一个压缩包;但是这个压缩包解压需要密码

此时在流量包中搜索key password pass等密码的关键词;在搜素pass时可以发现密码


此时把这两个密码拼接在一起就是压缩包的密码;然后解压出来发现是一组黑白图片;此时文件大小为160的是白色,192为黑色;又是两两对应的关系,此时的玩法可能是二进制或则摩斯密码;最后尝试得出是二进制提取出来得是

1
0100100101010011010000110100001101111011011010010011001001110011001100000110001100110010011000110011001101111101

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2
t = ""
for i in range(1,113):
a = cv2.imread(str(i)+".png")
a = list(a)
if(str(a[0][0])=="[255 255 255]"):
t+="0"
else:
t+="1"
print(t)
for i in range(0,len(t),8):
flag = ""
for j in range(8):
flag += t[i+j]
print(chr(int(flag,2)),end="")

此时经过二进制转字符串得到flag:ISCC{i2s0c2c3};然后使用密码本进行替换即可

菜鸟黑客1

依旧是老套路,先imageinfo再grep flag看看是否能找到跟flag相关的内容

此时发现了flag.txt;尝试对其进行提取,但是此时发现无法提取出来

那么此时我们可以考虑使用磁盘恢复工具进行一个恢复,然后再尝试提取

此时发现可以提取并且flag似乎是以DES进行加密的,然后根据题目的提示我们可得到密码为ISCC2023

菜鸟黑客2

因为题一和题二的附件是一样的,此时因为再Rstudio里面发现了一组照片,但是当时提取不出来,此时我们使用volatility提取试试看,此时提取出来后发现是有一组emoji的文件大小有点问题,此时还提取出一个连接

1
https://www.baidu.com/s?tn=93453552_hao_pg&ie=utf-8&sc=UWY4n1fdn1Rdn-qCmyqxTAThIjYkPWTdrHfsnjfYnjDLFhnqpA7EnHc1Fh7W5HcznHfkP1bY&ssl_sample=normal&srcqid=7168734798389100740&H123Tmp=nunew7&word=emoji%E6%91%A9%E6%96%AF%E5%AF%86%E7%A0%81

此时这个emoji代表着莫斯密码;接下来对emoji.jpg进行一个处理,此时先binwalk发现一个压缩包,接着对其进行foremost得到压缩包后发现需要密码,此时先盲猜一手ISCC2023发现密码正确

此时发现这是一个维吉尼亚密码,解密需要密钥,刚好和我们前面的哪个emoji莫斯密码对应,让我们看眼睛眼睛只有两种形态睁着的和闭着的所以,此时猜测这个突破点在眼睛,此时经过尝试发现圆眼睛(睁着的)为. 长眼睛(闭着的)为 -

1
./--/---/.---/../../.../..-./..-/-.

莫斯解密后得EMOJIISFUN,所以此时我们对MEQL{invk_vhlu_dzel_lkof}进行维吉尼亚解密