python技巧积累

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

  1. ast包
import ast
user_info = '{"name" : "南湖", "gender" : "male", "age": 28}'
user_dict = ast.literal_eval(user_info)

结果如下:来自Spdyer(python 3.7)
在这里插入图片描述

  1. 通过json格式转换
import json
user_info = '{"name" : "南湖", "gender" : "male", "age": 28}' #注意:此时里面必须都是双引号,否则会报错
user_dict_2 = json.loads(user_info)
  1. 通过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结果为:数据挖掘
'''

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值