冰冰好像藏着秘密
首先打开rar会提示说报错,这个不是题目本身的问题,而是考点之一——RAR伪加密。
zip伪加密已经玩烂了,所以整点不一样的新花样,那么这里首先说明一下RAR结构:
RAR伪加密是这样的(当然例子不是本题,本题因为RAR版本原因,010直接打开,模块是不识别的,但是原理是一样的):
我们可以看到RAR第24字节这个地方,对应着一个PASSWORD_ENCRYPTED,所以如果某RAR文件没有被加密,那么这一行中的数字为0
,将其修改为1
(就是现在这样)即可达到RAR伪加密的目的,在打开这个伪加密的文件时会显示文件头损坏,其中的内容也已被加密:
将其从1
改为0
就可以正常打开文件了。
当然如果熟悉RAR的师傅,也可以直接winhex或者010editor打开,把第24字节的后面一个4
改成0
也可以。(即从24
变成20
)
后面就是简单的FFT,直接上matlab脚本:
clear;
clc;
img = imread('FFT.png');
figure(1);
subplot(2,2,1);
imshow(img),title('水印图像');
F=fft2(img);
% F1=log(abs(F)+1);
% subplot(2,2,2);
% imshow(F1,[]),title('水印图像傅里叶');
Fs=fftshift(F);
S = log(abs(Fs)+1);
subplot(2,2,3);
imshow(S,[]),title('水印');
当然也有python脚本:
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('FFT.png', 0) #直接读为灰度图像
f = np.fft.fft2(img) #做频率变换
fshift = np.fft.fftshift(f) #转移像素做幅度谱
s1 = np.log(np.abs(fshift))#取绝对值:将复数变化成实数取对数的目的为了将数据变化到0-255
plt.subplot(121)
plt.imshow(img, 'gray')
plt.title('original')
plt.subplot(122)
plt.imshow(s1,'gray')
plt.title('center')
plt.show()
HAPPYNEWYEAR
这个题第一层本意不是考点,hint已经给出来了,直接网站上找到对应的编码即可:Chinese Code和Sheikah Language
解出来进入下一层,拿到一张图片,题目hint又给了是stegpy,但是没有给密码,那么肯定是爆破stegpy。那么这个题的考点就是stegpy爆破(hint2没有给的那么明显说爆破,给各位师傅道个歉)
stegpy用过的师傅都能够知道,它的密码不是直接在命令行明文输的,是一个交互式的工具,如下图所示(同样举个例子):
所以说直接命令行明文-p xxx
是会报错的,所以考验的就是是否会编写这种交互式工具的爆破,考验脚本能力。那么这边直接上解题脚本(这个脚本把整个stegpy的情况都考虑进去了,包括无密钥、有密钥且已知 和 有密钥但未知需要爆破三种情况)。
这题出处是几个搞MISC的朋友一起写的AutoMisc中本人写的stegpy部分,该工具目前还在更新中:
L1near/CTFpics-1forked from Misclife/CTFpics-1
# -*- coding: utf-8 -*-
import os
from subprocess import Popen,PIPE
import sys
def checkwebp(pic):
print("IF you don't need a password for the pic please input 1") # 无密钥
print("IF you know the password of the pic please input 2") # 有密钥且已知
print("IF not input 3 I will use the password.txt") # 有密钥但未知
choice = input()
if choice == '1':
os.system("stegpy {}".format(pic))
elif choice == '2':
print("INPUT THE password:")
password = input()
cmd = ["stegpy", "-p",pic]
subp = Popen([sys.executable, '-c', 'import pty, sys; pty.spawn(sys.argv[1:])', *cmd],stdin=PIPE,stdout=PIPE,stderr=PIPE)
print(subp.stdout.read(len("Enter password (will not be echoed):")))
subp.stdin.write(bytes((password+'\n').encode('utf-8')))
subp.stdin.flush()
print(subp.stdout.readlines())
# print(subp.stdout.readlines()[1])
print('\n')
elif choice == '3':
file = open('password.txt', 'r')
line = file.readline()
while line:
cmd = ["stegpy", "-p", pic]
subp = Popen([sys.executable, '-c', 'import pty, sys; pty.spawn(sys.argv[1:])', *cmd], stdin=PIPE, stdout=PIPE,stderr=PIPE)
print(subp.stdout.read(len("Enter password (will not be echoed):")))
subp.stdin.write(bytes((line + '\n').encode('utf-8')))
subp.stdin.flush()
print('result:')
print(subp.stdout.readlines()[1])
# print(subp.stdout.readlines()[1])
print('\n')
line = file.readline()
else :
print('Input Wrong!')
if __name__ == "__main__":
checkwebp('happynewyear.png')
password.txt也是这个工具里面的,是一个弱口令字典,不是啥特别的字典,经过爆破以后就能得到最后flag,注意环境得在linux下,python版本是python3: