之前一直在学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=queue.get(1) print data funcs=[listener,reader] nfuncs=range(len(funcs)) threads=[] q=Queue(32) for i in nfuncs: t=Thread(target=funcs[i],args=(q,)) threads.append(t) for i in nfuncs: threads[i].start() for i in nfuncs: threads[i].join()
最后说一下编写代码过程中遇到的问题。
一是如果过早的关闭了套接字对象,那么在调用recv()函数的时候会产生一个没有写权限的错误。
二是args的类型一定要是一个元组,当元组里面只有一个元素的时候似乎会出错,不过在后面加上逗号就好了。
14-08-08 考核试题总结~,布布扣,bubuko.com
原文地址:http://al0707.blog.51cto.com/9215022/1537591