menu L1nearのspace
V&NCTF2021_MISC官方wp
4621 浏览 | 2021-03-15 | 阅读时间: 约 2 分钟 | 分类: | 标签:
请注意,本文编写于 259 天前,最后修改于 258 天前,其中某些信息可能已经过时。

冰冰好像藏着秘密

首先打开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 CodeSheikah 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:

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

发表评论

email
web

全部评论 (共 2 条评论)

    Silence
    2021-03-15 17:44
    冰冰的秘密里的010的模板时师傅自己写的吗?我做题的时候模板运行完没那些item,哭哭。
      2021-03-16 15:22
      @Silence师傅好!模块是rar模块,010自带,但是因为此题的rar版本是rar5,010的rar模板不会自动识别,所以文章里拿了另一个来举例,但是原理是一样的。