前言:
不管在渗透测试中,还是CTF中,人工智能等领域,Python自从1991年诞生以来,作为一种使用简单的工具语言,以及渗透进了我们的生活中,本文主要以黑客的视角 讲解Python,简单的总结Python语言在CTF竞赛中的重点使用。本文主要讲解Python语法及其重点应用,关于Python安装等文章请移步其他文章。
本文参考:BIT-NSC北京理工大学信息安全实验室/网络安全俱乐部CTF竞赛 [注意:以下内容源自BIT-NSC社团网络安全课程讲义]仅供学习研究参考
Python快速入门
Python(英国发音:/?pa?θ?n/ 美国发音:/?pa?θɑ?n/)是一种广泛使用的解释型、高级和通用的 编程语言。Python支持多种编程范型,包括函数式、指令式、结构化、面向对象和反射式编程。它拥有 动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个巨大而广泛的标准库。 Python的设计哲学强调代码的可读性和简洁的语法,尤其是使用空格缩进划分代码块。相比于C或 Java,Python让开发者能够用更少的代码表达想法。[Wikipedia] 注意:我们讲的是 Python3 而非 Python2 ,两者之间有不小的区别,上网搜索相关信息时请注意分辨。
Python 环境配置
Windows 从 Python官网https://www.python.org/downloads/ 下载最新版,安装时记得勾选Add Python 3.x to PATH」 Linux & BSD & macOS 用你的包管理器安装 Python3。特别注意,是Python3而非Python,因为很多系统默认Python为 Python2.
文本编辑器 & IDE
Option A. 利用 VS Code 作为文本编辑器(甚至IDE) 具体步骤:
- https://code.visualstudio.com/Download VsCode从这里下载VSCode
- 安装,记得勾选「添加到PATH」或者「添加到环境变量」
- 安装 Python 拓展和中文语言拓展
4.安装语言扩展,搜索Python,重启Vscode Option B. 利用其它编辑器和ide 我之前刚接触Python使用的是Aptana Studio,这是一个开源项目,可以供你进行自定义更改,是一款强大的IDE。 它的项目开源地址:https://github.com/aptana/studio3 博主之前的文章曾提到该IDE,你也可以参考: 技能篇:在Kali Linux2系统中安装搭建Python编程环境——Aptana之 Linux完整安装详细介绍 ,以及遇到/metadata/.log和日志文件出错无法打开软件等问题解决方案(1)
Python-pip换源介绍
pip是python自带的包管理器Package Management,它从一个仓库下载,默认仓库由于在国外,我们将其换成国内(清华镜像源)可以提高我们下载并安装包的速度,pip换源(使用以下命令)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
基本语法介绍
2.1Python注释
"""" 跨行、多行注释内容
aaaaa
bbbbb
""""
Python数据类型
整数int(无限精度) 二进制0b100101 十六进制0xFFFFFFF0 八进制Oo777711 浮点数float (更高精度,decimal模版) 复数complex 数值运算:math.sin() 按位运算:~ | ^ & << >> 与C语言相同 注意:Python中无 ++ – bin(),hex()转化为2进制/16进制字符串 int(x)将x转为一个整数,float(x)是将x转化为浮点数
逻辑
布尔值:True False注意大写 (Standard by C++) 布尔运算: or and not ,返回True False C语言表示方法: or || and && not ! 比较运算: 和C一样,以及is和is not(in和not in)用于判断对象(Object),返回True False #大小比较 1<2<3 # => True 2<3<2 # => False
二进制数据和文本字符串
Python中字符串就是字符串,数值就是数值。 字符串str(‘xxxxxx’or"xxxxxxx",\n\r’'等转义),用加号连接字符串
“Hello”+“world”!
“This is a string”[0]
"{} can be {}".fomat("strings","interpolated")
"{name}wants to eat{food}".format(name="Bob",food="lasagna")
wants to eat lasagna"
r'aaa\\\\\\\\\\naa'
bytes(b'\0x1\0x21\xffasdsa')
常用函数参考: capitalize() 将字符串的第一个字符转换为大写 center(width, fillchar) 返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。 count(str, beg= 0,end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end指定则返回指定范围内 str 出现的次数 bytes.decode(encoding=“utf-8”, errors=“strict”) Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由str.encode() 来编码返回。 encode(encoding=‘UTF-8’,errors=‘strict’) 以 encoding 指定的编码格式编码字符串,如果 出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’ endswith(suffix, beg=0, end=len(string)) 检查字符串是否以 obj 结束,如果beg 或者 end指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False. expandtabs(tabsize=8) 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是8 。 find(str, beg=0, end=len(string)) 检测 str 是否包含在字符串中,如果指定范围 beg 和 end,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1 index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在字符串中会报一个异常。 isalnum() 如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回False isalpha() 如果字符串至少有一个字符并且所有字符都是字母或中文字则返回 True, 否则返回False isdigit() 如果字符串只包含数字则返回 True 否则返回 False…islower() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False isspace() 如果字符串中只包含空白,则返回 True,否则返回 False. istitle() 如果字符串是标题化的(见 title())则返回 True,否则返回 False isupper() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False join(seq) 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 len(string) 返回字符串长度 [ljust(width, fillchar]) 返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。 lower() 转换字符串中所有大写字符为小写. 用法 xxxxxstr.method(args) lstrip() 截掉字符串左边的空格或指定字符。 maketrans() 创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数 是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。 max(str) 返回字符串 str 中最大的字母。 min(str) 返回字符串 str 中最小的字母。 replace(old, new , max]) 把 将字符串中的 old 替换成 new,如果 max 指定,则替换不超过max 次。 rfind(str, beg=0,end=len(string)) 类似于 find()函数,不过是从右边开始查找. rindex( str, beg=0, end=len(string)) 类似于 index(),不过是从右边开始. [rjust(width, fillchar]) 返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度width 的新字符串 rstrip() 删除字符串末尾的空格或指定字符。 split(str=“”, num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串 splitlines(keepends]) 按照行(‘\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果 参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
startswith(substr, beg=0,end=len(string)) 检查字符串是否是以指定子字符串 substr 开 头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。 strip(chars]) 在字符串上执行 lstrip()和 rstrip() swapcase() 将字符串中大写转换为小写,小写转换为大写 title() 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见istitle()) translate(table, deletechars=“”) 根据 str 给出的表(包含 256 个字符)转换 string 的字符, 要过滤掉的字符放到 deletechars 参数中 upper() 转换字符串中的小写字母为大写 zfill (width) 返回长度为 width 的字符串,原字符串右对齐,前面填充0 isdecimal() 检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false。
暂且不考虑大端序与小端序,除了在ASCII码表里的符号数字,我们还需要表示其他种类的文字 例如中文,我们不能用这种方式来表示字符,我们需要一种编码,例如GTK编码,GB2312编码 我们将,字节串译码成为字符串。
变量(列表与字典)
some_var =5
例如程序字符太长写不下了,用以下方法表示
some_var:int = 110000000000000000011111111111\
+ 100000000000
li = []
other_li = [4,5,6]
li.append(1)
li.append(2)
li.append(4)
li.append(3)
li[0]
li[-1]
li[-2]
li[4]
li[1:3]
li[2:]
li[:3]
li[::2]
li[::-1]
del li[2]
li + other_li
1 in li
len(li)
tup =(1,2,3)
tup[0]
tup[0] = 3
len(tup)
tup+ (4,5,6)
tup[:2]
2 in tup
a,b,c=(1,2,3)
d,e,f=4,5,6
e,d=d,e
empty_dict = {}
filled_dict = {"one":1,"two":2,"three":3}
filled_dict["one"]
>>> somedict ={1:2,2:3}
>>> somedict[1]
2
>>> somedict[2]
3
流程控制
没有花括号,用缩进控制语块。
somevar = 1
if somevar == 1:
xxx
elif somevar > 1:
yyy
else:
zzz
x = 0
while x<4:
print(x)
x += 1
for animal in ["dog","cat","mouse"]
print("{}is a animal".format(animal))
""""
for i in range(4):
print(i)
""""
for i in range(0,10,3):
print(i)
函数
def add(x,y):
print("x is {} and y is {}".format(x,y))
return x + y
add(5,6)
add(y=6,x=5)
2.8变量作用域
x = 5
def setX(num):
x = num
print(x)
def setGlobalx(num):
global x
print (x)
x = num
print(x)
setx(43)
setGloabalx(6)
模块
import math
print(math.sqrt(16))
from math import ceil,floor
print(ceil(3.7))
print(floor(3.7))
from math import *
import math as m
math.sqrt(16) == m.sqrt(16)
import math
dir(math)
3.0输入输出
print("hello world")
a = input()
b =input("input something...")
print(a)
print(b)
print(b,end=',')
>>>print("%d"% 12)
12
运算优先级
运算符 描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
*/ % // 乘,除,求余数和取整除
+- 加法减法
<< 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
== != 等于运算符
= %= /= //= -= += *= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符 **
文件操作
f = open("filepath",'r')
f.read()
f.close()
with open('filepath','r') as f:
f.readline()
f.readlines()
f=open('filepath_gdk','r',encoding='gbk')
f = open("filepath",'rb')
f.read()
with open('filepath','w')as f:
f.write('Hello world!')
Python内存模型[传值和传引用]
传值和传引用,可变和不可变化对象 Python中所有的变量名字都可以认为是对象 不可变类型:变量赋值a=5后再赋值a=10 在内存中先分配一个5的空间,然后再分配一个10的空间,我们可以认为将a指向了10这就是不可变类型 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 不可变模型: 可变模型:
|