Misc Justpainting 010打开压缩包,发现结尾多了五个?,猜测加密压缩包的密码是五位
爆破得到密码11452
打开得到一个python脚本和一张jbn.pth
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 50 51 52 53 54 55 import torchimport torch.nn as nnimport numpy as npimport matplotlib.pyplot as pltfrom PIL import Imageimport cv2class JBN (nn.Module): def __init__ (self ): super (JBN, self).__init__() self.main = nn.Sequential( nn.Linear(100 , 256 ), nn.ReLU(), nn.Linear(256 , 512 ), nn.ReLU(), nn.Linear(512 , 452 * 280 ), nn.Tanh() ) def forward (self, x ): img = self.main(x) img = img.view(-1 , 452 , 280 ) return imgdef watch_flag (img ): flag = cv2.imread('./data/data/flag.png' ) gray_image = cv2.cvtColor(flag, cv2.COLOR_BGR2GRAY) flag_tensor = torch.from_numpy(np.array(gray_image)) flag_tensor = flag_tensor.unsqueeze(0 ).transpose(1 , 2 ) img_tensor = img flag_tensor = flag_tensor.unsqueeze(0 ) img_tensor = img_tensor.unsqueeze(0 ) loss_fn = torch.nn.MSELoss() loss = loss_fn(flag_tensor.float (), img_tensor) return loss jbn = JBN() g_optimizer = torch.optim.Adam(jbn.parameters(), lr=0.001 ) min_loss = float ('inf' )for epoch in range (10 ): random_noise = torch.randn(1 , 100 ) jbn_img = jbn(random_noise) g_optimizer.zero_grad() g_loss = watch_flag(jbn_img) g_loss.backward() g_optimizer.step() with torch.no_grad(): if g_loss < min_loss: min_loss = g_loss torch.save(jbn.state_dict(), 'jbn.pth' )
题目的意思很明确,根据源码和jbn.pth反向生成flag
chatgpt
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 import torchimport torch.nn as nnimport numpy as npimport matplotlib.pyplot as pltfrom PIL import Imageimport cv2class JBN (nn.Module): def __init__ (self ): super (JBN, self).__init__() self.main = nn.Sequential( nn.Linear(100 , 256 ), nn.ReLU(), nn.Linear(256 , 512 ), nn.ReLU(), nn.Linear(512 , 452 * 280 ), nn.Tanh() ) def forward (self, x ): img = self.main(x) img = img.view(-1 , 452 , 280 ) return imgdef generate_flag (jbn_model, output_path ): jbn = JBN() jbn.load_state_dict(torch.load(jbn_model)) jbn.eval () with torch.no_grad(): random_noise = torch.randn(1 , 100 ) generated_img = jbn(random_noise) generated_img = generated_img.squeeze().numpy() generated_img = (generated_img + 1 ) / 2 generated_img = np.clip(generated_img, 0 , 1 ) plt.imshow(generated_img, cmap='gray' ) plt.axis('off' ) plt.savefig(output_path, bbox_inches='tight' , pad_inches=0 ) plt.show() generate_flag('jbn.pth' , 'generated_flag.png' )
justlisten 扫描汉信码hint.png,得到
010打开this is our secret.bmp
9e97ba2a是oursecret的特征
使用oursecret对bmp文件进行提取,密码是0urS3cret
提取出一个haha.txt
1 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_}{-?!
应该是一个字典
用Audacity查看嘘.wav文件,看它的频谱图,得知它的频率为[800,900,1000,1100,1200,1300,1400,1500,1700,1800]以及它的每个频率变化的时间为0.1s,同时可以得知它的采样频率为44100
脚本读取wav文件的数据长度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import numpy as npimport waveimport scipy.fftpack as fftpack SAMPLE_RATE = 44100 SAMPLE_TIME = 0.1 SAMPLE_NUM = int (SAMPLE_RATE * SAMPLE_TIME) LIST = [800 , 900 , 1000 , 1100 , 1200 , 1300 , 1400 , 1500 , 1600 , 1700 ]with wave.open ('嘘.wav' , 'rb' ) as f: wav_data = np.frombuffer(f.readframes(-1 ), dtype=np.int16) N = len (wav_data) print (N) a = (N/(44100 *0.1 ))/189 print (a)
可以得知数据长度N=1666980,然后再a = (N/(44100*0.1))/42来计算每个字符占了多少时长为0.2s
处理一下数字信号,并根据分离出的字典来获取隐藏的数据
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 50 51 52 53 import numpy as npimport waveimport scipy.fftpack as fftpack SAMPLE_RATE = 44100 SAMPLE_TIME = 0.1 SAMPLE_NUM = int (SAMPLE_RATE * SAMPLE_TIME) LIST = [800 , 900 , 1000 , 1100 , 1200 , 1300 , 1400 , 1500 , 1600 , 1700 ] def fft (data ): N = len (data) fft_data = fftpack.fft(data) abs_fft = np.abs (fft_data) abs_fft = abs_fft/(N/2 ) half_fft = abs_fft[range (N//2 )] return half_fft def dec_100ms (wave_data_100_ms ): fft_ret = fft(wave_data_100_ms) for index, freq in enumerate (LIST): if np.max (fft_ret[int (freq*SAMPLE_TIME) - 2 : int (freq*SAMPLE_TIME) + 2 ]) > 0.8 : print (freq, 'Hz有值' ) return indexdef dec_sentence (wav_data ): _100ms_count = len (wav_data) // SAMPLE_NUM print ('待解码音频包含' , _100ms_count // 2 , '个字' ) ret = '' for i in range (0 , _100ms_count, 2 ): index = 0 for k in range (2 ): index = index*10 + dec_100ms(wav_data[i*SAMPLE_NUM + k*SAMPLE_NUM : i*SAMPLE_NUM + (k+1 )*SAMPLE_NUM]) print ('序号:' , index) ret += string[index] return retif __name__ == '__main__' : with open ('haha.txt' , 'r' , encoding='utf8' ) as f: string = f.read() with wave.open ('嘘.wav' , 'rb' ) as f: wav_data = np.frombuffer(f.readframes(-1 ), dtype=np.int16) print (dec_sentence(wav_data))
运行得到flag
NoPasswd 打开doc文件发现加密
查看属性发现宏孩儿和60290f0225011a72697f420d1f4e402778231b
1 2 3 4 5 6 7 oleid:分析OLE文件以检测通常在恶意文件中发现的特定特征。 olevba:从MS Office 文档(OLE和OpenXML)中提取和分析VBA Macro源代码。 MacroRaptor:检测恶意的VBA宏 msodde:检测并从MS Office 文档,RTF和CSV中提取DDE / DDEAUTO链接 pyxswf:检测,提取和分析可能嵌入在MS Office 文档(例如Word,Excel)和RTF等文件中的Flash对象(SWF),这对于恶意软件分析特别有用。 oleobj:从OLE文件中提取嵌入式对象。 rtfobj:从RTF文件中提取嵌入式对象。
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 Sub XOREncryptFile() Dim numbers(8 ) As Integer numbers(0 ) = 19 numbers(1 ) = 71 numbers(2 ) = 122 numbers(3 ) = 99 numbers(4 ) = 65 numbers(5 ) = 111 numbers(6 ) = 43 numbers(7 ) = 67 Dim CurrentDirectory As String CurrentDirectory = ".\" If Dir(CurrentDirectory & "abc" ) = "" Then Exit Sub End If Dim FileNumber As Integer FileNumber = FreeFile Open CurrentDirectory & "abc" For Binary Access Read Write As #FileNumber Dim FileContent As String FileContent = Input$(LOF(FileNumber), #FileNumber) Close #FileNumber Dim EncryptedContent As String For i = 1 To Len(FileContent) EncryptedContent = EncryptedContent & Chr(Asc(Mid (FileContent, i, 1 )) Xor numbers((i - 1 ) Mod 8 )) Next i FileNumber = FreeFile Open CurrentDirectory & "enc" For Binary Access Write As #FileNumber Put #FileNumber, , EncryptedContent Close #FileNumberEnd Sub
分析一下可以知道就是简单的异或,enc应该就是备注中的16进制字符串,写个脚本解密一下可以得到doc的密码,解开doc可以发现base64字符串,解码一下可知是zip文件
1 2 3 4 5 6 7 8 9 10 11 from Crypto.Util.number import * enc = long_to_bytes(0x60290f0225011a72697f420d1f4e402778231b ) key = [19 ,71 ,122 ,99 ,65 ,111 ,43 ,67 ] abc = "" for i in range (len (enc)): abc += chr (enc[i] ^ key[i%8 ])print (abc)
解密得到一堆文字,可能是base64,cyberchef解密发现是zip,导出压缩包发现是伪加密
解压缩发现报png文件格式错误,说明压缩包里的是png,我们看看变量的数据
发现文件名应该是flag.png一共8个字节,但是变量那边的name长度只有4个字节,所以我们要改成8个字节
SecretZip 题目给了一个key文件,以及一个加密的zip,key文件内其实是压缩包明文压缩后的前半部分,因此压缩包虽然不是store的压缩模式,也能进行已知部分明文攻击
1 bkcrack -C purezip.zip -c 'secret key.zip' -p key
1 e63af7cc 55 ef839d dc10b922
解密的数据可能会被压缩,具体取决于创建 zip 文件时是否使用压缩。如果使用 deflate 压缩,则tools
可以使用文件夹中提供的 Python 3 脚本来解压缩数据。
1 2 bkcrack -C purezip.zip -c 'secret key.zip' -k e63af7cc 55 ef839d dc10b922 -d 01 _deflatepython3 inflate.py < 01 _deflate > 01 .zip
01.zip在010查看发现提示密码是2字节
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import zipfileimport libnumfrom tqdm import trangefor i in trange(256 ): for j in range (256 ): fz = zipfile.ZipFile('01.zip' , 'r' ) password = libnum.n2s(i) + libnum.n2s(j) try : fz.extractall(pwd=password) print (password) fz.close() break except : fz.close() continue else : continue break
解压出一个secret key.txt,里面内容e48d3828 5b7223cc 71851fb0
同时在zpaq文件的文件尾得到提示the password is md5(the plaintext of the secret key which length is 3 bytes)
因此要还原pkzip的三段秘钥,但是发现bkcrack自带了秘钥还原的接口
1 bb9cceb294113270da5eaed47a545f55
解压得到flag