Miscellaneous6


Capture The Flag Miscellaneous 6

Miscellaneous 【6】 –key{flag{misc}} - The end

Miscellaneous 【5🔒

Miscellaneous 【4🔒


Miscellaneous 【3

Miscellaneous 【2

Miscellaneous 【1

Ax Introduction

什么是CTF,什么是MISC。

CTF定义:网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们模拟攻击的比赛。

  • 类型:解题模式、攻防模式、混合模式
  • 赛事:DEFCONCTF、XCTF、Real World CTF等
  • 题目:PPC、MISC、PWN、WEB、REVERSE、CRYPTO、STEGA

MISC定义:Miscellaneous,安全杂项,流量分析、电子签证、人肉搜索、数据分析等等等等等,就是除了最初的几个大类之外的题目。

别看杂项杂,每一项都是很专业的东西,所以要学的东西很多很多。还能遇到有些有趣的东西呢。

常见思路

压缩包:伪加密、爆破、找其它文件的解密密码

图片:

  • jpg\png\bmp 隐写文件、LSB隐写、文件高度隐藏(图片残缺)
  • gif 分裂拼接、分裂合成

多个文件:注意文件大小,压缩差,字节拼接

常用工具

WinHex yyds

010editor

kali linux

  • hexdump 二进制分析,二进制文件转换为ASCII、八进制、十进制、十六进制

  • pngcheck、tweakpng 查看png的CRC是否正确,错误则代表被修改宽高等

  • base64 转码

  • jadx-gui java反编译

  • binwalk 查看文件中是否隐藏信息

  • formost 通过分析文件头和内部数据结构和尾,还原文件,使文件分离出来。

  • zip2john 破解压缩包密码,再用john看破解的密码文件

    zip2john flag.zip password.txt
    john password.txt
    
  • fcrackzip zip压缩包破解工具

    fcrackzip -b -c 'aA1!' -l 1-10 -u crack_this.zip 
    # 选择大小写且数字!-b代表brute-force;-l限制密码长度;-c指定使用的字符集:-u是解压
    fcrackzip -b -c '1' -l 1-10 -u crack_this.zip
    # 如果知道是数字,直接使用数字
    gzip -d /usr/share/wordlists/rockyou.txt.gz
    # 解压kali自带的字典
    fcrackzip -D -p /usr/share/wordlists/rockyou.txt -u crack_this.zip
    # 使用字典爆破
    
  • crunch 密码字典生成

  • aircrack-ng wifi密码破解

  • tshark Linux版本的wireshark工具。

  • strings、egrep、awk 找东西滴

Wireshark 有时候会有分析数据包的取证题目需要用到。
隐写工具

  • Jphs05 图片信息隐藏
  • Stegsolve 分析图片隐写工具
  • zsteg 隐写工具LSB
  • stegpy 图片一些工具

RouterPassview 路由器配置文件查看器

好玩的工具

加密算法在线网站

Bx Flag{keyisflag}

只有不断的做题,才能学习到更多的东西,包括出题的套路,you know,but 作者的想法你是永远猜不到的,也许就在你意想不到的地方。

我会去做各大在线网站的题目,然后记录于此便于我回顾。

Bugku

Bugku_只有黑棋的棋盘

得到一张图片和一个flag压缩包(加密的)

分析图片包含压缩包,无法分离考虑是否修改压缩包头格式

修改后分离压缩包得到压缩包,需要密码,没有得到有密码的思路,考虑是否伪加密,修改00 0900 00,得到txt文本

…
…
CDEFGHIJKLMNOPQRSTU
BCDEFGHIJKLMNOPQRST
ABCDEFGHIJKLMNOPQRS

这有点像维吉尼亚密码表,把这个补全。发现突然与棋盘对应,而棋盘上的黑子就是密码。

JKLMNOPQRSTUVWX【Y】ZAB
IJKLMNOPQRSTUVWXYZ【A】
HIJK【L】MNOPQRSTUVWXYZ
GHIJKLMNO【P】QRSTUVWXY
FGHIJKLMN【O】PQRSTUVWX
EF【G】HIJKLMNOPQRSTUVW
【D】EFGHIJKLMNOPQRSTUV
CDEFGHIJKLMN【O】PQRSTU
BCDEFGHIJKLMN【O】PQRST
ABCDEF【G】HIJKLMNOPQRS

YALPOGDOOG 解压flag压缩包,解不开,考虑是否倒序,因为棋盘的序号是从上下往上开始

GOODGOPLAY 得到flag图片

尝试修改高度,得到flag

Bugku_蜘蛛侠

得到一个压缩,打不开,放到010发现一串乱码,用UTF-8打开得到这种没有见过的字符,百度查一下

这是苏州码子,通过对照得到数字441106998101,capital_num提示是商用数字,应该是大写

可以使用微软输入法的v模式,输入:v441106998101可以转换成大写。

注意,把壹零改为拾。肆肆壹拾陆玖玖捌拾壹,解开得到几个文件。

根据hint提示,key被encode加密,通过脚本来解密,修改一下脚本内的文件名。

import os
data_jpg = open('key.jpg','wb')
def jpg_encode():
    with open('file.jpg','rb') as handle:
        size = os.path.getsize('file.jpg')
        print(size)
        i = 0
        while i<size:
            bytedata = handle.read(1)
            process_data = data_encode(bytedata)
            data_write(process_data)
            i = i + 1

def data_encode(bytedata):
    data = int.from_bytes(bytedata,byteorder='big')
    if (data % 2 == 0):
        data = (data + 1) ^ 128
    else:
        data = (data - 1) ^ 128
    data = bytes([data])
    return data

def data_write(process_data):
    data_jpg.write(process_data)


if __name__ == '__main__':
    jpg_encode()
    data_jpg.close()

得到一个file.jpg,用010打开,看到一串字符

base92解码得到password:SilentEye

然后学习了base92的知识https://github.com/thenoviceoof/base92

使用SilentEye打开图片,输入SilentEye获得flag

Bugku_baby_flag.txt

得到一个txt文本文件,查看文件头发现是JPG,修改后缀得到图片。

根据描述还能再高一点,修改高度,得到字符串

文件分析存在一个rar,修复头格式

新建一个十六进制复制HEX进去,保存为rar文件。需要密码,使用0q1W2e3R4t打开

得到一个文本文件

真是一种丑陋的语言呢
oh!!!!!!!!!!!!!!ugly programming language!!!!!!!!!!!


D'`r#?oJ[;|9Wx0/et?rqM(-9JI6(hEgeBc.x,<;)yrZvo5mrkji/Plkjib(fedFE[!Y^]\[Tx;QuU7SRKo2NGLEDh+AFEDC<;_?>~}5Y987w5.R21qp('K+$j"'~}${"y?`_{tyrwp6tmUqj0nmleMib(fe^c\"`_^@VUTxXWV8NSRKJn10LKJIHAe?'=<;:9]76Z:981w543,P*)M-,%k)"F&}${zy?>_{zyr8YXtmlk1onmlNMib(I_d]\"`BA]\Uy<;QPUTMLpJ2NMLKDhHA)E>b%$@?8\}5Y981w543,P0/o-&Jk)"!~D1

百度搜索ugly programming language,可能是某中深奥的语言,得知是Malbolge,最复杂的语言。被称之为Esoteric programming language

使用工具:https://zb3.me/malbolge-tools/

Bugku_善用工具

描  述: webp

得到一个hint.png,一个压缩包和一张jpg

hint.png是一个文本文件,提供了以下信息

8:V5Y:7,Y,3MU=$8D:D%11&9O6BY .G,M

使用UUENCODE解码得到

keyis91;utF$jAQDfoZ.@:s-

使用base85,特征是等号一般出现在字符串中间,含有一些奇怪的字符

KEYisCamouflage

我寻思这是个钥匙,解不开压缩包,百度关键字Camouflage,我突然想了想我好像见过这个东西,看了下我的工具,原来还真有

得到一个文件,写着远在天边近在眼前:

看了下文档的作者:

百度下看看是不是什么名人

得到学号

走偏了走偏了。密码近在眼前,在哪呢?

丢进010做个全面检查,发现这是个压缩包,修改后缀,在document.xml中发现关键字符

使用这个解密压缩包,得到csgo文件,但不知道是什么文件,放入010发现是riff,更改后缀为.riff,使用浏览器打开

根据提示webp和stegpy有关,用stegpy隐写工具进行恢复

下载工具:pip install stegpy

Bugku_MuMuMisc的简单题

这题太难了,WP的脚本。

得到一张红色图片,和一个私钥

写脚本把左侧这块读出来,黑色对应1,白色对应0,再转成字符

py

from PIL import Image

im = Image.open('mumumisc.png')
(w, h) = im.size

flag = ''
for x in range(w):
    for y in range(h):
        p = im.getpixel((x,y))
        if p ==(0,0,0):
            flag += '1'
        elif p == (255,255,255):
            flag += '0'
for i in range(len(flag)//8):
    print(chr(int(flag[i*8:(i+1)*8],2)),end="")

得到字符

MTEwMDAxIDAwMDAwIDAxMCAwMTEwIDExMDAxIDEwMSAwMTExIDEwMSAwMTExIDEwMSAwMDAxIDAwMSAxMTAwMDAgMTAwIDAwMDEgMDAxIDEwMCAwMTEwIDExMTEgMTExMSAxMTAxIDEwMCAwMTAgMTExMDEgMTEwMSAxMDAgMDAwMDEgMDEwIDExMTAxIDExMDEgMDAxIDExMTEgMTAxIDExMTAwMSAxMTEwMDAJ

通过base64解码

110001 00000 010 0110 11001 101 0111 101 0111 101 0001 001 110000 100 0001 001 100 0110 1111 1111 1101 100 010 11101 1101 100 00001 010 11101 1101 001 1111 101 111001 111000

观察key文件发现是一个jpg后缀,修改后缀打开图片

通过txt里提到老外霍夫曼靠在树上,推出霍夫曼树,使用的是霍夫曼编码,通过脚本解码

s = "110001 00000 010 0110 11001 101 0111 101 0111 101 0001 001 110000 100 0001 001 100 0110 1111 1111 1101 100 010 11101 1101 100 00001 010 11101 1101 001 1111 101 111001 111000"
lt = s.split()

tree = [[[[['l','h'],'i'],'s'],
         ['a',['g', 'u']]],
         [['_','m'],
        [[[['c','f'],'{'],'d'],
         [[['}','e'],'n'],'o']]]]

for i in lt:
    t = tree
    for j in i:
        t=t[int(j)]
    print(t,end="")

得到flag。

Bugku_群友们的唠嗑

这题参考WP

hint文本内容

mounting password:
(128,128,128)(0,0,0)
(255,255,255)(0,0,0)
(128,128,128)(255,255,255)

(128,128,128)(255,255,255)
(0,0,0)(0,0,0)
(128,128,128)(255,255,255)

(128,128,128)(255,255,255)
(0,0,0)(128,128,128)
(0,0,0)(255,255,255)

hint:hex @ hue
fk hint:no hint more happiness

这是色块密码

十六进制编辑器查看flag.001,可以看到ADCRYPT文件头,这是AD1加密镜像的特征。用FTK Image打开,发现需要密码。根据提示找到hexahue,将txt中的RGB颜色矩阵转为图形,再与替换表对照,可以得到密码为123。进入镜像。

FTK Image打开,先解密出flag-decrypted.001

然后再添加源证据:Add Evidence Item > Contents of a Folder

发现回收站里有东西,导出来

排除部分强行黑群友的图片不用管,整理一下镜像内的文件内容,有几个值得关注的线索。
1、\flag\here 目录下的加密压缩包encode.rar,内含图片encode.png。
2、回收站内有一张 $I3PC85G.gif 图片。注意到上方的 $I3PC85G.gif 文件中有如下字符串:G:\password\only-a-gif.gif

说明该gif图片是从 password 目录被删除的,很可能与密码有关。

导出该gif图片,根据对出题人的了解,筛选目前国内公开CTF平台上misc题中与gif格式隐写有关的考点。可以找到某平台的蜘蛛侠呀一题中出现过的gif动画帧时长隐写(帧数间隔隐写)。用Image Magick提取该gif的帧时长:

identify -format "%T " $R3PC85G.gif

5 5 5 4 4 4 4 4 5 5 4 4 4 4 5 4 5 5 5 4 4 5 5 4 5 5 5 4 4 5 5 4 5 5 4 5 4 4 5 4
5 5 5 4 4 5 5 4 5 4 5 4 5 5 5 4 5 4 5 4 5 4 4 4 5 4 4 4 4 4 4 4 5 5 4 4 5 5 5 4
5 5 4 5 4 4 5 4 5 4 4 4 5 5 4 3 3 3 3 3

排除末尾的3,前95帧出现了4和5两种时长,考虑将其转为二进制0和1,再进行下一步转码。但这里由于出题人的水平太高,草木竹石皆可为剑,出题时随便揪一个不知道哪来的在线工具就用,而且用完绝不检查。毕竟题目做不出来是做题的太菜,总不可能是出题人不会出题还瞎出吧。总之这里不知道从哪找来的神奇工具在字符串转二进制ASCII码时漏掉了开头的一位0,也就是说隐写信息实际是12位字符对应96位长度的二进制串。比较有趣的是当大家都因此卡在了这一步的时候,出题人以为大家都没见识过gif动画帧时长隐写,还在群里对大家进行了亲切的嘲讽,并给出了并没有什么用的提示。也许这就是学好算术再出题的重要性吧。

总之转码脚本如下:

s="5 5 5 4 4 4 4 4 5 5 4 4 4 4 5 4 5 5 5 4 4 5 5 4 5 5 5 4 4 5 5 4 5 5 4 5 4 4 5 4 5 5 5 4 4 5 5 4 5 4 5 4 5 5 5 4 5 4 5 4 5 4 4 4 5 4 4 4 4 4 4 4 5 5 4 4 5 5 5 4 5 5 4 5 4 4 5 4 5 4 4 4 5 5 4".split()
flag = "0"
for i in s:
    if i == "5":
        flag += "1"
    else:
        flag += "0"
for i in range(len(flag)//8):
    print(chr(int(flag[i*8:(i+1)*8],2)),end="")

输出结果:passisWT@giF

把encode.rar导出到桌面,然后使用WT@giF解压得到encode.png。大体能看出图像以及文字的痕迹,但严重偏斜。这是因为原图的像素被放置到了错误的宽度上导致的,图像呈右上-左下偏斜,

说明正确宽度比当前宽度732要小。图像失真并没有到无法识别的程度,说明正确宽度和当前宽度之间的差距不会特别大,可以手动爆破。脚本如下:

from PIL import Image

img = Image.open('encode.png')
w, h = img.size

def decodei(width):
    height = w * h // width + 1
    new = Image.new('RGB', (width, height))
    for i in range(w * h):
        new.putpixel((i % width, i // width), img.getpixel((i % w, i // w)))
    new.show()
    new.save("flag.png")

decodei(720)
# 变为左上-右下偏斜,说明过小了
decodei(726)
# 略带左上-右下偏斜,实际上已经能够识别
decodei(727)
# 完美

输出结果里的汉字包上flag格式就是最终flag。

Bugku_妹子的陌陌

分析图片得到一个压缩包

解压密码是图片上的喜欢我吗.,解压得到文本

嘟嘟嘟嘟
士兵:报告首长!已截获纳粹的加密电报!
首长:拿来看看

电报内容:
..../-/-/.--./---.../-..-./-..-././-./-.-./---/-.././.-.-.-/-.-./..../.-/..../..-/---/.-.-.-/-.-./---/--/-..-.

首长:我操你在逗我吗?你确定是他们纳粹发的吗?
士兵:难道我弄错了?哦。。。等等是这一条

内容:http://c.bugku.com/U2FsdGVkX18tl8Yi7FaGiv6jK1SBxKD30eYb52onYe0=
      AES Key:@#@#¥%……¥¥%%……&¥

士兵:二维码真的扫不出来吗??肯定可以扫出来

莫斯码解得

HTTP://ENCODE.CHAHUO.COM/

访问网址,根据提示,AES解密

访问网址http://c.bugku.com/momoj2j.png,得到二维码

扫描二维码得到KEY{nitmzhen6}

Bugku_where is flag 2

CRC32校验字符

6275676b757b596f755f63616e27745f696d6167696e655f7468655f68617070696e6573735F6F665f686964696e675f7468655f666c61672121217d454ab976

转字符

Bugku_美丽的烟火

压缩包伪加密,修改后解开得到key和压缩包

Key

jnPX5p5ZtfDJumxSsEK

base64解密

am5QWDVwNVp0ZkRKdW14U3NFSw==

再base58解密

t_hp1ass_s1wsd

栅栏解密

th1s_1s_passwd

图片隐写

stegppy,密码shumu

AES的key是th1s_1s_passwd

Bugku_黑客的图片

思路图

|──hacker.png  第一个flag片段。通过zsteg得到隐写信息。通过binwalk得知隐藏文件,使用foremost分解得到压缩包
    ├── audit.txt
    ├── png
    │   └── 00000000.png
    └── zip
        ├── 00000436.zip RSA解密脚本得到438压缩包密码
        └── 00000438.zip 得到两张图片
            ├── flag2.jpg 第二个flag片段,通过修改高度得到
            └── flag3.png 第三个flag片段,通过stegpy得到
# flag{m1s3_1s_eas3_bu1_misc_d0n't_love_me}

png图片分解得到两个压缩包,其中一个压缩包得到一个文本,是rsa,解密

e = 65537
p = 164350308907712452504716893470938822086802561377251841485619431897833167640001783092159677313093192408910634151587217774530424780799210606788423235161145718338446278412594875577030585348241677399115351594884341730030967775904826577379710370821510596437921027155767780096652437826492144775541221209701657278949
q = 107494571486621948612091613779149137205875732174969005765729543731117585892506950289230919634697561179755186311617524660328836580868616958686987611614233013077705519528946490721065002342868403557070176752015767206263130391554820965931893485236727415230333736176351392882266005356897538286240946151616799180309
c = 17210571768112859512606763871602432030258009922654088989566328727381190849684513475124813364778051200650944085160387368205190094114248470795550466411940889923383014246698624524757431163133844451910049804985359021655893564081185136250014784383020061202277758202995568045817822133418748737332056585115499621035958182697568687907469775302076271824469564025505064692884524991123703791933906950170434627603154363327534790335960055199999942362152676240079134224911013272873561710522794163680938311720454325197279589918653386378743004464088071552860606302378595024909242096524840681786769068680666093033640022862042786586612
#longs_to_bytes(m) = passwd

p 和 q:两个大的质数,是另一个参数N的的两个因子。
N:大整数,可以称之为模数
e 和 d:互为无反数的两个指数
c 和 m:密文和明文

from Crypto.Util.number import *
import gmpy2

e = 65537
p = 164350308907712452504716893470938822086802561377251841485619431897833167640001783092159677313093192408910634151587217774530424780799210606788423235161145718338446278412594875577030585348241677399115351594884341730030967775904826577379710370821510596437921027155767780096652437826492144775541221209701657278949
q = 107494571486621948612091613779149137205875732174969005765729543731117585892506950289230919634697561179755186311617524660328836580868616958686987611614233013077705519528946490721065002342868403557070176752015767206263130391554820965931893485236727415230333736176351392882266005356897538286240946151616799180309
c = 17210571768112859512606763871602432030258009922654088989566328727381190849684513475124813364778051200650944085160387368205190094114248470795550466411940889923383014246698624524757431163133844451910049804985359021655893564081185136250014784383020061202277758202995568045817822133418748737332056585115499621035958182697568687907469775302076271824469564025505064692884524991123703791933906950170434627603154363327534790335960055199999942362152676240079134224911013272873561710522794163680938311720454325197279589918653386378743004464088071552860606302378595024909242096524840681786769068680666093033640022862042786586612


n = p * q
phi = (p-1)*(q-1)  # 求φ(n),φ(n)=(p-1)(q-1)
d = gmpy2.invert(e, phi)  # 求e对于模n的逆元,即解密指数d
m = pow(c, d, n)  # m=c^d mod n
passwd = long_to_bytes(m)  # m的字符串形式
print(passwd.decode())

得到密码

用密码解压第二个压缩包,得到 flag2和flag3图片

flag2通过修改高度得到flag片段

flag3通过stegpy隐写得到flag片段

使用zsteg查看hacker.png隐写信息

Bugku_Linux2

得到一个二进制文件,直接正则搜索一下关键词。

获得key,把匹配范围改大一点,结束

KEY{24f3627a86fc740a7f36ee2c7a1c124a}

Bugku_开始也是结束

描述: rockyou文件

得到一个图片,查看发现包含压缩包

使用破解发现密码正是压缩包里面的文件名,11549.zip

然后发现都是按这样的规律一直解压

使用脚本

import zipfile

path = r'path'
zipname = path + '11549.zip'
while True:
    ts1 = zipfile.ZipFile(zipname)
    res = ts1.namelist()[0].split('.')[0]
    print(res)
    passwd = bytes(res, 'utf-8')
    ts1.extractall(path, pwd = passwd)
    zipname = path + ts1.namelist()[0]

使用脚本解压出986个压缩包,直到最后一个压缩包bunku密码不正确,报错

根据描述,使用rockyou字典爆破

$ fcrackzip -D -p /usr/share/wordlists/rockyou.txt -u bugku.zip

得到解压密码,打开图片用010分析,发现flag。

经过这几天的更新,MISC系列也算是完结了。

Cx Additions

File Format

格式 头部
.jpg FF D8 FF
.png 89 50 4E 47
.bmp 42 4D
.gif 47 49 46 38
.zip 50 4B 03 04
.rar 52 61 72 21
.avi 41 56 49 20
.pdf 25 50 44 46

常见格式

常用文件的文件头如下(16进制):
JPEG (jpg),文件头:FFD8FFE1
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424DC001
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
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
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
RIFF,文件头:52494646

图片格式

常见识别方法

以下是常见的图片格式及判断方法

格式 描述 判断方式
jpeg 用JFIF或者Exif格式保存的JPEG图片 第7到第10个字节是b’JFIF’或者b’Exif’
png 可移植网络图形格式(Portable Network Graphic Format) 以字节串b’\x89PNG\r\n\x1a\n’开头
gif GIF(Graphics Interchange Format)的87版本和89版本 前6个字节为b’GIF87a’或者b’GIF89a’
tiff TIFF(Tag Image File Format)的两种字节顺序 前两个字节为b’MM’或者b’II’
rgb SGI ImgLib 以字节串b’\x01\xda’开头
pbm Portable Bitmap 第1个字节为b’P’,第2个字节为b’1’或b’4’,第3个字节为b’\t’或b’\n’或b’\r’
pgm Portable Graymap Files 第1个字节为b’P’,第2个字节为b’2’或b’5’,第3个字节为b’\t’或b’\n’或b’\r’
ppm Portable Pixmap Files 第1个字节为b’P’,第2个字节为b’3’或b’6’,第3个字节为b’\t’或b’\n’或b’\r’
rast Sun Raster 以字节串b’\x59\xA6\x6A\x95’开头
xbm X Bitmap Files 以字节串b’#define ‘开头
bmp Bitmap,Windows标准图像文件格式 以字节串b’BM’开头
webp 谷歌的WebP格式,Python3.5加入 以字节串b’RIFF’开头并且第9到第12个字节为b’WEBP’
exr OpenEXR,Python3.5加入 以字节串b’\x76\x2f\x31\x01’开头
JPEG

JPEG格式说明

JPEG文件可以看作由多条数据段拼接成的文件,每条数据段包括两个部分:标记码数据流

标记码:由两个字节构成,其前一个字节为0xFF(通常只有一个0xFF,可以多个连续的0xFF),后一个字节则根据不同意义有不同数值。
数据流:记录了关于JPEG文件的相应信息(有些数据段无数据流)。

常用的数据段有SOI、APPx、DQT、SOF0、DHT、DRI、SOS、EOI等(SOI等只是数据段名,例如SOI是标记码为0xFFD8的数据段名,DHT是标记码为0xFFC4的数据段名)。

JPEG主要数据段说明

SOI ->Start of Image

含义:图像结束
标记码:0xFFD9 占2字节
数据流:无

APP0 ->Application 0(保留标记)

含义:应用程序保留标记0
标记码:0xFFE0——占2字节
数据流:
数据段长度——占2字节
标识符——5字节(固定值0x4A46494600=“JFIF0”)
版本号——2字节
密度单位——1字节(0->无单位 1->点数/英寸 2->点数/厘米)
X方向像素密度——2字节
Y方向像素密度——2字节
缩略图水平像素数目——1字节
缩略图垂直像素数目——1字节
缩略图RGB位图——长度为是3的倍数

APPx -> APPn->Application,x=1~15(可任选)

含义:应用程序保留标记x
标记码:0xFFE1~0xFFF——2字节(手机照片通常包含APP1,内容由地点,时间等)
数据流:
数据段长度——占2字节(不同数据段数据格式不同)

DQT ->Define Quantization Table,定义量化表

含义:定义量化表
标记码:0xFFDB——占2字节
数据流:
数据段长度——占2字节
量化表长度——占2字节
量化表ID——占1字节
量化表内容——占64字节
(量化表可以有多个,不超过4个)

SOF0 ->Start of Frame

含义:帧图像起始
标记码:0xFFC0——占2字节
数据流:
数据段长度——占2字节
精度——1字节
图像高度——2字节
图像宽度——2字节
颜色分量数——1字节(1-灰度图 3-YCrCb或YIQ 4-CMYK)
颜色分量信息——9字节

DHT ->Difine Huffman Table

含义:定义哈夫曼表
标记码:0xFFC4——占2字节
数据流:
数据段长度——占2字节
霍夫曼表长度——占2字节
表ID和表类型——1字节
不同位数的码字数量——16字节
编码内容——占16个不同位数的码字数量之和字节

DRI ->Define Restart Interval

含义:定义差分编码累计复位的间隔
标记码:0xFFDD——占2字节
数据流:
数据段长度——占2字节(长度固定为4)
MCU块的单元中的重新开始间隔——占2字节

SOS ->Start of Scan

含义:定义差分编码累计复位的间隔
标记码:0xFFC4——占2字节
数据流:
数据段长度——占2字节
颜色分量数——1字节(1-灰度图是 3-YCrCb或YIQ 4-CMYK)
颜色分量ID——1字节
直流/交流系数表号——1字节
压缩图像数据——3字节(固定值0x003F00)

EOI ->End of Image

含义:图像结束
标记码:0xFFD9 占2字节
数据流:无

PNG

PNG的文件头格式:

(固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头

(固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13

(固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)

(可变)13位数据块(IHDR)

  1. 前四个字节代表该图片的宽

  2. 后四个字节代表该图片的高

  3. 后五个字节依次为:

    ​ Bit depth、ColorType、Compression method、Filter method、Interlace method

压缩包格式

  • 压缩源文件数据区:
    50 4B 03 04 是头文件的标志 (0x04034b50)

    00 00 全局方式标记(判断有无加密的重要标志)

  • 压缩文件目录区
    50 4B 01 02 目录中文件头标志(0x02014b50)

    00 00 全局方式标记(有无加密的重要标志,更改这里就可以进行伪加密了,改为 09 00 打开就会提示有密码了。)

  • 压缩源文件目录结束标志
    50 4B 05 06 目录结束标记

辨别真假加密

无加密:

压缩源文件数据区的全局方式位标记应当为00 0050 4B 03 04 14 00 后)
且压缩源文件目录区的全局方式位标记应当为00 0050 4B 01 02 14 00 后)

假加密

压缩源文件数据区的全局方式位标记应当为 00 0050 4B 03 04 14 00 后)
且压缩源文件目录区的全局方式位标记应当为 09 0050 4B 01 02 14 00 后)

真加密

压缩源文件数据区的全局方式位标记应当为09 0050 4B 03 04 14 00 后)
且压缩源文件目录区的全局方式位标记应当为09 0050 4B 01 02 14 00 后)

Cypher Method

参考:L

Web类编码

# HTML源码
<a href="javascript:alert(1)">test</a>
# JS编码:
<a href="javascript:\u0061\u006c\u0065\u0072\u0074(1)">test</a>
# URL编码:
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)">test</a>
# HTML编码:
<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#49;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#54;&#51;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#53;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#50;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#52;&#40;&#49;&#41;">test</a>

URL编码

一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。这意味着,如果URL中有汉字和其他符号,就必须编码后使用。我们在进行 URL 请求时,浏览器会自动帮我们把部分符号转换成 % + 十六进制数字 的形式
http://127.0.0.1/flag.php?x=1{)wo我
转化为
http://127.0.0.1/flag.php?x=1{)wo%E6%88%91

HTML实体编码

因为HTML对符号很敏感,比如空格,“<”,“>”等,于是这些符号需要用一些编码代替,这些编码就是HTML实体编码。

JavaScript编码

JavaScript编码主要是为了解决URL编码留下的坑进行的

escape()函数编码:形式为%uXXXX%XX,字符范围0-F,本身就是URL编码的一种实现方式

Unicode 编码:'\u' + '四位十六进制数字'不够四位前面补0

JSFuck: 一种基于JavaScript原子部分的晦涩的编程风格,它只有6种字符:[ ] ( ) ! + ,也可以来编写程序并执行,可以做到所有JavaScript能做的事情

MD5

MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。是不可逆的加密。

AES加密

特征:AES加密最重要的特征还是它的S-box,反汇编代码中很明显,而且容易定位

又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位)。根据密钥的长度,算法被称为AES-128,AES-192或者AE-256。

从安全性来看,AES-256安全性最高 从性能来看,AES-128性能最高

sha1

对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。

CRS32

在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。

特征:CRC32的计算结果只有8位

Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。 算法原理 假 设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项 r(x)对应的二进制码r就是CRC编码。
h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。国际通行标准可以look
g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。比如将11001与10101做xor运算:

这里把计算过程的要点记录一下:

  1. CRC32是CRC算法一种,先参考Wiki上CRC算法的原理和实例搞明白基本的计算方法。

  2. 最常见的CRC32算法就是IEEE 802.3里生成FCS字段用的那个:

a) CRC32使用的Polynomial是 ,这个,图片缺失。。

b) IEEE 802.3在传送数据时使用的是最低有效位优先 (least significant bit first),所以要根据你机器的架构转换成有效的比特流输入。同理,输出流也一样。

c) 为了有效识别输入流开头和结尾的零,开头的32位要按位取反(complement),最后计算出的余数也要按位取反。

按照上述方法计算能得到想要的CRC32值了。

Base 系列编码

是我们最常见的编码,除此之外,其实还有 Base16、Base32、Base58、Base85、Base100 等,他们之间最明显的区别就是使用了不同数量的可打印字符对任意字节数据进行编码,比如 使用了 64 个可打印字符(A-Z、a-z、0-9、+、/),Base16 使用了 16 个可打印字符(A-F、0-9),这里主要讲怎么快速识别,其具体原理可自行百度,Base 系列主要特征如下:

  • Base16:结尾没有等号,数字要多于字母;
  • Base32:字母要多于数字,明文数量超过 10 个,结尾可能会有很多等号;
  • Base58:结尾没有等号,字母要多于数字;
  • :一般情况下结尾都会有 1 个或者 2 个等号,明文很少的时候可能没有;
  • Base85:等号一般出现在字符串中间,含有一些奇怪的字符;
  • Base100:密文由 Emoji 表情组成。

莫斯码

字母

数字

标点

栅栏密码

特征:字母不会太多

①把将要传递的信息中的字母交替排成上下两行。
②再将下面一行字母排在上面一行的后边,从而形成一段密码。

明文:THE LONGEST DAY MUST HAVE AN END
加密:
1、把将要传递的信息中的字母交替排成上下两行。
T E O G S D Y U T A E N N
H L N E T A M S H V A E D

2、 密文:
将下面一行字母排在上面一行的后边。
TEOGSDYUTAENN HLNETAMSHVAED
解密:
先将密文分为两行
T E O G S D Y U T A E N N
H L N E T A M S H V A E D
再按上下上下的顺序组合成一句话
明文:THE LONGEST DAY MUST HAVE AN END

培根密码

培根密码,又名倍康尼密码(Bacon’s cipher)是由法兰西斯·培根发明的一种隐写术,它是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b,看到一串的a和b,并且五个一组,那么就是培根加密了。

凯撒密码

通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。只需简单地统计字频就可以破译

维吉尼亚密码

维吉尼亚密码是在凯撒密码基础上产生的一种加密方法,它将凯撒密码的全部25种位移排序为一张表,与原字母序列共同组成26行及26列的字母表。另外,维吉尼亚密码必须有一个密钥,这个密钥由字母组成,最少一个,最多可与明文字母数量相等。维吉尼亚密码表如下:

猪圈密码

是一种以格子为基础的简单替代式密码,是共济会的暗号

波利比奥斯方阵

公元前2世纪,一个叫Polybius的希腊人设计了一种将字母编码成符号对的方法,他使用了一个称为Polybius的校验表,这个表中包含许多后来在加密系统中非常常见的成分。Polybius校验表由一个5行5列的网格组成,网格中包含26个英文字母,其中I和J在同一格中。相应字母用数对表示。在古代,这种棋盘密码被广泛使用。

rabbit加密

特征:有U2Fsd开头

utf-7编码

特征:url解码后可以看到如下,里面有“+/v++”,可以猜出这是UTF-7编码

UTF-7:这是一种使用7位ASCII码]对Unicode码进行转换的编码。它的设计目标仍然是为了在只能传递7为编码的邮件网关中传递信息。UTF-7对英语字母、数字和常见符号直接显示,而对其他符号用修正的Base64编码。符号+和-号控制编码过程的开始和暂停。所以乱码中如果夹有英文单词,并且相伴有+号和-号,这就有可能是UTF-7编码。

Uuencode编码

Uuencode是二进制信息和文字信息之间的转换编码,也就是机器和人眼识读的转换。Uuencode编码方案常见于电子邮件信息的传输,目前已被多用途互联网邮件扩展(MIME)大量取代。

Uuencode将输入文字以每三个字节为单位进行编码,如此重复进行。如果最后剩下的文字少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6-bit为单位分为4个群组,每个群组以十进制来表示所出现的数值只会落在0到63之间。将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。

Uuencode编码每60个将输出为独立的一行(相当于45个输入字节),每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是“M”这个ASCII字符(77=32+45),最后一行的长度字符为32+剩下的字节数目这个ASCII字符。

rot13加密算法

Rot13是一种非常简单的替换加密算法,只能加密26个英语字母。方法是:把每个字母用其后第13个字母代替。
因为有26个字母,取其一半13。

s = "xrlvf23xfqwsxsqf"
ans = ""
for i in s:
    if 'a' <= i <= 'z':
        ans += chr(((ord(i)-ord('a')) + 13) % 26 + ord('a'))
    else:
        ans+=i
print(ans)

当铺密码

该加密算法是根据当前汉字有多少笔画出头,对应的明文就是数字几。

当前汉字有多少笔画出头,就是转化成数字几
例如:口 0 田 0 由 1 中 2 人 3 工 4 大 5 王 6 夫 7 井 8 羊 9

解密脚本

dh = '田口由中人工大土士王夫井羊壮'
ds = '00123455567899'

cip = '王壮 夫工 王中 王夫 由由井 井人 夫中 夫夫 井王 土土 夫由 土夫 井中 士夫 王工 王人 土由 由口夫'
s = ''
for i in cip:
    if i in dh:
        s += ds[dh.index(i)]
    else:
        s += ' '
#print(s)

ll = s.split(" ")
t = ''
for i in range(0,len(ll)):
    t += chr(int(ll[i])+i+1)
print('t=', t, '\t\tt.lower()=', t.lower())

苏州码子

〡〢〣〤〥〦〧〨〩是苏州码子,表示〡〢〣〤〥〦〧〨〩,就是中国民间的“商业数字”。在“字符映射表”中找得到,称为“杭州符号”,可能是一处讹误。在如今之苏州或杭州,还有没有这样的记号,得问一下当地人,甚至当地的商人才能得证。但据说在香港台湾一带的小商小贩中,仍能见这样的标价方式。既如此标价,想必当地识之者亦多。共和国建国之初,广州一带亦很常见。据说这种“商业数字”在商业上广泛应用,特别是水果摊,竖写账本的记帐。因为其形象性很强,极容易学习掌握,在当年,小贩即便是文盲,写出来也是运笔如飞的熟练,所以成为其“商业数字”。建国后随着工商业的凋蔽,大概“破四旧”时一起被破去了。

看起来很神奇的符号,其实说破了不值钱。〡 〢 〣 〤 〥 〦 〧 〨 〩 十,对应我们现在汉字的一二三四五六七八九十。便于大家详细了解,照贴了网上一段介绍文字。
1,就写一个竖;
2,两个竖:〢
3, 三个竖:〣
4,是个交叉:〤
5,写成〥,其实只是 5 字写得草和快
6,写成一点加一横,其中的一点,代表了5: 〦
7,写成一点加两横:〧
8,一点加三横:〨
9,写成“久”的草体:〩
20,两个“十”字:廿

各种奇葩加密

与佛论禅/新约佛论禅

字符串转换后,是一些佛语。

与熊论道

字符串转换后,是一些熊语。

兽音译者

字符串转换后,是一些兽语。

社会核心价值观

字符串转换后,是社会核心价值观。

颜文字加密

字符串转换后,是颜文字。

Ook加密

https://www.splitbrain.org/services/ook

OOK!只有三个不同的语法元素:
Ook。
OOK?
OOK!


文章作者: Enomothem
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Enomothem !
  目录