CTF杂项中的脚本
CRC 爆破图片宽高
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()
评论