Mu~sc

“燃烧自己!这样,即使你化为灰烬,人们也会从火光中找到你……”

各类加密/编码

可以试试直接用ciphey或者CyberChef跑

#ciphey在windows和wsl里都可以用
ciphey -t "aGVsbG8gbXkgbmFtZSBpcyBiZWU="

base家族

详细请看:https://www.cnblogs.com/0yst3r-2046/p/11962942.html

flag的编码值

base16                       666C6167
base32[A-Z2-7]               MZWGCZY=
base36                       727432
base58                       3cr9Ae
base64                       Zmxh
base85                       Ao(mg  W^7?+
base91                       @iH<Z
base92                       F#S<I
base100                     👝👣👘👞

base64还可以换表(表中的字符要求不重复)编码:

1.使用cyberchef解密

2.使用base64自定义解码脚本

#s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

s = ""

def My_base64_decode(inputs):
    # 将字符串转化为2进制
    bin_str = []
    for i in inputs:
        if i != '=':
            x = str(bin(s.index(i))).replace('0b', '')
            bin_str.append('{:0>6}'.format(x))
    #print(bin_str)
    # 输出的字符串
    outputs = ""
    nums = inputs.count('=')
    while bin_str:
        temp_list = bin_str[:4]
        temp_str = "".join(temp_list)
        #print(temp_str)
        # 补足8位字节
        if(len(temp_str) % 8 != 0):
            temp_str = temp_str[0:-1 * nums * 2]
        # 将四个6字节的二进制转换为三个字符
        for i in range(0,int(len(temp_str) / 8)):
            outputs += chr(int(temp_str[i*8:(i+1)*8],2))
        bin_str = bin_str[4:]   
    print("Decrypted String:\n%s "%outputs)

input_str = input("Please enter a string that needs to be decrypted: \n")
My_base64_decode(input_str)

Tips:base64可以与其他文件格式互相转换(比如图片[会有很多行的base64]),使用在线网站或者随波逐流转换即可
如果出现了很多层乱七八糟的base编码,连CyberChef都识别不出来的话,可以试试用BaseCrack这个开源工具
输入 python basecrack.py -m 运行即可

image-20240417225717357

base64循环解码脚本

import base64

def base64_auto(s):   
    for i in range(1,99999):
        print("Time ",i,":")
        decode_str = base64.decodebytes(bytes(s, encoding='utf8') )
        result=decode_str.decode()
        print(result)
        s=result#把result赋值给s,用于下一次的解码

s=""
base64_auto(s)  

MD5加密

明文:admin
32位小写21232f297a57a5a743894a0e4a801fc3 
32位大写21232F297A57A5A743894A0E4A801FC3 
16位小写7a57a5a743894a0e 
16位大写7A57A5A743894A0E 
Tips:十六位其实就是取32位的8-24位

MD5 加密后的密文应该是 纯数字+纯字符

有些 MD5 的 HASH 值可以直接在 somd5 或者 cmd5 上查


Emoji-AES编码:

带有key的表情字符串

在线解码:https://aghorler.github.io/emoji-aes/


词频分析:

一堆文字,看着什么编码都不像的,可能是词频分析,用在线网站跑https://quipqiup.com/,也可以用随波逐流


字频分析:

用随波逐流直接分析


摩斯电码:

1.只有.-或者只有01,具有二向性(例如yes和no可以转化成0和1)

2.加入/或者空格来替换换行符,具有三向性(例如图形题中的端点类型等等)


Vigenere(维吉尼亚)密码:

1.给了密文和Key

直接拉到cyberchef中解密即可

2.给了密文,没给密钥

在线网站:Vigenere Solver | guballa.de

3.根据对照表,手搓密钥的前几位

image-20240417224525084


希尔密码:

在线网站:http://www.metools.info/code/hillcipher243.html

1.已知密文和密钥,并且密钥(key)是一个网址,如http://www.verymuch.net

2.已知密文和密钥,并且密钥是四个数字

密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
密钥:3 4 19 11

对称加密算法

AES,DES,RC4,Rabbit均属于对称加密,解密需要key

密文特征:U2FsdGVkX1 有点像base64编码的(可能有+号)

在线网站:对称加密解密算法-计算对称加密解密结果在线工具 (jsons.cn)


云隐密码:

密文特征:只由01248组成

用随波逐流或者CTFD中的脚本直接跑


差分曼彻斯特编码:

ID为0x8893CA58的温度传感器的未解码报文为:3EAAAAA56A69AA55A95995A569AA95565556

差分曼彻斯特编码解码脚本

# -*- coding: utf-8 -*-
import struct
import math
def long_to_bytes(n):
    s = b''
    pack = struct.pack
    while n > 0:
        s = pack('>I', n & 0xffffffff) + s
        n = n >> 32
    for i in range(len(s)):
        if s[i] != b'\000'[0]:
            break
    else:
        s = b'\000'
        i = 0
    s = s[i:]
    return s

#字节逆序
def byteinvert(str_bin):
    ret=''
    for i in range(len(str_bin)//8):
        ret+=str_bin[i*8:i*8+8][::-1]
    return ret

#标准曼彻斯特
def MCST_stand(str_bin):
    ret=''
    for i in range(len(str_bin)//2):
        x=str_bin[i*2:i*2+2]
        if x=='01':
            ret+='0'
        elif x=='10':
            ret+='1'
        else:
            return 'stand manchester decode wrong!'
    return ret

#IEEE规范的曼彻斯特
def MCST_IEEE(str_bin):
    ret=''
    for i in range(math.ceil(len(str_bin)/8)):
        x=str_bin[i*2:i*2+2]
        if x=='01':
            ret+='1'
        elif x=='10':
            ret+='0'
        else:
            return 'stand manchester decode wrong!'
    return ret

#差分曼彻斯特
def MCST_diff(str_bin):
    ret=''
    for i in range(0,len(str_bin)//2-1):
        x1=str_bin[i*2:i*2+2]
        x2=str_bin[i*2+2:i*2+4]
        if x1==x2:
            ret+='0'
        else:
            ret+='1'
    return ret

if __name__ == "__main__":
    str_hex='9a9a9a6a9aa9656699a699a566995956996a996aa6a965aa9a6aa596a699665a9aa699655a696569655a9a9a9a595a6965569a59665566955a6965a9596a99aa9a9566a699aa9a969969669aa6969a9559596669'
    #str_bin='0101010101010101'
    str_bin=str(bin(int(str_hex,16)))[2:]

    m1=MCST_IEEE(str_bin)
    m2=MCST_stand(str_bin)
    m3=MCST_diff(str_bin)
    print('\nIEEE曼彻斯特:')
    print(m1)
    print(hex(int(m1,2)))
    print(long_to_bytes(int(m1,2)))
    print('\n 标准曼彻斯特:')
    print(m2)
    print(hex(int(m2,2)))
    print(long_to_bytes(int(m2,2)))
    print('\n 差分曼彻斯特:')
    print(m3)
    print(hex(int(m3,2)))
    print(long_to_bytes(int(m3,2)))
    print('\n=============字节逆序=============')
    m1=byteinvert(m1)
    m2=byteinvert(m2)
    m3=byteinvert(m3)
    print('\nIEEE曼彻斯特:')
    print(m1)
    print(hex(int(m1,2)))
    print(long_to_bytes(int(m1,2)))
    print('\n 标准曼彻斯特:')
    print(m2)
    print(hex(int(m2,2)))
    print(long_to_bytes(int(m2,2)))
    print('\n 差分曼彻斯特:')
    print(m3)
    print(hex(int(m3,2)))
    print(long_to_bytes(int(m3,2)))

社会主义核心价值观密码:

1.随波逐流解码

2.在线网站:http://www.hiencode.com/cvencode.html


outguess解密图片:

outguess -k ‘password’ -r 加密后的图片.jpg -t 明文.txt


盲文:

1.随波逐流解码

2.使用https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen在线翻译


base64隐写:

base64隐写脚本

def base64value(c):
    table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    for i in range(64):
        if table[i] == c:
            return i
    return 0    

def base64stego():
    f = open("flag.txt","rb")
    lines = f.readlines()
    x = ''
    for line in lines:
        l = str(line, encoding = "utf-8").strip()
        if l[-1] == '=':
            if l[-2] == '=':
                x += bin(base64value(l[-3]))[-4:]
            else:
                x += bin(base64value(l[-2]))[-2:]

    flag = ''
    for i in range(0, len(x), 8):
        flag += chr(int(x[i:i+8],2))
    print(flag)

if __name__ == '__main__':
    base64stego()

文本加密为音乐符号:

eg:♭♯♪‖¶♬♭♭♪♭‖‖♭♭♬‖♫♪‖♩♬‖♬♬♭♭♫‖♩♫‖♬♪♭♭♭‖¶∮‖‖‖‖♩♬‖♬♪‖♩♫♭♭♭♭♭§‖♩♩♭♭♫♭♭♭‖♬♭‖¶§♭♭♯‖♫∮‖♬¶‖¶∮‖♬♫‖♫♬‖♫♫§=

在线网站解密:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyue


敲击码

在线网站:CTF在线工具-在线敲击码|敲击码编码|敲击码算法|tap code (hiencode.com)

密文的特征为1-5的两位一组的数字,编码的范围是A-Z字母字符集,字母不区分大小写。

image-20240417230740608

….. ../… ./… ./… ../
5,2 3,1 3,1 3,2
W L L M

Polybius密码

随波逐流解密

image-20240417231024151


AES加密

不需要填IV的情况

  1. 可以用这个网站:http://tools.bugscaner.com/cryptoaes/
  2. 可以使用cyberchef,将IV设置为\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

密钥不足16字节的情况(需补齐16byte)

  1. 可以使用这个网站:https://www.sojson.com/encrypt_aes.html

也可能是Base64+AES-128混合加密,直接用厨子解密。要注意使用ECB mode并且把Input改为raw(key不足16位的话就在后面补0)


Decabit编码

正常的 Decabit编码 是十个字符一组的,如果不是十个一组,就很可能不是 Decabit编码

+-+-++—+- ++—-+-++- -+—++-++- +—++-++— —+++++—- ++-++—-+- +++-+-+—- +-+-+—-++ —-+++-++- -+—++-++- -+—+++-+- -+—++-++- -+—++-++- ++-+-+-+— -+—+++-+- ++-++—-+- -++++—-+- -+—++-++- ++-+-+-+— +-+++—-+- +++-++—— —-+++-++- +-+-+—-++ ++-+-+-+— +-+-+—++- ++—+—++- -++++—-+- +—-+++-+- ++-+-+-+— -++++—-+- -+—+++-+- +—+-+-++- +++-+-+—- +-+++—-+- -+—+-+++- -+—++-++- —-+++-++- ++++——+- -++++—-+- -+—+++-+- -+—++-++- ——+++++-

在线网站:https://www.dcode.fr/decabit-code

如果不是Decabit编码,可以试试看把+-分别用01替换


仿射密码

有两个key,key-a为必须是(1,3,5,7,9,11,15,17,19,21,23,25)中的一个,key-b是0~25的数字

gezx{j13p5oznp_1t_z_900y_k3z771h_k001}
key-a=17    
key-b=77
flag{w13e5hake_1s_a_900d_t3a771c_t001}

1.随波逐流解密

2.在线网站:CTF在线工具-在线仿射密码加密|在线仿射密码解密|仿射密码算法|Affine Cipher (hiencode.com)


无字天书(whitespace)&snow隐写

一个文件打开都是空白字符

在线网站:https://vii5ard.github.io/whitespace/ 复制进去直接run即可

snow隐写,到snowdos32工具目录下运行 SNOW.EXE -C -p password flag.txt 命令即可


中文电报(中文电码)

类似于下面这种四位数一组的编码,直接在线网站解码即可

5337 5337 2448 2448 0001 2448 0001 2161 1721 1869 6671 0008 3296 4430 0001 3945 0260 3945 1869 4574 5337 0344 2448 0037 5337 5337 0260 0668 5337 6671 0008 3296 1869 6671 0008 3296 1869 2161 1721


图形密码:

在线网站:List of Symbols Cipher - Online Decoder, Translator (dcode.fr)


中文电报(中文电码)

类似于下面这种四位数一组的编码,直接在线网站解码即可

5337 5337 2448 2448 0001 2448 0001 2161 1721 1869 6671 0008 3296 4430 0001 3945 0260 3945 1869 4574 5337 0344 2448 0037 5337 5337 0260 0668 5337 6671 0008 3296 1869 6671 0008 3296 1869 2161 1721


Quote-Printable编码

类似于下面这样的编码,直接使用 在线网站 解密即可

flag{ichunqiu_=E6=8A=80=E6=9C=AF=E6=9C=89=E6=B8=A9=E5=BA=A6}


中文ascii码

27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 21462 21518 27573 102 108 97 103

加上&#和分号,直接 CyberChef 或者 在线网站 解密即可


锟斤拷

这个东西的成因是 Unicode 的替换字符(Replacement Character,�)于 UTF-8 编码下的结果 EF BF BD 重复,在 GBK 编码中被解释为汉字 “锟斤拷”(EF BF BD EF BF BD)

import os

a = input('请选择你的功能(1、加密 2、解密):')
if a == "1":
    s = input('请输入你要加密的话:')
    utf = s.encode('utf')
    gbk = s.encode('utf').decode('gbk', errors='ignore')
    if len(s)%2 == 1:
        gbk = gbk + "�"
    print(gbk)
    os.system("pause")
if a == "2":
    s = input('请输入你要解密的话:')
    gbk = s.encode('gbk')
    utf = s.encode('gbk').decode('utf-8', errors='ignore')
    print(utf)
    os.system("pause")

键盘坐标密码

  1 2 3 4 5 6 7 8 9 0
1 Q W E R T Y U I O P
2 A S D F G H J K L
3 Z X C V B N M

伏羲六十四卦解码

import binascii 

b=''
dic={'䷁': '000000', '䷖': '000001', '䷇': '000010', '䷓': '000011', '䷏': '000100', '䷢': '000101', '䷬': '000110', '䷋': '000111', '䷎': '001000', '䷳': '001001', '䷦': '001010', '䷴': '001011', '䷽': '001100', '䷷': '001101', '䷞': '001110', '䷠': '001111', '䷆': '010000', '䷃': '010001', '䷜': '010010', '䷺': '010011', '䷧': '010100', '䷿': '010101', '䷮': '010110', '䷅': '010111', '䷭': '011000', '䷑': '011001', '䷯': '011010', '䷸': '011011', '䷟': '011100', '䷱': '011101', '䷛': '011110', '䷫': '011111', '䷗': '100000', '䷚': '100001', '䷂': '100010', '䷩': '100011', '䷲': '100100', '䷔': '100101', '䷐': '100110', '䷘': '100111', '䷣': '101000', '䷕': '101001', '䷾': '101010', '䷤': '101011', '䷶': '101100', '䷝': '101101', '䷰': '101110', '䷌': '101111', '䷒': '110000', '䷨': '110001', '䷻': '110010', '䷼': '110011', '䷵': '110100', '䷥': '110101', '䷹': '110110', '䷉': '110111', '䷊': '111000', '䷙': '111001', '䷄': '111010', '䷈': '111011', '䷡': '111100', '䷍': '111101', '䷪': '111110', '䷀': '111111'}
# dic={'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111', '复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}

a=b.strip()

s = ''
i = 0
while i < len(a):
    try:
        s += dic[a[i]]
    except:
        s += dic[a[i] + a[i + 1]]
        i += 1
    i += 1
decimal = int(s, 2)
hexadecimal_str = hex(decimal)
print(hexadecimal_str)

f=open("C:/Users/Xia/Desktop/1.png","ab")
pic = binascii.a2b_hex(hexadecimal_str.encode())
f.write(pic)
f.close()

各种文件头/尾:

.zip的文件头:50 4B 03 04 14 00 08 00
.rar的文件头:52 61 72 21
.rar的文件尾:C4 3D 7B 00 40 07 00
.pyc的文件头:03 F3 0D 0A
.jpg的文件头:FF D8 FF
.png的文件头:89 50 4e 47 0d 0a 1a 0a   文件尾:49 45 4E 44 AE 42 60 82
.gif的文件头:47 49 46 38
.gz的文件头:1F 8B 08 00
TIFF (tif),文件头:49492A00
Windows [Bitmap](https://so.csdn.net/so/search?q=Bitmap&spm=1001.2101.3001.7020) (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Postscript (eps.or.ps),文件头:252150532D41646F6265
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
M4a,文件头:00000018667479704D3441

#Tips
PNG文件的前16字节是已知的:89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 也就是说可以用bkcrack进行明文爆破


图片隐写

各种隐写可以先拉入网站解析一下:https://aperisolve.fr/


ImageGlass

图片查看工具,可以初步判断数据异常

image-20240331143313131

如上图可以发现是IEND块异常,从IEND块入手。


Exif信息

1.右键属性查看

2.在线网站:EXIF信息查看器 (tuchong.com)

Exif信息可能会含有存储图片拍摄设备,生成软件,拍摄地点等相关信息。


图片宽高

1.PNG和BMP图片可以用PuzzleSolver——ImageTools进行爆破

2.JPG图片需要进行手动在010editor中修改,修改位置如下:

image-20240326220516376


盲水印

1.单图:PuzzleSolver——FFT——FFT/Java

2.双图:PuzzleSolver——FFT——bwn/频域

3.可能会用到PhotoShop


LSB隐写

1.Stegslove(详细使用方法见工具食用说明)

2.zsteg


图像缩放攻击

特征:图片中有等距像素点阵

image-20240331135314899

1.PS——图像大小——邻近法(九合一)

2.提取图像间隔像素脚本

py main.py -f arcaea.png -p 0x0+3828x2148 -n 12x12
py main.py -f 要解密的图片 -p 第一个像素点的XY坐标+最后一个像素点的XY坐标 -n 两个等距像素点的XY距离的差值
如果是等距离提取整张图片中所有像素点,要注意右下角那个点的位置XY都要减去一倍的距离
Tips:在PS中按F8就可以看到每个像素点的具体坐标了

pixeljihad(有密码)

在线网站:PixelJihad (sekao.net)


IDAT及其他块隐写

1.ImageGlass可得知是否存在数据块错误

2.PNG Debugger进行CRC检验

检测各数据块(IHDR、IDAT、IEND)中的 CRC 是否正确

pngdebugger 图片路径            #CRC检验并回显
pngdebugger --verbose 图片路径  #查看数据块详细信息
pngdebugger 图片路径 > 1.txt #保存输出信息

数据块不能乱删,可能隐写内容藏于数据块中

3.tweakpng对数据块进行修改,查看数据块异常以及应该修改的值

image-20240331143903554

image-20240331143925238


OurSecret隐写

此隐写的特征JPG与PNG同理,在文件层结束后出现 *ž—º (9E 97 BA 2A)

image-20240331152320942

提示与“我们的秘密”有关


拼图题

图片拼接:

示例: 
montage 1.png -tile 8X6 -geometry +0+0 flag.png

#tile 长宽数量
#geometry 拼图间隙

图片排序:

示例: 
gaps run flag.png newflag.png --generations=9999 --population=300 --size=100

#generations 遗传算法的代的数量
#population 个体数量
#size 拼图块的像素尺寸(边长) <------IMPORTANT------> 

silenteye隐写

特征:放大图像后会有行列不对齐的小灰块

提示与“眼睛”有关


DeEgger Embedder

无隐写特征(可能),可不需要密码

提示与“嵌入”有关


LSB(最低有效位)隐写:

没有密钥的情况

# 用zsteg快速查看
zsteg -a (文件名)  #查看各个通道的lsb
-b的位数是从1开始的 
zsteg zlib.bmp -b 1 -o xy -v
提取文件并导出 
zsteg -e b1,r,lsb,xy 3.png > 123.jpg

信息藏在图片中有时候会看不出来,所以还是要用stegsolve.jar过一遍

有密钥的情况(cloacked-pixel)

lsb隐写的可能是加密后的数据,i春秋最喜欢的cloacked-pixel

已整合在PuzzleSolver——BruteForce中,可直接使用

image-20240331144745560


apngdis_gui

一张png图片还可能是apng,直接用apngdis_gui跑一下,可以分出两张相似的png


stegpy隐写(PNG)

已整合在PuzzleSolver——BruteForce中,可直接使用

image-20240331144827827


stegdectet

可以试试用stegdecte查看加密类型,但出现三颗星不一定就代表一定是这种加密方式


JPHS隐写

有可能会有密码

导出步骤 Select File —> seek —> demo.txt —> Save the file

可视化解密工具

image-20240331155159331


Steghide隐写

已知密码:

steghide extract -sf 1.jpg -p 123456

#-sf  参数
#test.jpg  图片名称
#-p 密码参数,后面空格跟密码,无密码可不加参数,回车就好

密码爆破:

stegbreak.exe -r rules.ini -f rockyou.txt -t p 图片名
stegseek 1.jpg rockyou.txt

outguess隐写

outguess -k “secret key” -r 1.jpg flag.txt

#secret key 密码
#1.jpg      隐藏信息的图片载体
#flag,txt   隐藏的文字信息

其他隐写

图像类型 隐写工具
PNG cloacked-pixel, stegpy, PixelJihad, OurSecret, DeEgger Embedder
JPG/JPEG SilentEye, steghide, outguess, jphide, F5-steganography, JSteg, Free File Camouflage, DeEgger Embedder, OurSecret
BMP SilentEye, wbStego4, steghide
PNM outguess

字体加粗的都是没有密码的工具,大部分都可以设置密码,也可以不设置密码,看出题人


音频隐写

音频类型 隐写工具
WAV SilentEye, steghide, stegpy, DeEgger Embedder, DeepSound, MP3Stego
MP3 DeepSound, MP3Stego
AU steghide
FLAC DeepSound
APE DeepSound

字体加粗的都是没有密码的工具,大部分都可以设置密码,也可以不设置密码,看出题人


压缩包

伪加密

1.7-zip (经测试7-zip可以直接解压两种伪加密的压缩包)

2.ZipCenOp修复

java -jar ZipCenOp.jar r xxx.zip

3.手动修复

在修复之前我们需要知道zip压缩包的文件结构,一个 ZIP 文件由三个部分组成:

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志

而伪加密中我们需要注意压缩源文件数据区的全局加密和压缩源文件目录区的全局方式位标记

压缩源文件数据区:50 4B 03 04 14 00 00 00

压缩源文件目录区:50 4B 01 02 3F 00 00 00

无加密 压缩源文件数据区的全局加密与压缩源文件目录区的全局方式位标记均为00 00
假加密 1.压缩源文件数据区的全局加密与压缩源文件目录区的全局方式位标记一个为00 00 一个为09 00
2.压缩源文件数据区的全局加密与压缩源文件目录区的全局方式位标记均为09 00
真加密 压缩源文件数据区的全局加密与压缩源文件目录区的全局方式位标记均为09 00

注意:00 00可以由02 00等偶数等效替代,同理09 00也可以由01 00等奇数等效替代


暴力破解

枚举爆破

使用工具:ARCHPR

注意枚举范围以及长度的设置(一般先用数字再用大小写字母,长度1-8)

CRC碰撞

特征:压缩包内文件大小均为相同字节(1bytes,2bytes,3bytes,4bytes)

python CRC-Tools.py -bytes 1.zip

#-bytes     1-4 只支持1-4Byte的压缩包CRC碰撞
#1.zip      压缩包路径
import zipfile
import argparse
import string
import binascii
import io, sys

def FileRead(zipname):
    try:
        f =open(zipname)                               #打开目标文件
        f.close()
    except FileNotFoundError:
        print ("未找到同目录下的压缩包文件" + zipname) #如果未找到文件,输出错误
        return                                         #退出线程,进行详细报错
    except PermissionError:
        print ("无法读取目标压缩包(无权限访问)")     #如果发现目标文件无权限,输出错误
        return                                         #退出线程,进行详细报错

def ReadCRC(zipname):
    zip_url = "./" + zipname
    file_zip = zipfile.ZipFile(zip_url) #用zipfile读取指定的压缩包文件
    name_list = file_zip.namelist()     #使用一个列表,获取并存储压缩包内所有的文件名
    crc_list = []
    print('+--------------遍历指定压缩包的CRC值----------------+')
    for name in name_list:
        name_message = file_zip.getinfo(name)
        crc_list.append(hex(name_message.CRC))
        print('[OK] {0}: {1}'.format(name,hex(name_message.CRC)))
    print('+---------------------------------------------------+')
    crc32_list = str(crc_list)
    crc32_list = crc32_list.replace('\'' , '')
    print("读取成功,导出CRC列表为:" + crc32_list) #导出CRC列表后,导入其他脚本进行CRC碰撞

def OneByte(zipname):
    zip_url = "./" + zipname
    file_zip = zipfile.ZipFile(zip_url)    #用zipfile读取指定的压缩包文件
    name_list = file_zip.namelist()        #使用一个列表,获取并存储压缩包内所有的文件名
    crc_list = []
    crc32_list = []
    print('+--------------遍历指定压缩包的CRC值----------------+')
    for name in name_list:
        name_message = file_zip.getinfo(name)
        crc_list.append(name_message.CRC)
        crc32_list.append(hex(name_message.CRC))
        print('[OK] {0}: {1}'.format(name,hex(name_message.CRC)))
    print('+-------------对输出的CRC值进行碰撞-----------------+')
    comment = ''
    chars = string.printable
    for crc_value in crc_list:
        for char1 in chars:                              #获取任意1Byte字符
            thicken_crc = binascii.crc32(char1.encode()) #获取任意1Byte字符串的CRC32值
            calc_crc = thicken_crc & 0xffffffff          #将任意1Byte字符串的CRC32值与0xffffffff进行与运算
            if calc_crc  crc_value:                    #匹配两个CRC32值
                print('[Success] {}: {}'.format(hex(crc_value),char1))
                comment += char1
    print('+-----------------CRC碰撞结束!!!-----------------+')
    crc32_list = str(crc32_list)
    crc32_list = crc32_list.replace('\'' , '')
    print("读取成功,导出CRC列表为:" + crc32_list)                     #导出CRC列表
    if comment:
        print('CRC碰撞成功,结果为: {}'.format(comment))                  #输出CRC碰撞结果
    else:
        print('CRC碰撞没有结果,请检查压缩包内文件是否为1Byte!!!')

def TwoByte(zipname):
    zip_url = "./" + zipname
    file_zip = zipfile.ZipFile(zip_url)    #用zipfile读取指定的压缩包文件
    name_list = file_zip.namelist()        #使用一个列表,获取并存储压缩包内所有的文件名
    crc_list = []
    crc32_list = []
    print('+--------------遍历指定压缩包的CRC值----------------+')
    for name in name_list:
        name_message = file_zip.getinfo(name)
        crc_list.append(name_message.CRC)
        crc32_list.append(hex(name_message.CRC))
        print('[OK] {0}: {1}'.format(name,hex(name_message.CRC)))
    print('+-------------对输出的CRC值进行碰撞-----------------+')
    comment = ''
    chars = string.printable
    for crc_value in crc_list:
        for char1 in chars:
            for char2 in chars:
                res_char = char1 + char2                        #获取任意2Byte字符
                thicken_crc = binascii.crc32(res_char.encode()) #获取任意2Byte字符串的CRC32值
                calc_crc = thicken_crc & 0xffffffff             #将任意2Byte字符串的CRC32值与0xffffffff进行与运算
                if calc_crc  crc_value:                       #匹配两个CRC32值
                    print('[Success] {}: {}'.format(hex(crc_value),res_char))
                    comment += res_char
    print('+-----------------CRC碰撞结束!!!-----------------+')
    crc32_list = str(crc32_list)
    crc32_list = crc32_list.replace('\'' , '')
    print("读取成功,导出CRC列表为:" + crc32_list)                     #导出CRC列表
    if comment:
        print('CRC碰撞成功,结果为: {}'.format(comment))                  #输出CRC碰撞结果
    else:
        print('CRC碰撞没有结果,请检查压缩包内文件是否为2Byte!!!')

def ThreeByte(zipname):
    zip_url = "./" + zipname
    file_zip = zipfile.ZipFile(zip_url)    #用zipfile读取指定的压缩包文件
    name_list = file_zip.namelist()        #使用一个列表,获取并存储压缩包内所有的文件名
    crc_list = []
    crc32_list = []
    print('+--------------遍历指定压缩包的CRC值----------------+')
    for name in name_list:
        name_message = file_zip.getinfo(name)
        crc_list.append(name_message.CRC)
        crc32_list.append(hex(name_message.CRC))
        print('[OK] {0}: {1}'.format(name,hex(name_message.CRC)))
    print('+-------------对输出的CRC值进行碰撞-----------------+')
    comment = ''
    chars = string.printable
    result_dict={}
    for char1 in chars:
        for char2 in chars:
            for char3 in chars:
                res_char = char1 + char2 + char3                #获取任意3Byte字符
                thicken_crc = binascii.crc32(res_char.encode()) #获取任意3Byte字符串的CRC32值
                calc_crc = thicken_crc & 0xffffffff             #将任意3Byte字符串的CRC32值与0xffffffff进行与运算
                for crc_value in crc_list:
                    if calc_crc  crc_value:                       #匹配两个CRC32值
                        index = crc32_list.index(hex(crc_value))
                        num = int(index)
                        new_data = {num : res_char}
                        print('[Success] 第 {} 个文件 {}: {}'.format(num,hex(crc_value),res_char))
                        result_dict.update(new_data)
                        break
    sorted_items = sorted(result_dict.items())
    for key, res_char in sorted_items:
        comment += res_char
    print('+-----------------CRC碰撞结束!!!-----------------+')
    crc32_list = str(crc32_list)
    crc32_list = crc32_list.replace('\'' , '')
    print("读取成功,导出CRC列表为:" + crc32_list)                     #导出CRC列表
    if comment:
        print('CRC碰撞成功,结果为: {}'.format(comment))                  #输出CRC碰撞结果
    else:
        print('CRC碰撞没有结果,请检查压缩包内文件是否为3Byte!!!')

def FourByte(zipname):
    zip_url = "./" + zipname
    file_zip = zipfile.ZipFile(zip_url)    #用zipfile读取指定的压缩包文件
    name_list = file_zip.namelist()        #使用一个列表,获取并存储压缩包内所有的文件名
    crc_list = []
    crc32_list = []
    print('+--------------遍历指定压缩包的CRC值----------------+')
    for name in name_list:
        name_message = file_zip.getinfo(name)
        crc_list.append(name_message.CRC)
        crc32_list.append(hex(name_message.CRC))
        print('[OK] {0}: {1}'.format(name,hex(name_message.CRC)))
    print('+-------------对输出的CRC值进行碰撞-----------------+')
    comment = ''
    chars = string.printable
    result_dict={}
    for char1 in chars:
        for char2 in chars:
            for char3 in chars:
                for char4 in chars:
                    res_char = char1 + char2 + char3 + char4        #获取任意4Byte字符
                    thicken_crc = binascii.crc32(res_char.encode()) #获取任意4Byte字符串的CRC32值
                    calc_crc = thicken_crc & 0xffffffff             #将任意4Byte字符串的CRC32值与0xffffffff进行与运算
                    for crc_value in crc_list:
                        if calc_crc  crc_value:                       #匹配两个CRC32值
                            index = crc32_list.index(hex(crc_value))
                            num = int(index)
                            new_data = {num : res_char}
                            print('[Success] 第 {} 个文件 {}: {}'.format(num,hex(crc_value),res_char))
                            result_dict.update(new_data)
                            break
    sorted_items = sorted(result_dict.items())
    for key, res_char in sorted_items:
        comment += res_char
    print('+-----------------CRC碰撞结束!!!-----------------+')
    crc32_list = str(crc32_list)
    crc32_list = crc32_list.replace('\'' , '')
    print("读取成功,导出CRC列表为:" + crc32_list)                     #导出CRC列表
    if comment:
        print('CRC碰撞成功,结果为: {}'.format(comment))                  #输出CRC碰撞结果
    else:
        print('CRC碰撞没有结果,请检查压缩包内文件是否为4Byte!!!')

if __name__  '__main__':
    title()
    parser = argparse.ArgumentParser(description="CRC-Tools V2.2", epilog='根据压缩包内容选择不同参数,诸如:python3 CRC-Tools.py -4 4Byte-Demo.zip 目前只支持1-4Byte的压缩包CRC碰撞')
    #parser = argparse.ArgumentParser(prog="CRC32-Tools", usage="开源项目[%(prog)s] 实现了如下功能:")
    parser.add_argument('-z', action='store', dest='readzip', help='读取对应压缩包,输出各个文件CRC值列表')
    parser.add_argument('-1', action='store', dest='onebyte', help='对1Byte的压缩包自动进行CRC碰撞并输出文件内容')
    parser.add_argument('-2', action='store', dest='twobyte', help='对2Byte的压缩包自动进行CRC碰撞并输出文件内容')
    parser.add_argument('-3', action='store', dest='threebyte', help='对3Byte的压缩包自动进行CRC碰撞并输出文件内容')
    parser.add_argument('-4', action='store', dest='fourbyte', help='对4Byte的压缩包自动进行CRC碰撞并输出文件内容')
    args = parser.parse_args()
    try:
        if args.readzip:
            FileRead(args.readzip)
            ReadCRC(args.readzip)
        if args.onebyte:
            FileRead(args.onebyte)
            OneByte(args.onebyte)
        if args.twobyte:
            FileRead(args.twobyte)
            TwoByte(args.twobyte)
        if args.threebyte:
            FileRead(args.threebyte)
            ThreeByte(args.threebyte)
        if args.fourbyte:
            FileRead(args.fourbyte)
            FourByte(args.fourbyte)
    except KeyboardInterrupt:
        print("Ctrl + C 手动终止了进程")
        sys.exit()
    except BaseException as e:
        err = str(e)
        print('脚本详细报错:' + err)
        sys.exit(0)

字典攻击

1.根据题目生成字典

2.遍历常用字典进行爆破


掩码攻击

不确定位为英文?

明文攻击

1.ARCHPR

2.bkcrack

攻击需要至少 12 字节的已知明文。 其中至少 8 个必须是连续的。 连续的已知明文越大,攻击速度越快。

这里需要注意的是,明文爆破其实并不是一定需要CRC检验值完全一样,满足上述条件即可

Key爆破:

bkcrack -C 1.zip -c 1.txt -p 2.txt

#-C 加密ZIP文件名
#-c ZIP文件中已知的加密文件名
#-p 已知的明文文件名
#-k 已知明文在加密文件中的偏移量
#如果没有偏移量信息,可以尝试自动找到正确的偏移量,但这通常需要明文文件和加密文件有足够长的相同内容。

修改压缩包密码:

bkcrack -C 1.zip -k 7163444a 203b76b0 17de1387 -U ./2.zip 123

#-C 加密ZIP文件名
#-k Key值
#-U 新压缩包及密码

密码爆破(不推荐):

bkcrack -k 7163444a 203b76b0 17de1387 -r 16 \?a

#-k Key值
#-r <Length>密码的最大长度       <charset>密码可能会使用的字符集
?1:小写字母 (a-z)
?u:大写字母(A-Z)
?d:十进制数字(0-9)
?s:标点符号
?a: 字母数字字符,即小写字母、大写字母和数字的组合 (相当于 ?1?u?d)
?p:可打印字符,包括字母数字字符和标点符号 (相当于 ?a?s)
?b:所有字节 (0x00-0xff)

Office相关隐写

Excel文件:.xls .xlsx

1.拉入010或者记事本,查找flag

2.取消隐藏先前隐藏的行和列

3.条件格式里设置突出显示某些单元格(黑白后可能会有图案)

4.要先将数据按照行列排序后再进行处理

Word文件:.doc .docx

1.直接foremost出隐藏文件

2.文字颜色或隐藏对象

3.利用行距来隐写

word中可能有一段是1倍行距,可能又有一段是1.5倍行距,需要根据不同行距敲出摩斯电码(单倍转为.多倍转为-空行转为空格或者分隔符)


二维码思路

1.bmp转二维码

2.16进制转pyc

3.字符串制作二维码

4.四个TTL值转换一个字节的二进制数

5.Aztec code、DataMatrix、GridMatrix、汉信码、PDF417code等

6.二维码的修复

Snipaste_2024-04-22_16-28-09

二维码由三角定位点和中间的纠错区域构成,可以根据以上原则修复相关块

工具食用说明

Stegslove

image-20240330210447662

常用于LSB隐写,常用功能如下:

1.File Format(文件格式)

image-20240330210809981

能获取图片的具体信息

2.Data Extract(数据提取)

image-20240331010423873

3. Steregram Solve(立体试图)

控制图片左右偏移

image-20240331011905357

4.Frame Browser(帧浏览器)

对GIF之类的动图进行分解

5.Image Combiner(图片拼接)

根据需求调整模式

image-20240331012057429


参考资料

MiniNK

Lunatic‘blog:https://goodlunatic.github.io/posts/1ad9200/

后语

初衷是记录Misc常见的题目类型以及相关工具的使用,也是对知识点的复习(会不定时更新)。最开始接触CTF的时候也是很多✌无私地分享才得以收集到这么多非常好用的工具和脚本(特别感谢MiniNK的师傅们以及其他开源的师傅们),所以在这里将我的知识成果也分享出来,希望能帮助到大家。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇