【THM】Python Basic(Python基础)-学习
本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/pythonbasics
本文相关内容:使用基于网络的代码编辑器,学习Python的基础知识,并将你的知识付诸实践。
Python简介
在本文中,你将亲身体验并学习脚本编程语言Python,学会编程允许你创建一些安全工具以及创建脚本,这将帮助你进行渗透攻击(以及安全防御和安全分析)。
本文将涉及以下内容:
- Variables——变量
- Loops——循环
- Functions——函数
- Data Structures——数据结构
- If statements——If 语句
- Files——文件
你可以使用由TryHackMe实验房间所提供的在线代码编辑器来完成练习并解决挑战。
本文主要将涉及Python基本知识,意图让你能够编写一些基本的Python脚本,如果你想用自己的本地开发环境来进行Python编程,你可以先在官网下载一个Python解释器,然后再下载一个IDE(集成开发环境-integrated development environment)比如Pycharm,这能方便你在本地机上编写Python代码。
在编程中,语法非常重要,因为它描述了一个有效的编程语言的结构;简单来说,语法将告诉计算机如何使用控制编程语言的符号、标点和单词结构的规则来阅读代码,语法是编程语言的内部逻辑,它决定了一个编程语言需要如何编写代码才算有效。
Hello World
首先,让我们创建一个输出文本的简单Python程序。
# This is an example comment
print("Hello World")
正如你从上面的示例代码块中所看到的那样,它只有简单的一行(第一行是注释),当我们运行上面这段代码时,它将输出文本Hello World
。
让我们来分析一下,在这个例子中,第1行是一个注释,它以一个标签(#
)符号开头,注释行并不是由计算机运行得出的,而是由程序员(你)自行编写的,良好的注释可以帮助阅读代码的其他人理解代码含义。
例子中的第二行是有效代码块,我们可以使用print()
语句来控制输出到屏幕上的内容,英文括号()
内的任何内容都将被输出;但是,由于我们打印的是字符串(Python数据类型的一种),因此我们还必须将字符串内容放在英文双引号""
中。
请注意,本文中的示例都是针对Python3而言的。
答题
使用在线代码编辑器,打印“Hello World”并查看本小节的flag内容:
简单的数学运算符
现在让我们讨论数学运算符以及如何将它们应用于Python中。
我们知道计算器能够进行加、减、乘、除等运算,而使用Python也可以编写这样一个计算器;毕竟,编程可以编写规则从而让计算机遵循给定的特定输入和条件,下表显示了不同的数学运算符:
tips:取模不等于求余,取模运算向0方向舍入,而求余运算向无穷小方向舍入。
现在我们知道了基本的数学运算符,让我们继续学习比较运算符;它们在Python中扮演着重要的角色,并且将在我们学习循环和if语句时经常使用。这些比较运算符主要用于评估一个程序在特定状态下的条件。
答题
tips:使用在线代码编辑器。
打印 21 + 43 的结果:
打印 142 - 52 的结果:
打印 10 * 342 的结果
打印5的平方的结果:
变量和数据类型
变量允许你在计算机程序中存储和更新数据,当你有了一个变量名之后,你就可以将数据存储到该变量中。
Python变量命名规则:
- 变量名必须以字母或下划线开头;
- 变量名只能包含字母、数字和下划线(A-z、0-9 和 _) ;
- 变量名称区分大小写(例如,age、Age 和 AGE 是三个不同的变量);
- 变量名不能是 Python 关键字。
food = "ice cream"
money = 2000
在上面的例子中,我们有两个变量,变量名“food”存储字符串(ice cream) ,而另一个名为“money”的变量则存储数字(2000)。
变量非常强大,因为你可以在整个程序中更改它们,比如下面示例中的age变量初始值为30,如果我们将这个age变量增加1,则最终的变量数据值将为31。
age = 30
age = age + 1
print(age)
接下来让我们谈谈数据类型,即存储在变量中的数据的类型;我们可以在变量中存储字符串、数字和许多其他类型的数据,在Python中常见的数据类型有:
- String(字符串类型)——用于表示一系列字符的组合,如字母或符号的组合;
- Integer(整数类型)——表示整数(包括负数);
- Float(浮点类型)——表示包含小数点的数字;
- Boolean(布尔类型)——用于表示被限制为True或False选项的数据;
- List(列表类型)——列表可以包含混合类型的数据,在一个列表中可以有多个数据类型的元素。
答题
tips:使用在线代码编辑器。
逻辑运算符和布尔运算符
逻辑运算符允许进行赋值操作和比较操作,并可用于条件限制(比如在if语句中使用逻辑运算符):
布尔运算符主要用于连接和比较不同语句之间的关系,如果在if语句中使用布尔运算符,则能够表示条件为真或条件为假两种不同情况:
以下是几个和本小节内容相关的Python代码示例:
a = 1
if a == 1 or a > 10:
print("a is either 1 or above 10")
name = "bob" hungry = True
if name == "bob" and hungry == True:
print("bob is hungry")
elif name == "bob" and not hungry:
print("Bob is not hungry")
else: # If all other if conditions are not met(如果所有其他If条件都不满足)
print("Not sure who this is or if they are hungry")
If 语句简介
使用if语句可以允许程序做出决定——在if语句中,程序将根据不同条件来做出对应的决定。
下面是一个简单示例,它说明了如何使用if语句来确定程序将要执行的代码段(将执行哪个print语句)。
if age < 17:
print('You are NOT old enough to drive')
else:
print('You are old enough to drive')
在上面这个例子中,如果你的年龄小于17岁,程序将输出文本“你还不到开车的年龄”;但是,如果你的年龄超过17岁,程序就会输出文本“你已经可以开车了”。简而言之——通过使用if语句,程序将根据不同条件(在本例中,取决于age变量值),来确定将要执行的代码段(在本例中是执行print语句)。
我们从上面的代码示例中能够注意到一些关键组成部分:
if
关键字表示if语句的开头,后面会跟着一个或一组条件。- if语句只会在条件(或条件集)为真时才执行。在我们的例子中,第一个条件是
age < 17
,如果这个条件为真(年龄小于17岁),则程序会运行由该条件所限制的代码。在上面这个例子中,如果第一个条件不满足,程序会默认运行if语句的else
部分所示的代码。 - 冒号“
:
”表示if语句的条件判断部分的结束。 - 注意上述示例程序中的缩进部分,紧跟在冒号之后的缩进部分的代码段将被认为是if语句的一部分,程序将会根据条件的真假来执行缩进部分的语句。
if语句在编程中是必不可少的,并且将会是你经常使用的编程语句之一。
答题
tips:使用在线代码编辑器。
在本练习中,我们将编写一个小型应用程序——根据客户的消费金额来计算并输出客户所需要支付的总费用(可能需要运费):
- If a customer spends over $100, they get free shipping.——如果顾客消费超过100美元,他们就可以享受免费送货服务。
- If a customer spends < $100, the shipping cost is $1.20 per kg of the baskets weight.——如果客户花费< 100美元,运输成本则为每公斤(kg)1.20美元。
#Replace the X's with code
shipping_cost_per_kg = 1.20
customer_basket_cost = 34
customer_basket_weight = 44
if(customer_basket_cost >= 100):
print('Free shipping!')
else:
shipping_cost = customer_basket_weight * shipping_cost_per_kg
customer_basket_cost = customer_basket_cost + shipping_cost
print("Total basket cost including shipping is " + str(customer_basket_cost))
将customer_basket_cost变量值修改为101:
循环
在编程中,循环语句能够允许程序多次迭代和执行操作,在Python中有两种类型的循环语句:for
循环和while
循环。
while 循环
让我们从如何构造一个while循环开始,我们可以让循环无限地运行,或者根据条件(类似于if语句)确定循环应该运行多少次。
i = 1
while i <= 10:
print(i)
i = i + 1
上面这个while循环将运行10次,每次迭代时都会输出变量i的值(循环),让我们来分析一下以上示例:
- 变量i的初始值被设置为1;
- while语句将指定循环应从何处开始(设置循环开始和结束的条件);
- 每次开始循环时,它都会从循环中的顶部代码段开始(输出i的值);
- 然后它会转到循环中的下一行,将i的值增加1;
- 然后(因为没有更多的代码供程序执行),程序将再次从循环的顶部代码段开始,重新进行循环过程;
- 程序将继续循环,直到变量i的值大于10(i > 10不满足上述示例中的循环条件)为止。
for循环
for循环可用于遍历序列,例如遍历一个列表;列表(list)可用于在单个变量中存储多个数据项,list类型的变量能够通过使用方括号来创建(见下文)。
我们可以通过下面的例子来学习for循环和list类型的变量:
websites = ["facebook.com", "google.com", "amazon.com"]
for site in websites:
print(site)
上面代码块中所显示的for循环将运行3次,并会输出列表中的每个网站,让我们来仔细分析一下上述代码示例:
- 名为websites的列表变量存储了3个元素;
- 我们使用for循环来遍历websites列表中的每个元素,并打印出每个元素的内容;
- 当遍历完websites列表中的每个元素时,程序将自动停止for循环过程。
在实际应用for循环时,我们可以创建一个Python程序来检查目标网站是否在线或者目标商品是否仍有库存;我们可以循环遍历一个包含目标网站的网站列表,然后在循环中添加一些功能从而检查网站状态,并能输出对应的结果。
在Python中,我们也可以使用range
函数来迭代连续的数字,以下是相关的Python代码示例,此示例将打印从0到4的所有数字;在计算机编程中,0通常是起始数字,所以从0到4一共有五个数字(即0、1、2、3和4)。
#打印0、1、2、3、4共五个数字
for i in range(5):
print(i)
答题
tips:使用在线代码编辑器。
函数介绍
随着程序变得越来越大和越来越复杂,我们的程序中的一些代码可能将是重复的,此时我们就可以在程序中使用函数;所谓函数,即是那些可以在程序中的不同位置调用的具有特定功能的代码块。
你可以使用一个函数来进行某些特定操作,例如计算地图上两点之间的距离,或者基于某些确定的条件来输出格式化的文本。使用函数可以有效地消除程序中重复的代码,因为同一个函数可以在整个程序中被多次使用。
函数示例:
def sayHello(name):
print("Hello " + name + "! Nice to meet you.")
sayHello("ben") # Output is: Hello Ben! Nice to meet you
我们可以从上述这个函数示例中注意到以下这些关键组成部分:
def
关键字表示函数的开始,然后在关键字后面跟着编程人员自定义的函数名称(在上述例子中,函数名称为sayHello
);- 函数名后面是一对英文圆括号
()
,它用于保存函数的输入值,也就是我们可以传递给函数的数据(在上述例子中为name
); - 冒号
:
标志着函数头的结束; - 冒号之后的缩进部分代码段会被认为是函数的一部分(在上述例子中,缩进部分的代码段是print语句)。
函数在执行时可以返回对应的结果,以下面的代码块为例:
def calcCost(item):
if(item == "sweets"):
return 3.99
elif (item == "oranges"):
return 1.99
else:
return 0.99
spent = 10
spent = spent + calcCost("sweets")
print("You have spent:" + str(spent))
在上述代码示例中,我们设置了一个初始值为10
的spent
变量,然后还调用了calcCost
函数并传入“sweets
”作为该函数的item
参数;在以上代码示例的执行过程中,calcCost
函数的返回结果会是一个数字3.99
,所以最终的spent
变量值将等于初始值(10
)加上3.99
。
答题
tips:使用在线代码编辑器。
假设你已经投资了一定数目的比特币,现在你想编写一个程序来告诉你——当前所持有的比特币的价值何时低于特定的美元价值(低于$30,000则会作出提醒):
- 创建一个将比特币转换为美元的函数;
- 如果你当前所持有的比特币的价值低于3万美元,则打印一条提醒消息。
note:我们可以假设1比特币在我们刚开始投资时价值4万美元。
investment_in_bitcoin = 1.2
bitcoin_to_usd = 40000
# 1) write a function to calculate bitcoin to usd--编写一个函数来计算比特币兑换成美元之后的数值。
def bitcoinToUSD(bitcoin_amount, bitcoin_value_usd):
usd_value = bitcoin_amount * bitcoin_value_usd
return usd_value
# 2) use function to calculate if the investment is below $30,000--使用函数来计算当前所投资的比特币的价值是否低于30,000美元。
investment_in_usd = bitcoinToUSD(investment_in_bitcoin, bitcoin_to_usd)
if investment_in_usd <= 30000:
print("Investment below $30,000! SELL!")
else:
print("Investment above $30,000")
假设1比特币现在价值 25,000 美元,请修改程序的对应代码并重新得到一个执行结果(将bitcoin_to_usd
变量值更新为25000
即可)。
文件
在Python中,我们可以对文件进行读写操作。
在网络安全领域,编写脚本并基于某个文件执行数据的导入或导出操作是很常见的(无论是作为一种存储脚本输出的方式,还是从文件中导入一个包含100个网站的列表以用于枚举),现在,让我们查看以下示例:
f = open("file_name", "r")
print(f.read())
要打开文件,我们可以使用Python内置的open()
函数,上述代码中的open()
函数的“r
”参数代表“read
”,这个参数可以在读取文件内容时使用。上述例子中的f
变量有一个read()
方法,我们可以调用该方法来读取文件的内容。此外,我们也可以使用readlines()
方法来遍历指定文件的内容的每一行;如果我们有一个列表,并且列表中的每个项目都是分行表示的,那么这个方法就很有用。在上面的例子中,指定的文件与Python脚本是在同一个文件夹中,所以我们只需要给出具体的文件名称即可;但是,如果指定的文件与Python脚本不在一块,那么我们则需要在程序中给出该文件的完整路径。
我们还可以使用Python来创建和写入文件。如果要写入现有文件,则首先要打开文件,并且在open()
函数中的文件名调用之后使用“a
”参数(代表append);如果要写入新文件,则需要在open()
函数中使用“w
”(write)参数而不是“a
”。相关的例子如下所示:
f = open("demofile1.txt", "a") # Append to an existing file--追加到现有文件。
f.write("The file will include more text..")
f.close()
f = open("demofile2.txt", "w") # Creating and writing to a new file--创建并写入新文件。
f.write("demofile2 file created, with this content in!")
f.close()
注意:在以上示例代码中,我们在写入文件后还使用了close()
方法,该方法的作用是关闭文件,文件关闭之后则(在程序中)不允许再继续对该文件执行写操作。
答题
tips:使用在线代码编辑器。
读取flag.txt文件的内容:
f = open("flag.txt", "r")
print(f.read())
import(导入)库
在Python中,我们可以导入(import)库,库是一组包含函数的文件的集合。我们可以把导入库看作是导入已经为你编写好的可以使用的函数;例如,我们可以导入一个“datetime
”库,它允许我们访问数百个与日期、时间相关的不同函数。
tips:严格来说,Python中并没有库(library)的概念,模块(module)和包(package)才是Python语法中有的概念;Python中库的概念是从其他编程语言引进来的,在Python中,我们可以把库理解为一个具有相关功能模块的集合,这可以作为Python中的一个通俗的说法。
import datetime
current_time = datetime.datetime.now()
print(current_time)
我们可以使用import
关键字来导入其他库,成功导入某个库之后,在Python中,我们就可以使用已经导入的库名来引用它所包含的函数。如上述示例所示,我们首先导入了一个datetime
库,然后我们可以通过调用library_name.method_name()
来访问具体的方法——如datetime.datetime.now()
。
以下是Python中的一些流行的库,这些库在渗透测试中可能会很有用:
虽然已经有许多库内置到了Python编程语言中,但是,还有很多由其他程序员编写的尚未安装在你的机器上的第三方库,我们可以使用一个名为pip
的应用程序来安装这些第三方库,pip
应用程序是Python的包管理器。
假设我们想使用scapy
库(它允许我们用代码制作自己的数据包并将这些数据包发送到其他机器),我们可以通过pip install scapy
命令安装scapy
库,然后我们就能在Python程序中使用import
关键字来导入scapy
库。