携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
MISC
2022冬奥会
图片在kali中,没有显示缩略图,其宽高很可能被修改过
修改图片的长之后,下面出些一些&#x编码,这是html实体编码。进行unicode解码得到
冰敦敦的小伙伴经常被人冷落,你知道他的原型是什么吗?
雪容融的原型是灯笼 得到一个jpg文件,把拖到010editor里得到flag
通过这个题目我学会了html实体编码,还有如何修改图片的长宽。
单板小将苏翊鸣
图片010editor修改高宽,下面有一个二维码 ,扫描二维码
得到unicode编码的东西,
\u5728\u8fd9\u6b21\u51ac\u5965\u4f1a\u7684\u821e\u53f0\u4e0a\uff0c\u6211\u56fd\u5c0f\u5c06\u82cf\u7fca\u9e23\u65a9\u83b7\u4e00\u91d1\u4e00\u94f6\uff0c\u90a3\u4f60\u77e5\u9053\u6b64\u6b21\u51ac\u5965\u4f1a\u6211\u56fd\u603b\u5171\u83b7\u5f97\u51e0\u679a\u5956\u724c\u5417\uff1f\u53c8\u5206\u522b\u662f\u51e0\u91d1\u51e0\u94f6\u51e0\u94dc\u5462\uff1f
然后进行解码,是让我猜测冬奥会总共有几枚奖牌,有分别是几枚金牌,银牌和铜牌。 分别是 15 9 4 2 压缩包密码就是这几个数字合并。 打开就是flag。 这个题目收获学会修改图片高低,学会Unicode编码。
隐秘的信息
给你的信息进行base64解密,解密得到
easy_to_find_the_flag 这是压缩包密码
里面有一张照片,LSB隐写,利用stegsolve查看
前九行,进行十六进制转二进制
ASCII码的二进制表达,是从 0000 0000 开始,到 0111 1111 结束, 1位十六进制数表示四位二进制数,比如十六进制的1二进制表示就是0001。转换要注意
111111010010010101001101000011010000110111101101010000011001100011010001000011011000100100110001110000011101100110101101100001010110000110010001101110001100100111001000110101011010010110100101001111011100110111110111111111000000000111111000000000000111111111111111111111000111111000111111111000000000111111111111000000000111000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011110001000100100000111100001100001101001001110001100111111101
ASCLL码使用指定的七位或八位二进制数组合来表示128或256种可能的组合。
所以,在针对ASCII码的形式进行修改后,得到
0100100101010011010000110100001101111011010100000110011000110100010000110110001001001100011100000111011001101011011000010101100001100100011011100011001001110010001101010110100101101001010011110111001101111101
转换后得到flag
这个题目收获到了lsb隐写的一些操作,然后ASCII码的二进制表达,是从 0000 0000 开始,到 0111 1111 结束, 1位十六进制数表示四位二进制数,比如十六进制的1二进制表示就是0001,ascll码使用指定的七位或八位二进制数组合来表示128或256种可能的组合。
降维打击
图片通过010editor打开,然后发现图片的头部是89 50 4E 47,然后发现最后也有一个 89 50 4E 47,
然后把后面的十六进制文本提取出来,在010editor中打开,保存图片位置,发现有一张图片。
利用zsteg查看这个黑白图片的各个通道的lsb
发现存在一个png,输出出来
将得到的png图片对照魔女文字,即可得到flag
这个题目收获了图片的头部是89 50 4E 47,通过十六进制保存图片,学会了zsteg隐写,
藏在星空中的诗-1
将图片经过ps打开,把透明度拉到最高。
得到一个顺序1,3,5,2,4,
又看到txt里的是特殊符号,且有序号
赛题又提示最好使用WinRAR,所以猜测密码是五排符号,就按13524的顺序得到xlsx文件的密码。发现是字母和字符的对照图片。

进行一一对应,就是flag。
本题目学会了photoshop的使用方法,如何把透明度拉到最高。也知道了WinRAR的强大。
真相只有一个
解压得到一个文本txt,一个png图片,一个无后缀名文件
把stream拖到010editor里面,
文件头前端与zip源文件数据区基本相同,前两位被修改;改为50 4B 03 04,内含stream.pcapng文件。
对图片进行zsteg分析
猜测该文本可能与解压密码有关。然后猜测可能需要掩码爆破。
所以密码就是19981111
然后打开是一个流量包,用wireshark打开,发现一个password.mp3文件。通过ftp查找定位到8692
用Audacity打开,放大在末尾发现摩斯密码。
通过解密得到密码是isccmisc
最后flag.txt是snow隐写,利用密码 得到flag
```
snow.exe -p isccmisc -C flag.txt
这个题目学到了如何用wirshark分离mp3文件,还有压缩包如何爆破,摩斯密码可以藏在音频里。题目指令很不错。
## 藏在星空中的诗-2
在星空中的诗1中,有一个xlsx文件,每一个星星都有对应的十六进制数字,是xlxs中每个星星对应的最后U+中的最后一个数字
然后拼出poem中全部的十六进制数,再转化为ascll码表就是flag
import json flag_enc="全部密文".replace("每组前三个相同的字符","") flag_unicode_hex=[str(hex(ord(i))).upper() for i in flag_enc if i!="\"] final_flag_unicode="" for i in range(len(flag_unicode_hex)): # if i%2==0 and i==0: # final_flag_unicode +="\u00"+flag_unicode_hex[i][-1] if i%2==0: final_flag_unicode +="\u00"+flag_unicode_hex[i][-1] else: final_flag_unicode+=flag_unicode_hex[i][-1] print(json.loads('"%s"' %final_flag_unicode))
这个题目学会了将星星转为十六进制数,将十六进制数再转化为ascll码表,题目还不错。
## 小光学AI
题目是让结合机器学习的方法分析像素点的比值。
所给的附件中给出了训练集(training_images),password和flag.zip。训练集中给出了上百张图片和xml文件,xml文件中记录了数据xmin,xmax,ymin,ymax。
计算像素脚本:
```python
import os
import sys
def get_sum(C:\Desktop\ISCC):
sum = 0
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.jpg'):
file_path = os.path.join(root, file)
sum += get_pixel_sum(file_path)
return sum
def get_pixel_sum(file_path):
sum = 0
with open(file_path, 'rb') as f:
for line in f:
sum += len(line)
return sum
if __name__ == '__main__':
path = 'mushroom/'
sum = get_sum(path)
print(sum)
通过手动计算,得到爆破字典
a = 34700
b = 46000
c = 56000
f = open("dict1.txt","w+")
for i in range(5000):
for j in range(5000):
for k in range(5000):
f.write(str(a+i) + ":" + str(b+j) + ":" + str(c+k)+'\n')
爆破字典得到打开压缩包获得flag:37035:49380:61725
套中套
密码隐藏在那张图片里,补全png格式再修改高可以获的一部分, flag1: wELC0m3_
然后拖到stegsolove,
flag1: wELC0m3_T0_tH3
用winhex打开,最后有一段base64,解密
flag1和flag2合起来wELC0m3_T0_tH3_ISCC_Zo2z
#!/usr/bin/python
import random
import codecs
import gmpy2
import sys
import os
def getRandom(randomlength=4):
digits="0123456789"
ascii_letters="abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
str_list =[random.choice(digits +ascii_letters) for i in range(randomlength)]
random_str =''.join(str_list)
return random_str
def makeKey(n):
privKey = [random.randint(1, 4**n)]
s = privKey[0]
for i in range(1, n):
privKey.append(random.randint(s + 1, 4**(n + i)))
s += privKey[i]
q = random.randint(privKey[n-1] + 1, 2*privKey[n-1])
r = random.randint(1, q)
while gmpy2.gcd(r, q) != 1:
r = random.randint(1, q)
pubKey = [ r*w % q for w in privKey ]
return privKey, q, r, pubKey
def encrypt(msg, pubKey):
msg_bit = msg
n = len(pubKey)
cipher = 0
i = 0
for bit in msg_bit:
cipher += int(bit)*pubKey[i]
i += 1
return bin(cipher)[2:]
flaggg=open('ffalg.txt','w')
# secret = input('Plz input the FLAG to generate the question.')
for i in range(50):
fe = open('enc.txt', 'w')
fpub = open('pub.Key', 'w')
fpriv = open('priv.Key', 'w')
fq = open('q.txt', 'w')
fr = open('r.txt', 'w')
print(i)
tt="ISCC{"
for j in range(3):
temp=getRandom()
tt=tt+temp+'-'
secret = tt[:-1]+'}'
flaggg.write(secret)
flaggg.write('\n')
msg_bit = bin(int(codecs.encode(secret.encode(), 'hex'), 16))[2:]
keyPair = makeKey(len(msg_bit))
pub_str = '['+', '.join([str(i) for i in keyPair[3]]) + ']'
fpub.write(pub_str)
#print ('pub.Key: ' + pub_str)
enc = encrypt(msg_bit, keyPair[3])
#print ('enc: ' + str(int(enc, 2)))
fe.write(str(int(enc, 2)))
priv_str = '['+', '.join([str(i) for i in keyPair[0]]) + ']'
#print ('priv.Key: ' + priv_str)
fpriv.write(priv_str)
#print('q: ' + str(keyPair[1]))
fq.write(str(keyPair[1]))
#print('r: ' + str(keyPair[2]))
fr.write(str(keyPair[2]))
name="misc-example-"+str(i+1)+".zip"
fe.close()
fpub.close()
fpriv.close()
fq.close()
fr.close()
os.system("zip -r -P'wELC0m3_T0_tH3_ISCC_Zo2z' tzt2.zip enc.txt generator.py priv.Key pub.Key q.txt r.txt")
os.system("zip -r ./output/{}.zip tzt.png tzt2.zip".format(name))
flaggg.close()
加密部分:
def encrypt(msg, pubKey):
msg_bit = msg
n = len(pubKey)
cipher = 0
i = 0
for bit in msg_bit:
cipher += int(bit)*pubKey[i]
i += 1
return bin(cipher)[2:]
这里就可以知道cipher就是选择若干个pubKey相加,而选择哪一方相加是由明文决定
如果但从这里看,可以尝试暴力说不定可以,不过很明显不靠谱
然后看看密钥的生成
def makeKey(n):
privKey = [random.randint(1, 4**n)]
s = privKey[0]
for i in range(1, n):
privKey.append(random.randint(s + 1, 4**(n + i)))
s += privKey[i]
q = random.randint(privKey[n-1] + 1, 2*privKey[n-1])
r = random.randint(1, q)
while gmpy2.gcd(r, q) != 1:
r = random.randint(1, q)
pubKey = [ r*w % q for w in privKey ]
return privKey, q, r, pubKey
得到的信息
公钥生成方式是r*w %q
私钥是递增的并且大于之前私钥数之和
q大于最后一个私钥
首先可以先乘上逆元r,将cipher转换为在q上的私钥运算
q大于所有私钥之和,私钥是递增的,大于之前私钥之和。所以很明显 ,对于任意的prikey_i,如果加入cipher,它的地位是唯一的,也就是加上它 cipher > prikey_i 不加上它 cipher < prikey_i(从最大的prikey开始判断)
可以写出最一般的情况解
for i in range(1):
r =
enc =
q =
#enc = encrypt(msg_bit, keyPair[3],keyPair[0],q)
key =
enc = (enc*gmpy2.invert(r,q))%q
flag = ''
for i in range(len(key)-1,-1,-1):
if enc - key[i] > 0:
enc -= key[i]
flag =flag+'1'
else:
flag+='0'
print(long_to_bytes(int(str(flag[::-1]),2)))
还有考虑一种特殊情况,就是之前的私钥值加上最后一个私钥值大于q的情况
此时需要先减去最后一个私钥值(mod q),之后同上
for i in range(1):
r =
enc =
q =
#enc = encrypt(msg_bit, keyPair[3],keyPair[0],q)
key =
enc = (enc*gmpy2.invert(r,q))%q
flag = ''
enc = (enc-key[-1])%q
flag+='1'
for i in range(len(key)-2,-1,-1):
if enc - key[i] > 0:
enc -= key[i]
flag =flag+'1'
else:
flag+='0'
print(long_to_bytes(int(str(flag[::-1]),2)))
这个题目确实是套中套,公钥生成方式是r*w %q,私钥是递增的并且大于之前私钥数之和,q大于最后一个私钥,首先可以先乘上逆元r,将cipher转换为在q上的私钥运算。题目挺有意思。增加了对密码学的见识。