CTF中文件與16進制互轉及相關操作(Python3)

這個腳本主要用於CTF比賽中關於圖片轉16進制與16進制轉圖片的一個操作,省去利用各種16進制軟件導出16進制,然後再去除空格跟換行,俗話說的好,懶人有懶招,寫個腳本,以後都不用動彈啦,哈哈哈哈,下面給出代碼

#!/usr/bin/enc python
#-*- coding:utf-8 -*-
#Author:valecalida
import os
import binascii
import sys
import base64
from pathlib import Path

filename = input("Please input the filename you want to operate:")

def show_menu():
	print("\t\t Easy system to convert file && hexvalue by valecalida")
	print("\t\t 1、將圖片轉換成16進制,並輸出爲'hex_圖片名.txt'的樣式 \t\t")
	print("\t\t 2、將16進制轉換成圖片,並輸出爲new_+圖片名'的樣式 \t\t")
	print("\t\t 3、將16進制逆序,並輸出爲're_new_ + 圖片名'的樣式 \t\t")
	print("\t\t 4、將16進制按第一、二位交換輸出 \t\t")
	print("\t\t 5、只逆序文本文件,並輸出爲'new_+文本名'' 的樣式 \t\t")	
	print("\t\t 6、將文件內的換行符去掉,並輸出爲'New+文本名' 的樣式 \t\t")
	print("\t\t 7、對文件內容進行base64、32、16解密 \t\t")
	print("\t\t 9、刪除在運行過程中創建的文件,保持文件目錄整潔 \t\t")
	print("\t\t 0、退出腳本 \t\t")


def detect_file():
	path = os.getcwd()
	myfile = Path(str(path) + "\\" + str(filename))
	if myfile.is_file():
		print("The " + str(filename) + " is exist!" + str(analyse_file()) + " Entering system.....\n")
	else:
		print("The file does't exist!\nQuiting the system......")
		sys.exit()
	return myfile.is_file()


def makefile_hex():
	"""
		This function's changing file into hex.
		The new filename is new_originname. 
	"""
	f1 = open(filename,'rb')
	content = f1.read()
	f2 = open("hex_" + str(filename) + ".txt",'w')
	content = binascii.b2a_hex(content)
	f2.write(str(content)[2:-1])
	f2.close()
	f1.close()


def analyse_file():
	file_type = {
		'504b0304':'Zip File',
		'52617221':'Rar File',
		'712e706e':'Tar File',
		'377abcaf':'File_7z',
		'0A0D0D0A':'Pcapng File',
		'89504e47':'Png File',
		'ffd8ffe0':'Jpg File',
		'424d76c2':'Bmp File',
		'47494638':'Gif File',
		'464C5601':'Flv File',
		'D0CF11E0':'MS_File',
		'41564920':'Avi File',
		'49545346':'Chm File',
		'1A45DFA3':'Mkv File',
		'6D646174':'Mov File',
		'25504446':'Rdf File',
		'38425053':'Psd File',
		'2E524D46':'Rmvb File',
		'7B5C7274':'Rtf File',
		'57415645':'Wav File',
		'00000100':'Icon File',
		'5F27A889':'Jar File',
		'000001B3':'MPEG Movie',
		'3C3F786D':'XML Document',
		'5A4F4F20':'Zoo Archive File',
		'3026B275':'Wmv File'
	}
	re_file_type = {
		'4030b405':'Zip File',
		'12271625':'Rar File',
		'e607e217':'Tar File',
		'A0D0D0A0':'Pcapng File',
		'facba773':'7z_File',
		'74e40598':'Png File',
		'0eff8dff':'Jpg File',
		'2c67d424':'Bmp File',
		'83649474':'Gif File',
		'1065C464':'Flv File',
		'0E11FC0D':'MS_File',
		'02946514':'Avi File',
		'64354594':'Chm File',
		'3AFD54A1':'Mkv File',
		'471646D6':'Mov File',
		'64440552':'Pdf File',
		'35052483':'Psd File',
		'64D425E2':'Rmvb File',
		'4727C5B7':'Rtf File',
		'54651475':'Wav File',
		'00100000':'Ico File',
		'988A72F5':'Jar File',
		'3B100000':'MPEG Movie File',
		'D687F3C3':'XML Document File',
		'02F4F4A5':'Zoo Archive File',
		'572B6203':'Wmv File'
	}
	f = open((filename),'r')
	content = f.read(8)
	if content in file_type:
		print("This is a",file_type[content])
	elif content in re_file_type:
		print("This is a",re_file_type[content],",but it was partial reversed!You need to change the bytes order.")
	else:
		print("Could't match file_type.Please analyse it manual.")

def makehex_file():
	user_input = input("Enter the filename you want to operate:")
	f3 = open(user_input,'r')
	content = f3.read()
	content = binascii.a2b_hex(content)
	f4 = open("new_" + filename,'wb')
	f4.write(content)
	
	f4.close()
	f3.close()

def del_relate_file():
	file1 = "hex_" + filename + ".txt"
	file2 = "new_" + filename
	file3 = "re_hex" + filename + ".txt"
	file4 = "flag.txt"
	file5 = "New" + filename
	
	retcode = os.system("del " + str(file1) + " " + str(file2) + " " + str(file3) + " " + str(file4)+ " " + str(file5) )
	if retcode != '0':
		print("Deleting ...")
	else:
		print("Shell running false!Try it later!")

def byte_reverse():
	"""
		這個模塊的主要目的是將被逆序的16進制調整回來,如果有單字節交換的情況也可以修正
	"""
	f = open("new_" + filename + ".txt",'r')
	content = f.read()
	re_content = content[::-1]
	f4 = open("re_hex" + filename + ".txt",'w')
	f4.write(re_content)
	f4.close()
	f.close()


def reverse_txt():
	f1 = open(filename,'r')
	f2 = open("new_" + str(filename),'w')
	for line in f1.readlines():
		line = line.strip()
		f2.write(str(line)[::-1] + "\n")
	print("Write into new_" + str(filename) + " done!")
	f1.close()
	f2.close()


def double_byte_reverse():
	"""
		這個部分用於逆序部分的雙字節交換
	"""
	f6 = open("re_hex" + filename + ".txt",'r')
	content = f6.read()
	f6.close()
	result = ''
	s1 = ''
	s2 = ''
	for i in range(int(len(content))):
		if i % 2 == 0:
			s1 += content[i]
		else:
			s2 += content[i]
	for i in range(len(s1)):
		result += s2[i]
		result += s1[i]
	f3 = open('flag.txt','w')
	f3.write(result)
	f3.close()

def del_enter():
	f1 = open(filename,'r')
	result = ''
	for i in f1.readlines():
		result += i.strip()
	f2 = open('New' + str(filename),'w')
	f2.write(result)
	f1.close()
	f2.close()


def base64_decode():
	f = open(filename,'r')
	flag = f.read()
	f.close()
	def decode(flag):
		try:
			print(flag)
			flag=base64.b16decode(flag)
			decode(flag)
		except Exception as message:
			if str(message) == 'Non-base16 digit found':
				try:
					flag = base64.b32decode(flag)
					decode(flag)
				except:
					flag = base64.b64decode(flag)
					decode(flag)
	decode(flag)




def run_system():
	detect_file()
	show_menu()
	while True:
		user_choice = int(input("Please input the number you want to operate:"))
		if user_choice == 1:
			makefile_hex()
			print("Converting finished!")
			analyse_file()
		elif user_choice == 2:
			makehex_file()
			print("Converting finished!\n")
		elif user_choice == 3:
			makefile_hex()
			byte_reverse()
			print("Revering finished!\n")
		elif user_choice == 4:
			double_byte_reverse()
			print("Double Bytes revering finished!\n")
		elif user_choice == 9:
			del_relate_file()
			print("Deleting finished!\n")
		elif user_choice == 5:
			reverse_txt()
		elif user_choice == 6:
			del_enter()
			print('Delete "\\n" done!')
		elif user_choice == 7:
			base64_decode()
			print("Decoding....'\n' done!")
		elif user_choice == 0:
			print("Quiting...\n")
			sys.exit()
		else:
			print("Please make sure your input is right!\n")
run_system()

有需要的小夥伴可以自己的需求在我這個代碼的基礎上添加自己的功能,只要在menu欄跟run_system欄中添加相應的操作即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章