芜湖~~~ 芜湖~~~
没想到不知不觉今年这一届就算结束了
真可谓真是八仙过海各显神通呀
本文章我们只讨论题,别的不讨论 题目还是很不错,我只是题目的搬运工
进入正题
以下是本人的一些解题思路和过程,供各位道友参考 对了不要喷呀 如有错误或者心得请联系我
小友看见定即时改正回复
对了小友 我自身实力 交了两个非预期 也是有运气在身 (这里本姓名就不再透露了,当然知道的人肯定知道 嘻嘻)
欧克 上干活
misc附件
链接:https://pan.baidu.com/s/1ECFKCp1y6daoJr-802SeCQ?pwd=lulu
提取码:lulu
--来自百度网盘超级会员V3的分享
目录
misc附件
链接:https://pan.baidu.com/s/1ECFKCp1y6daoJr-802SeCQ?pwd=lulu
提取码:lulu
--来自百度网盘超级会员V3的分享
好看的维吾尔族小姐姐
题目~
五十六个民族,五十六支花,五十六个兄弟姐妹是一家。现如今,民族团结的思想早已深入人心,而维吾尔族又是中华民族的重要组成部分,解决本题需要各位解题人知晓维吾尔族同胞的说话方式。
解题思路~
附件里只有一张
下载图片
Png图片
我们看到她是一直再往下看 (在暗示)
而且我们观察这张图片的高度是不协调的 所以高度一定被修改了
所以我们直接爆破高度 (风二西的工具应该已经普及)
爆破高度成功 图片如下
经验丰富的师傅应该可以直接看出来 这是Data Matrix 条码
但正常解是解不出的 我们可以观察他的黑边 和正常的Data Matrix 条码 的黑边位置不一样
所以我们下一步反转图片(二维码水平旋转)
直接上PS
垂直反转画布如下图
解码 在线网址
https://products.aspose.app/barcode/zh-hans/recognize/datamatrix#/recognized
得到如下代码
;521#&;33#&;101#&;011#&;111#&;001#&;801#&;801#&;101#&;911#&;59#&;611#&;501#&;59#&;611#&;111#&;301#&;59#&;711#&;111#&;121#&;321#&;76#&;76#&;38#&;37#&
这个不需要我说就知道这是什么编码了把 但格式有问题 还需要的进行倒序反转(脚本比较方便)
然后unicode解码
得到flag
ISCC{you_got_it_welldone!}
人生之路
题目~
人生之路充满着迷茫,也许成功的密码就在脚下,也许需要我们行走四方,也许我们旅途的记录会发生整体漂移,也许我们已经记不清走了多少路,分不清旅途的方向(flag以大写字母组成)。
解题思路~
附件只有一个压缩包和一个jpeg的图片
压缩包需要密码
所以只能从图片下手
但无论分离还是隐写都得不到什么有用的信息
我们回到题目
人生之路充满着迷茫,也许成功的密码就在脚下 (当时猜测密码是脚底下,需要我们改高度,可什么都没有,后来才知道压缩包密码就是图片的名称 “人生之路.jpeg”)
也许需要我们行走四方(行走四方,要么是四方密码,要么是键盘上的AWSD四个键,但是四方密码需要密钥,而且还不知一个)
也许我们旅途的记录会发生整体漂移1
回到正题
先解压压缩包
得到一个txt文档
根据以上信息我们编写脚本
import string
c = "sOpXhOpXsO pOhXsOhXpO pOhOsO pOhOsO pXhXpXsXhXsX sOpOhOpXsO hOsO hOlOsOhXpO hOlOsOhXpOsOhX pOhOsO hOsOlO sOpOhOpXsO hOlOsOhOpO sOpOhXsOpOhXsO hOsO sOpXhOpXsO hsXlsXhpXhX pOlOsOhOhsX hOlOsOhXpO hOsO sXhXsXpXhXpX ".strip()
a = c.split(" ")
a = list(a[0])
p = 0
for i in a:
if i in string.ascii_lowercase:
i = chr((ord(i) - 97 + p) % 26 + 97)
while i not in "wasd":
i = chr((ord(i) - 97 + 1) % 26 + 97)
p += 1
elif i in string.ascii_uppercase:
i = chr((ord(i) - 65 + p) % 26 + 65)
while i not in "ZI":
i = chr((ord(i) - 65 + 1) % 26 + 65)
p += 1
a = list(c)
for i in range(len(a)):
if a[i] == " ":
pass
else:
if a[i] in string.ascii_lowercase:
a[i] = chr((ord(a[i]) - 97 + p) % 26 + 97)
elif a[i] in string.ascii_uppercase:
a[i] = chr((ord(a[i]) - 65 + p) % 26 + 65)
a = "".join(a)
a = a.split(" ")
map = {"saIsIwIdIwaIsdIsI": "A", "sZwZdZsZaZdZsZaZ": "B", "aZsZdZ": "C", "sZwZdZsZaZ": "D", "dZaZsIdZaZsIdZ": "E", "dZaZsZaIdZ": "F", "aZsZdZwIaI": "G", "sZwIdZwIsZ": "H", "dZaIsZaIdZ": "I", "dZaIsZaI": "J", "sZwIdIdwIsaIsdI": "K", "sZdZ": "L", "wZsdIwdIsZ": "M", "wZsdZwZ": "N", "sZdZwZaZ": "O", "sZwZdZsIaZ": "P", "aZwZdZsZsdI": "Q", "sZwZdZsIaZdZsI": "R", "aZsIdZsIaZ": "S", "dZaIsZ": "T", "sZdZwZ": "U", "sIsdIdwIwI": "V", "sdZwdZsdZwdZ": "W", "sdZwaIwdIsaZ": "X", "sdIwdIsaIsI": "Y", "dZsaZdZ": "Z", "aIsIaIdIsIdI": "{", "dIsIdIaIsIaI": "}"}
for i in a:
print(map[i], end='')
print()
运行
得到flag
ISCC{FLPRCUFDELIYQPL}
菜鸟黑客1
题目~
找出菜鸟黑客小明留下的flag文件
密码:ISCC23
附件SHA256:502f6140232fb9c06ccfef635bc08002cc3cca440b724af33cf0b26737a2d96f
解题思路~
下载附件只有个raw的文件
这一看镜像的后缀 内存取证 直接上volatility (命令不过多解释,不懂的可以看看内存取证的文章)
vol.py -f Novice\ hacker.raw --profile=Win7SP1x64 filescan grep flag
我们通过命令搜索到一个flag.txt的文档
但是无法提取(但是volatility3好像可以 2不行)
所以使用软件
使用RStudio软件打开(当然别的读取磁盘的软件也可以) 驱动器 打开镜像
打开镜像
然后设备视图里就会有我们的文件
下一步我们扫描这个镜像
双击这个爆红的
就会出现文件视图
然后我们按照使用volatility扫描出来的路径
去找文件 如下图
另存为
打开之后里面是个类似flag的东西 但事实上不是
有提示 DES解码
密钥题目上有但不全 (完整的很容易想到ISCC2023)
Des解码在线网址
https://www.sojson.com/encrypt_des.html
得到flag
ISCC{dbsy_cdis_fd7n_s4fd}
菜鸟黑客2
题目~
爱画画的菜鸟黑客小明尝试攻击了一台电脑,电脑中记录了他的百感交集的心情。
密码:ISCC23
附件SHA256:502f6140232fb9c06ccfef635bc08002cc3cca440b724af33cf0b26737a2d96f
解题思路~
和菜鸟一的附件一模一样
猜测这个题藏flag的文件和上个题的路径一样
所以我们直接在桌面查看东西
vol.py -f Novice\ hacker.raw --profile=Win2008R2SP1x64 filescan | grep Desktop
再里面发现几个图片 但这个emoji.jpg的图片比较特殊
vol.py -f Novice\ hacker.raw --profile=Win2008R2SP1x64 dumpfiles -Q 0x000000007dfaff20 -D ./
我们将他导出来
得到一个emoji的表情包图片
看大小 不对劲
对这张图片就行分离
得到一个压缩包 压缩包里有txt文档
但需要密码
盲猜是ISCC2023 果然是
得到txt文件
里面是维吉尼亚密码提示 解MEQL{invk_vhlu_dzel_lkof}这串字符
但维吉尼亚解密需要密钥
所以下一步我们找密钥
我们回到那raw文件
查看他的记事板信息
vol.py -f Novice\ hacker.raw --profile=Win2008R2SP1x64 editbox
得到提示Pay attention to emoji's eyes
好的那我们回到那张emoji图片
让我们看眼睛 眼睛只有两种形态 争着的和闭着的 所以只可能是摩斯密码或者二进制
经过尝试
圆眼睛(睁着的)为. 长眼睛(闭着的)为 -
./--/---/.---/../../.../..-./..-/-.
解摩斯
得到 EMOJIISFUN
然后解维吉尼亚密码 解密
在线网址https://www.qqxiuzi.cn/bianma/weijiniyamima.php
得到flag
ISCC{afdf_buhi_pqwd_tfus}
汤姆历险记
题目~
汤姆来了,汤姆过来了,来听听汤姆的历险记!
解题思路~
下载附件只有一个tom.png和一个对照表
我们先对tom.png进行分离
Foremost分离
得到压缩包一个
但压缩包存在密码
在搜寻tom.jpg字符时
得到奇怪字符
当然经验丰富的师傅 一看就知道这是一段不属于正常文件编码的字段
有经验的话很快就能猜到是字频统计
进行字频统计 (也可以去在线网址)
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() 函数将这个新的字符串输出。
运行
得到
{yasuobpwrd91702!@$%^&*}
解压密码得到tom.docx
我们仔细观察发现每行的行距不一样
有一倍行距 和 1.5倍行距
然后我们全选进行首行缩进
这样段落就比较清晰了
每一个自然段 段是一个字符 (这种情况只能二进制码或摩斯密码 经过尝试得知为摩斯密码)
单倍行距的为. 1.5倍行距为-
单倍行距的为.
1.5倍行距为-
转莫斯密码
然后摩斯密码转字符
题目更新过 所以存在新老附件
老附件得到的摩斯密码 ../..---/.../-----/-.-./..---/-.-./...-- 解码后 i2s0c2c3
新附件得到的摩斯密码 .../-./-../--./.-/-.-/./.- 解码后 sndgakea
最后得到的字符
再按对照表转换
得flag
消息传递
题目~
消息是如何传递的呢(思考...)
解题思路~
正常解
下载附件 只有一个对照表 和一个流量包
那肯定先对流量包下手
导出IMF对象 (HTTP也有东西但没有什么用,我当初就是被迷惑了)
导出
是三封邮件 在最后一封有个压缩包
提出来
里面是112个图片 但需要密码
然后我们再回到流量包里
直接ctrl+f 搜索pass
两块拼起来就是密码
WRWAALIUWOHZAPQWFTQIPMVJFOKHHZUZ
解开压缩包
发现里面是黑白照片
转01,得二进制最后转字符
得到i2s0c2c3
这时候想起来还有个密码本
对照密码本破译 (每个人密码本不一样)
最终得到flag
非预期解
我们从三份邮件开始
三封邮件 在最后一封有个压缩包
提出来
里面是112个图片 但需要密码
从这里开始就是非预期解
压缩包密码是从流量包里找到的
正常思路我们是需要找的压缩包的
但我不需要压缩包密码也可以解题
这个压缩包打开之后 我们观察
然后就发现里边的图片只有两个大小 一个192 一个160
所以我们就有理由怀疑这112个png,只是名称不一样的两张图片
就想到了图片转二进制 二进制在转字符 而且正好112位
112/8=14 就是14位
安照惯例 大小的图片为0 小的图片为1
01001001 01010011 01000011 01000011 01111011 01101001 00110010 01110011 00110000 01100011 00110010 01100011 00110011 01111101
ISCC{i2s0c2c3}
然后按照对照表
得到flag
通信方式
题目~
在我们国家,我们使用微信就可以进行扫码、发消息等信息传递工作,你知道过去我们使用什么方式来传递消息吗?
解题思路~
下载附件只有一个mp3的文件
从里面得到了一段提示
In the past we used Telegram for communication. Now we use WeChat for communication.
Telegram 电报的意思
那猜测最后要使用电报的方式解密
第一步
我们要将立体声WAV文件分离成其左右声道,然后计算每个样本中它们之间的差异
上脚本
import scipy.io.wavfile as wavfile
samplerate, data = wavfile.read('telegram2wechat.wav')
left = []
right = []
for item in data:
left.append(item[0])
right.append(item[1])
diff = [left - right for left, right in zip(left, right)]
print(diff)
脚本解释
以下是每行代码的解释:
- 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 图像
fp = open('通讯.txt').read().split(',')
print(len(fp))
先运行上面的脚本
得到2401 然后开平方 得到49
49 是需要替换下面的脚本的
上脚本
fp = open('通讯.txt').read().split(',')
print(len(fp))
from PIL import Image
img = Image.new('RGB', (49,49))
i = 0
for x in range(49):
for y in range(49):
if fp[i] == ' 1':
img.putpixel((x,y), (0,0,0))
else:
img.putpixel((x,y), (255,255,255))
i += 1
img.show()
脚本解释
通过逗号分隔并获取结果列表的长度。
Image.new 和for循环所需要的数字都为平方根得到的数字
然后它使用 PIL(Python Imaging Library)创建一个新的 RGB 图像,大小为 45x45,并遍历每个像素。
对于每个像素,它检查“fp”列表中相应的值是否等于“1”。如果是,则将像素设置为黑色(0,0,0),否则将其设置为白色(255,255,255)。最终生成的图像使用“show”方法显示出来。
运行得到图片 (圈起来的数字要替换)
扫码
5337 5337 2448 2448 0001 2448 0001 2161 1721 1869 6671 0008 3296 4430 0001 3945 0260 3945 1869 4574 5337 0344 2448 0037 5337 5337 0260 0668 5337 6671 0008 3296 1869 6671 0008 3296 1869 2161 1721
接下来就是我最开始说的电报解码
提供在线网址 两个
中文电码查询 - 中文电码转换 - 中文电码对照表最全的简体中文电码和繁体中文电码查询https://dianma.bmcx.com/
https://www.qqxiuzi.cn/bianma/dianbao.php (这个比较好用)
艾艾斯斯一斯一括弧恩达不溜科一由偶由恩第艾克斯之艾艾偶可艾达不溜恩达不溜恩括弧
没想到作者最后一步 弄了个拼音 谐音梗
"艾一":"A",
"比":"B",
“斯一" :"C",
"第":"D",
"易":"E",
"艾福":"F",
"鸡":"G",
"艾吃":"H",
"之艾":"J",
"可艾":"K",
"艾偶":"L",
"艾木":"M",
"恩":"N",
"偶":"O"
"皮":"P",
"科一由":"Q",
"皮":"p",
"艾": 'I',
"之艾":'J',
"鸡":'G',
"可艾": "K",
"兹一": "z",
"艾斯":"s",
"斯一":'C',
"括弧": "{",
"艾木":"M",
"偶": "o",
"啊': 'R',
"艾福": 'F',
"替":'T',
"艾克斯":"X",
"滋一":"Z",
"达不溜":"W",
"由":"U",
写了几个不好辨认的
大家可以直接对换 也可以写脚本 我就不写了
最后得到flag
ISCC{NWQOUNDXJLKWNWN}
mystery of bits
题目~
这是什么?像素音乐!看一下!
解题思路~
下载附件只有zip和png文档
但压缩包需要密码
那只能从图片找起
图片很明显的高度 不够
修复高度
如下图
放进ps里
再看看其他通道 会发现图片的有文字
得下图
得到压缩包密码
ysafao245hfdisi
得到音频一个
题目名字(mystery of bits) 猜测是 stegpy 工具隐写
使用stegpy 这款隐写工具
stegpy _music.wav -p
密钥是 ISCC2023
得到一串二进制字符
0000000000000000000000000000000011111110101010111111101111111001000001011101011100000100000100101110101111000111110010111010010111010101000000101001011101001011101010110100101000101110100100000100010110000001010000010011111110101010101010101111111000000000010011001101000000000000010101101010101010111110111110011110000111111100010100101110000010111010010110110101101111000011100000011100000111000001110001001011101001011010010110100000000110100000111000001110000000001011101001011010010110100100010001101001100111011101010100001010011111010110011101001111100000011001100100001101100101000010100010011000010000011000100001011100001011001110110110100100101011100111110101111111101100000000000100001010110100010001001111111001000110010010101010000100000101101111001001000111110010111010011101110101111110101001011101010111011001101110101000101110100010111010101110111010010000010110011001000110011110001111111000010001000010010100000000000000000000000000000000000
总共961位 盲猜是二进制转二维
运行得到二维码
扫码得到flag
ISCC{congratulation_and_it_is_real}
你相信AI吗?
题目~
经典的算法,经典的数据,但也许会出现不一样的结果?
解题思路~
哈哈 各位道友还记得去年的AL吗
不用多说肯定是需要脚本的
但我们别急
道友们我们可以先分析分析这个题
附件里总共就有两个文件和压缩包(上图是解压过的)
这样我们先看第二个文件
在这个文件里有大量的输出文件 (像是AL算法的输出文件,对整体的解题没有主要的帮助)
但我们看最后一个文件
看一下源代码
里面有明显的png格式
所以我们直接加后缀
一张新的图片就这样诞生了 虽然没有什么用 但有提示呀
咦 那这个提示在那呢 我们慢慢说
这里有个小小的隐写 让我们打开stegsolve
这里有个小小的提示 就不过多解释了 都应该可以看懂
好我们看第一个文件
31个记事本
每个记事本都是 类似如上图
然后上脚本
脚本解释
(这段代码是读取一些文本文件中的数组数据,并将其转换成图片。对于每个文件,它会打开文件并读取其中的数据行,然后将这些数据存储到一个数字数组中。接下来,它会检查数组的长度,如果符合预期,则将这些数字数组转换成图片,并将图片保存到指定的输出目录中。如果数组长度不符合预期,程序就会告诉你当前文件的编号。)
import cv2
import numpy as np
for i in range(32):
with open(f"./dataset/{i}.txt", "r") as f:
data = f.read().splitlines()
image_data = np.array([float(line) for line in data])
# dic = {X: int(image_data.shape[0] / X) for X in range(1, image_data.shape[0]) if image_data.shape[0] % X == 0}
# for width, height in dic.items():
if image_data.shape[0] == 2352:
cv2.imwrite(f"./out/{i}.png", image_data.reshape(84, 28))
elif image_data.shape[0] == 1568:
cv2.imwrite(f"./out/{i}.png", image_data.reshape(56, 28))
else:
print(i)
在脚本所在目录创建个out的文件夹
运行脚本
Out文件夹 会生成很多带数字的png图片
接下来需要暴力破解这组密文
脚本解释
(脚本解释:
这段代码的作用是对给定的一组密文进行暴力破解,以找出加密前的明文。具体过程如下:
首先,我们定义了一个名为has_visible_bytes的函数,该函数用于检查输入的字节数组中是否包含可见字符(即ASCII码表中可打印的字符)。如果字节数组中所有的字节都是可见字符,则返回True,否则返回False。
然后,我们给出了一个密文cipher_text。这个密文实际上是一堆十进制数,需要将它们转换成字节流来还原出原来的明文。
接下来,在循环中,我们使用itertools.permutations函数枚举数字0到9的全排列,并使用maketrans和translate函数将数字替换为其对应的全排列。
随后,我们将每个密文按照刚才得到的映射表进行解密,并将结果存储在lis中。
接着,我们尝试将lis中的所有字符串转换成字节流,如果字节流中包含可见字符,则认为这是一个有效的解密结果,并检查其中是否包含特定的文本"ISCC{"。如果有,则说明我们已经成功地破解出了密文,并将结果写入out.txt文件中。
最后,程序会输出被base64解码后的明文。)
import string
import itertools
import contextlib
from base64 import b64decode
def has_visible_bytes(input_bytes):
return all(chr(byte) in string.printable for byte in input_bytes)
cipher_text = '51 59 75 95 56 46 664 636 52 57 685 77 56 50 688 669 56 682 688 687 25 73 680 684 22 685 28 633 683 56 96 96'.split(" ")
# 需要人眼OCR以下out文件夹内的输出
# cipher_text = '所有图像的ascii,空格隔开
with open("out.txt", "wb") as f:
for i in itertools.permutations("0123456789", 10):
maktrans = str.maketrans("0123456789", ''.join(i))
lis = [str.translate(i, maktrans) for i in cipher_text]
with contextlib.suppress(Exception):
plan_text = bytes(list(map(lambda x: int(x), lis)))
if has_visible_bytes(plan_text):
if b'ISCC{' in b64decode(plan_text):
print(b64decode(plan_text))
f.write(plan_text + b"\n")
运行得到flag
ISCC{2aiLA7mBgdlxbrVs}