CRC 爆破图片宽高

隐写1.png

import struct  
import zlib  
  
# --------------- 需要修改的参数 ---------------
# (直接从WinHex中以十六进制数值复制选块)
str1 = "49484452"  # IHDR  
width = "01DA"  # 图片宽度  
height = "00EF"  # 图片高度  
str2 = "0806000000"  # 图片高度height~CRC之间的5个字节  
crc32 = "52084BFB"  # CRC  
add_num = 2000  # 最大宽高,合理修改快速出flag (一般可不修改)  
# -------------------------------------------  
  
  
def hexStr2bytes(s):  
    b = b""  
    for i in range(0, len(s), 2):  
        temp = s[i:i + 2]  
        b += struct.pack("B", int(temp, 16))  
    return b  
  
  
check = 0  
bytes1 = hexStr2bytes(str1)  
bytes2 = hexStr2bytes(str2)  
crc = str(int(crc32, 16))  
wid = int(width, 16)  
hei = int(height, 16)  
  
for w in range(wid, wid + add_num):  
    for h in range(hei, hei + add_num):  
        width = hex(w)[2:].rjust(8, '0')  
        height = hex(h)[2:].rjust(8, '0')  
        bytes_temp = hexStr2bytes(width + height)  
        if eval(hex(zlib.crc32(bytes1 + bytes_temp + bytes2))) == eval(crc):  
            print("爆破成功!")  
            print("正确的宽高:", hex(w), hex(h))  
            check = 1  
            break  
if check == 0:  
    print("爆破失败!")

01序列转二维码

from PIL import Image  
  
key = ""  # 二维码01序列  
MAX = 25  # 二维码的长宽  
pic = Image.new("RGB", (MAX, MAX))  
white = (255, 255, 255)  
black = (0, 0, 0)  
i = 0  
  
for y in range(0, MAX):  
    for x in range(0, MAX):  
        if key[i] == '1':  
            pic.putpixel([x, y], black)  
        else:  
            pic.putpixel([x, y], white)  
        i = i + 1  
pic.show()

摩斯密码加解密

MORSE_CODE_DICT = {'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..',  
                   'E': '.', 'F': '..-.', 'G': '--.', 'H': '....',  
                   'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..',  
                   'M': '--', 'N': '-.', 'O': '---', 'P': '.--.',  
                   'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-',  
                   'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-',  
                   'Y': '-.--', 'Z': '--..',  
                   '0': '-----', '1': '.----', '2': '..---', '3': '...--',  
                   '4': '....-', '5': '.....', '6': '-....', '7': '--...',  
                   '8': '---..', '9': '----.',  
                   '.': '.-.-.-', ':': '---...', ',': '--..--', ';': '-.-.-.',  
                   '?': '..--..', '=': '-...-', '\'': '.----.', '/': '-..-.',  
                   '!': '-.-.--', '-': '-....-', '_': '..--.-', '"': '.-..-.',  
                   '(': '-.--.', ')': '-.--.-', '$': '...-..-', '&': '....',  
                   '@': '.--.-.', '+': '.-.-.',  
                   }  
  
  
def encrypt(message):  
    cipher = ''  
    for s in message:  
        cipher += MORSE_CODE_DICT.get(s.upper(), s)  
        if s != message[len(message) - 1]:  
            cipher += ' '  # 每加密一个字符用空格隔开  
    return cipher  
  
  
def decrypt(message):  
    message += ' '  # 在末尾添加额外空间以访问最后一个摩斯密码  
    decipher = ''  
    citext = ''  
    global i  
    for letter in message:  
        if letter != ' ':  
            i = 0  
            citext += letter  
        else:  
            i += 1  # 如果i=1表示一个新字符  
            if i == 2:  # 如果i=2表示一个新单词  
                decipher += ' '  # 添加空格来分隔单词  
            else:  # 使用它们的值访问密钥(加密的反向)  
                decipher += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT.values()).index(citext)]  
                citext = ''  
    return decipher  
  
  
print("           摩斯加解密系统             ")  
print("*************************************")  
  
num = input("选择要进行的操作? (1:加密 or 2:解密) 你的选择: ")  
if num == "1" or num == "1:加密":  
    input_str = input("输入明文以加密: ")  
    print(encrypt(input_str))  
elif num == "2" or num == "2:解密":  
    input_str = input("输入密文以解密: ")  
    print(decrypt(input_str))

移位密码加解密

def encode():   # 加密
    right_move = int(input('请输入右移位数:'))
    s = input('请输入需要加密的字符串:')
    list_s = []
    for i in s:
        list_s.append(ord(i))
    for i in list_s:
        # 处理空格
        if i == 32:
            print('', end='')
        # 对大写字母进行处理
        elif 65 <= i <= 90:
            i += right_move
            while i > 90:
                i -= 26
        # 对小写字母进行处理
        elif 97 <= i <= 122:
            i += right_move
            while i > 122:
                i -= 26
        print(chr(i), end='')


def decode():   # 解密
    left_move = int(input('请输入左移位数:'))
    s = input('请输入需要解密的字符串:')
    list_s = []
    for i in s:
        list_s.append(ord(i))
    for i in list_s:
        if i == 32:
            print('', end='')
        elif 65 <= i <= 90:
            i -= left_move
            while i < 65:
                i += 26
        elif 97 <= i <= 122:
            i -= left_move
            while i < 97:
                i += 26
        print(chr(i), end='')


print("              移位密码                ")
print("*************************************")
print("请输入所需的操作:")
print("1.编码(E/e) |  2.解码(D/d)")
print("*************************************")
choice = input(f'你的选择:')

if choice.upper() == 'E' or choice.upper() == 'e' or choice.upper() == '1':
    encode()
elif choice.upper() == 'D' or choice.upper() == 'd' or choice.upper() == '2':
    decode()
else:
    print('输入错误!')

CRC32 爆破

参考自 末 初 师傅的文献:浅谈使用Python脚本爆破CRC32

当 zip 压缩包中出现多个类似于 flag.txt 的加密文件时,可考虑 CRC32 爆破

获取文件的 CRC 值

import zipfile

file_handler = zipfile.ZipFile('./password.zip')   # 指定压缩包
name_list = file_handler.namelist()   # 使用一个列表获取压缩包内所有的文件名
crc_list = []
print('-------------Filename CRC Info-------------')
for name in name_list:
    name_info = file_handler.getinfo(name)
    crc_list.append(hex(name_info.CRC))
    print('[+] {0}: {1}'.format(name,hex(name_info.CRC)))
print('-------------------------------------------')
print(crc_list)   # 根据情况获取,有时并压缩包内可能还有其他文件,可能需要切片,所以择情况选取

文件的 CRC 值也可以直接使用解压软件进行查看,但如果无法复制粘贴,可以使用此脚本获取


1 字节爆破

import binascii
import string

def crack_crc():
    print('-------------Start Crack CRC-------------')
    crc_list = [0xda6fd2a0, 0xf6a70, 0x70659eff, 0x862575d]   # 文件的 CRC32 值列表,注意顺序
    comment = ''
    chars = string.printable
    for crc_value in crc_list:
        for char1 in chars:
            char_crc = binascii.crc32(char1.encode())   # 获取遍历字符的 CRC32 值
            calc_crc = char_crc & 0xffffffff   # 将获取到的字符的 CRC32 值与 0xffffffff 进行与运算
            if calc_crc == crc_value:   # 将每个字符的CRC32值与每个文件的 CRC32 值进行匹配
                print('[+] {}: {}'.format(hex(crc_value),char1))
                comment += char1
    print('-----------CRC Crack Completed-----------')
    print('Result: {}'.format(comment))

if __name__ == '__main__':
    crack_crc()

2 字节爆破

import binascii
import string

def crack_crc():
    print('-------------Start Crack CRC-------------')
    crc_list = [0xef347b51, 0xa8f1b31e, 0x3c053787, 0xbbe0a1b]   # 文件的 CRC32 值列表,注意顺序
    comment = ''
    chars = string.printable
    for crc_value in crc_list:
        for char1 in chars:
            for char2 in chars:
                res_char = char1 + char2   # 获取遍历的任意 2Byte 字符
                char_crc = binascii.crc32(res_char.encode())   # 获取遍历字符的 CRC32 值
                calc_crc = char_crc & 0xffffffff   # 将获取到的字符的 CRC32 值与 0xffffffff 进行与运算
                if calc_crc == crc_value:   # 将获取字符的 CRC32 值与每个文件的 CRC32 值进行匹配
                    print('[+] {}: {}'.format(hex(crc_value),res_char))
                    comment += res_char
    print('-----------CRC Crack Completed-----------')
    print('Result: {}'.format(comment))

if __name__ == '__main__':
    crack_crc()

3 字节爆破

import binascii
import string

def crack_crc():
    print('-------------Start Crack CRC-------------')
    crc_list = [0x2b17958, 0xafa8f8df, 0xcc09984b, 0x242026cf]   # 文件的 CRC32 值列表,注意顺序
    comment = ''
    chars = string.printable
    for crc_value in crc_list:
        for char1 in chars:
            for char2 in chars:
                for char3 in chars:
                    res_char = char1 + char2 + char3   # 获取遍历的任意 3Byte 字符
                    char_crc = binascii.crc32(res_char.encode())   # 获取遍历字符的 CRC32 值
                    calc_crc = char_crc & 0xffffffff   # 将遍历的字符的 CRC32 值与 0xffffffff 进行与运算
                    if calc_crc == crc_value:   # 将获取字符的 CRC32 值与每个文件的 CRC32 值进行匹配
                        print('[+] {}: {}'.format(hex(crc_value),res_char))
                        comment += res_char
    print('-----------CRC Crack Completed-----------')
    print('Result: {}'.format(comment))

if __name__ == '__main__':
    crack_crc()

4 ~ 6 字节爆破

建议使用:CRC32 tools: reverse, undo/rewind, and calculate hashes

对每一个 txt 文件单独使用命令进行爆破:(如果 txt 文件原始大小为 6,则直接观察解密后的 6 位结果;如果原始大小为 4,则将解密后的 4 字节数据转为 ASCii 码)

python crc32.py reverse 文件的CRC32的值(加上0x)

最后将每一个 txt 文件碰撞得到的结果按照文件名顺序拼接起来


GPS 数据轨迹可视化

在线网站:Online GIS/CAD Data Converter | SHP, KML, KMZ, TAB, CSV, …

GPS 数据格式类似于:

$GPGGA,090000.00,3039.36980078,N,10406.19723861,E,1,05,2.87,160.00,M,-21.3213,M,,*77
$GPGGA,090000.10,3039.37017729,N,10406.19646536,E,1,05,2.87,160.00,M,-21.3213,M,,*7E
$GPGGA,090000.20,3039.37054445,N,10406.19571112,E,1,05,2.87,160.00,M,-21.3213,M,,*76

可视化脚本:

import matplotlib.pyplot as plt

data = open('GPS数据文件路径', 'r').readlines()
x = []
y = []

for line in data:
  if line.strip():
	d1, d2 = float(line[17:30]), float(line[33:47])
	x.append(d1)
	y.append(d2)

plt.scatter(x, y)   # plt.scatter(y, x)
plt.show()