文章目录
0x01 十六进制与字符串之间的转换
字符串转换为16进制
示例:将字符串flag{081bc661-d62e-48da-b898-b43c73a42182}
转换为16进制
要用到binascii模块:
pip install binascii
b2a_hex()
转换代码:
# 导入模块binascii
import binascii
flag = "flag{081bc661-d62e-48da-b898-b43c73a42182}".encode()
hex = binascii.b2a_hex(flag).decode()
print(hex)
输出:666c61677b30383162633636312d643632652d343864612d623839382d6234336337336134323138327d
hexlify()
代码:
import binascii
flag = "flag{081bc661-d62e-48da-b898-b43c73a42182}".encode()
hex = binascii.hexlify(flag).decode()
print(hex)
十六进制转换为字符串
示例:将666c61677b30383162633636312d643632652d343864612d623839382d6234336337336134323138327d
转换为字符串。
unhexlify
代码;
import binascii
hex = "666c61677b30383162633636312d643632652d343864612d623839382d6234336337336134323138327d"
flag = binascii.unhexlify(hex).decode()
print(flag)
a2b_hex()
代码:
import binascii
hex = "666c61677b30383162633636312d643632652d343864612d623839382d6234336337336134323138327d"
flag = binascii.a2b_hex(hex).decode()
print(flag)
0x02 Python将字符串转换成字典
来自:https://www.cnblogs.com/qi-yuan-008/p/11674135.html
- ast包
import ast
user_info = '{"name" : "南湖", "gender" : "male", "age": 28}'
user_dict = ast.literal_eval(user_info)
结果如下:来自Spdyer(python 3.7)
- 通过json格式转换
import json
user_info = '{"name" : "南湖", "gender" : "male", "age": 28}' #注意:此时里面必须都是双引号,否则会报错
user_dict_2 = json.loads(user_info)
- 通过eval函数转换
user_dict_3 = eval(user_info) #
0x03 Python的permutations全排列函数
作用:
列出所有排列组合
from itertools import permutations
flag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]
item = permutations(flag)
for i in item:
k = ''.join(list(i))
if k.startswith('pctf{hey_boys') and k[-1] == '}':
print(k)
结果:
pctf{hey_boys_imaaaa_baaaaaack!}
pctf{hey_boys_imaaaaaaaa_baack!}
pctf{hey_boys_im_baaaaaaaaaack!}
pctf{hey_boys_im_baaaaaaaaaack!}
pctf{hey_boys_imaaaaaaaa_baack!}
pctf{hey_boys_imaaaa_baaaaaack!}
0X04 文件处理
压缩包处理
ctfshow红包题第一弹(zip文件处理)
大佬的
import os
import zipfile
def zips(): #处理压缩包
for i in range(1,87):
zip_file = zipfile.ZipFile(str(i)+'.zip')
zip_list = zip_file.namelist() #获取压缩包中的文件
for f in zip_list:
zip_file.extract(f, './a') #将压缩文件放入‘a’文件夹下
zip_file.close()
def base(): #处理图片中的base64
flag=""
for i in range(1,87):
path ="a/"+ str(i)+".jpg"
num = os.path.getsize(path) #获取图片的大小
f = open(path,'rb')
f.seek(int(num)-100)
s = f.read(100) #读取最后100个字节
flag+=bytes.decode(s)
f.close()
f1 = open('flag.txt','w')
f1.write(flag)
if __name__=="__main__":
zips()
base()
我的
import zipfile
for i in range(1, 87):
# 读取压缩包
z = zipfile.ZipFile('D:\desktop/flag/' + str(i)+'.zip', 'r')
# 读取压缩包内的图片内容
filename = z.namelist()[0]
content = str(z.read(filename))
# 把base64编码部分打印出来
len1 = len(content)
content1 = content[len1-101:len1-1]
print(content1)
核心代码:
z = zipfile.ZipFile('D:\desktop/flag/' + str(i)+'.zip', 'r')
filename = z.namelist()
for i in filename:
z.extract(i,'./a')
z.close()
z = zipfile.ZipFile()
打开zip文件。
z.namelist()
获取压缩包中的文件。
z.extract(a,b)
解压文件a到目录b
0x05 二进制转字符串(将字符串分为n个一组)
the_bin处输入要转换的二进制
# coding:utf-8
# 换成要转换的二进制
the_bin = "0101100001001101010000010100111001111011001110010011011000110101001101110011010101100010011001010110010101100100001101000110010001100101011000010011000100111000011001000110010101100100001101000011011100110011001101010011011000110100001100110110000101100101011000110110011001100001001100110011010101111101"
flag = ""
n = 8
def binToAsc(tgtasc):
try:
bin_to_dec = int(tgtasc, 2)
dec_to_asc = chr(bin_to_dec)
return dec_to_asc
except Exception as e:
return e
if len(the_bin) % 8 == 0:
strs = [the_bin[i:i+n] for i in range(0, len(the_bin), n)]
for i in strs:
# print(i)
flag += binToAsc(i)
print("[+] "+flag)
else:
print("[-] 转换失败,位数不对")
原理,将二进制分为8位一组,这个方法学习自:python – 每隔第n个字符拆分字符串?
>>> strs = "abcdefghijklmnopq"
>>> n = 8
>>> [strs[i:i+n] for i in range(0, len(strs), n)]
['abcdefgh', 'ijklmnop', 'q']
然后int函数将每一组八位二进制转换为十进制,再利用chr将ascii码转换为对应字符
>>> int("01011000", 2)
88
>>> chr(88)
'X'
运行效果
0x06 python实现将ip段解析为单个ip
https://blog.csdn.net/sakura_ll/article/details/106568139
0x07 python3 的url编码
- 导入urllib.parse模块,其中quote为编码,unquote为解码。
- 且下面代码的’utf-8’可不写,因为默认以utf-8格式使用的;也可以传入其他编码格式使用(根据需求编写)。
from urllib.parse import quote, unquote
text1 = "丽江"
print("text1结果为:" + quote(text1, 'utf-8'))
text2 = "%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98"
print("text1结果为:" + unquote(text2, 'utf-8'))
'''
输出结果为:
text1结果为:%E4%B8%BD%E6%B1%9F
text1结果为:数据挖掘
'''