首页 > 代码库 > 14-08-08 考核试题总结~

14-08-08 考核试题总结~

    之前一直在学php,没想到考察的是python。。恶补了一下,幸好上课的时候看了一些基本语法和系统编程、linux里面关于线程的描述,最后还是做出来了。

   

    第一题:Flag经base64编码后,再进行移位加密得到密文:IVUBNJmwAx5Wq29zXTekNyde。移位加密位移量未知。编写脚本得到flag


    很简单的一道题,移位后保存结果,然后用自带的base64模版里的函数直接解码,值得一提的是python中不支持字符(char)类型,所以很多操作较c语言来说还是比较麻烦的(可能是我对python里面字符串了解不多= =),用for遍历,得到每一个字符使用ord()函数取其asc码,加一之后利用chr()函数返回字符。完成移位操作。

    以下是代码(python版本是2.7.6):

#usr/bin/env python
"8.6 exam1"
import base64
AIMSTR=‘IVUBNJmwAx5Wq29zXTekNyde‘
FILENAME=‘/home/al/Desktop/res.txt‘
def movword(n,a):
	"single letter"
	temp=ord(a)
	if temp>47 and temp<58:
		return chr(temp)
	i=0	
	while i<n:
		temp+=1
		if temp==91:
			temp =65
		if temp==123:
			temp =97
		i+=1	
	return chr(temp)
		
def movstr(n,str):
	"for each word in str mov n forward"
	temp=""
	for ch in str:
		ch=movword(n,ch)
		temp+=ch
	return temp

fileobj=open(FILENAME,"w")
temp=AIMSTR
for i in range(24):
	temp=movstr(1,temp)
	temp2=base64.b64decode(temp)
	print temp2
	fileobj.writelines(‘%s\n‘%temp2)
fileobj.close()
print ‘Done!‘


 

    第二题: 设计一个线程池控制的端口扫描器,要求用socket connect方法即可。指定端口后开启线程池调度,扫描结束后将结果放入消息队列中,开启打印线程打印消息。要求扫描和打印是并行的。


    关于多线程编程和消息队列的实现已在上一篇博文中讲过,这里不做赘述,主要总结下web编程,也就是socket模版和套接字的使用问题。

    这里主要叙述如何建立一个TCP服务器。

    首先创建一个socket对象,创建时第一个参数是套接字类型,这里我们使用AF_INET,是一种基于网络的套接字。        再使用bind()内建函数绑定套接字的地址,其中地址由主机和端口组成HOST设为空表示可以绑定在所有有效地址上,端口选一个未被占用的就行了。

    之后这个socket对象就会一直监听这个端口传来的数据,使用内建的recv()可以被动接受传来的数据,并且可以将其保存在一个变量之中,或者直接放入消息列表。

    接下来就只需要一直让这个recv()函数一直处于活动状态不停监听传来的数据就行了。

    关于收到的数据放入消息队列q,然后reader()函数所在线程读取q中的消息,强调一下要给reader()中q.get()函数中加上非零的参数block,使得在队列中没有消息的时候能挂起而不是一直输出空格。

    代码如下:

from socket import *
from time import *
from threading import Thread
from Queue import Queue

HOST=‘‘
PORT=9011
BUFSIZ=1024
ADDR=(HOST,PORT)

#the attribute of socket

def listener(queue):

	tcp=socket(AF_INET,SOCK_STREAM)
	tcp.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
	tcp.bind(ADDR)
	tcp.listen(0)

	print ‘waiting for connection....‘
	tcp,addr=tcp.accept()
	print ‘...connected from:‘,addr
	while True :
		data = tcp.recv(BUFSIZ)
		if not data:
			break
		queue.put(‘[%s] %s‘%(ctime(),data),1)
		#print ‘[%s] %s‘%(ctime(),data)
	tcp.close()

def reader(queue):
	while True:
		data=http://www.mamicode.com/queue.get(1)>

    最后说一下编写代码过程中遇到的问题。

    一是如果过早的关闭了套接字对象,那么在调用recv()函数的时候会产生一个没有写权限的错误。

    二是args的类型一定要是一个元组,当元组里面只有一个元素的时候似乎会出错,不过在后面加上逗号就好了。