ISCC-MISC

211 阅读13分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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文件的密码。发现是字母和字符的对照图片。 ![在这里插入图片描述](img-blog.csdnimg.cn/abdafd3fa24…](p3-juejin.byteimg.com/tos-cn-i-k3…)

进行一一对应,就是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上的私钥运算。题目挺有意思。增加了对密码学的见识。