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栏中添加相应的操作即可

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