点击上方“码农突围”,马上关注,每天早上8:50准时推送
真爱,请置顶或星标
来自公众号:Python程序员
译者:zfzf1236
原文链接:https://insinuator.net/2015/09/python-for-hackers/
Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Python语言编写的(除了用Ruby写的安全漏洞检测工具)。Python允许开发者编写脚本处理远程服务,处理二进制文件,与C语言库(或者Java的Jython/。Net的IronPython)以快速且简单的方式进行交互。它“内置电池”原则的巨大标准库,为开发省去对其它框架或者语言的依赖。
我想跟读者们分享个人的Python编程经历,这些也许会对你未来的工作有所帮助,让这个世界变得更加安全一些(注:大多数例子基于Python3.0以上版本编写的,有些可以兼容python所有分支)。
1、环境配置对于你要编写的大多数工程或者脚本,建议读者们最好将所有的依赖放在同一个位置(除了有些在特殊工程中才用到的依赖)。为了满足上述要求,需要用到一个叫virtualenv的工具(Python3.3已经包括该工具),这个工具有一个简洁的功能,就是在不打乱全局环境的基础上,为你的Python工程生成独立的环境:
# 生成新环境的方法如下: $ virtualenv <新环境的路径> # 或者在Python3.3以上的环境中: $ python3 -mvenv <新环境的路径> # 使用这个环境之前,你要先激活它: $ source <新环境的路径>/bin/activate # 禁止该环境的方式也很简单: $ deactivate2、安装依赖包
很多时候读者们会发现,借助大型python社区中的python库编写的个人工具,可以帮助我们很快得到结果。你可以通过个人软件管理包或者可用的python软件包管理器安装这些库,其中最权威的就是pip工具了。有了pip,你可以全局安装这些依赖包(#pip install),或者逐用户安装( pip install)。读者可以手动地使用个人发行版包管理器,或者基于Python3.4提供的库,安装pip包。
有一个基本的python包叫iPython,通常在我不是100%肯定该如何解决当前任务,想尝试做些实验时,我会安装这个依赖包。IPython是常用的python命令行,它是基于Python编写的,有以下几个特点:
动态对象内省
通过Tab完成本地命名空间
持续的历史记录
会话日志
路径补全
JIT调试器
自动缩进
和平常一样,通过pip安装也很简单:$ pip install ipython
如果你想创建教程或者其它文本文件,ipython中的笔记本特性(现在由jupyter提供)允许用户通过个人浏览器和IPython命令行交互,包括markdown、 mathjax、matplotlib等工具支持。
(通过安装jupyter(pip install jupyter)可以使用它们,开启笔记本服务通过(jupyter notebook))。
如果读者们需要与包括JSON/XML的HTTP服务交互,我建议特别好用的requests依赖库。该python库可以处理与网页交互面对的各类操作,如编码、解码、参数、标记、重定向等。例如,请求和解析一个JSON资源的代码如下:
r = requests.get('https://api.github.com/user', auth=('user', 'pass')) r.json() {u'private_gists': 419, u'total_private_repos': 77, ...}
大多数HTML解析和交互工作都可以交给BeautifulSoup库,该python库可以在任何现在浏览器上处理HTML输入,包括修复受损代码。
3、与网络交互我们大多数目标都有可能在网络上获取,安装好的标准库中已经包含了通用的、有用的python库,这里我对其进行简短的介绍。socket模块是基于BSD socket API的瘦包装器,它在所有的通用操作系统都可用。
所以如果你已经有C语言socket编程经验,你可以将你的代码轻易地翻译成python代码。有很多特别方便的函数,如create_connection函数可以创建TCP socket,建立本机和给定主机或者端口的连接。另一个包装器是sendall方法,有些数据只有当所有给定数据都被发出,或者有错误发生才能在线路中传输,而sendall方法可以尝试重传这些数据。
from __future__ import unicode_literals import socket s = socket.create_connection(('www.ernw.de', 80)) s.sendall(b'GET / HTTP/1.1 Host: www.ernw.de ') print(s.recv(1024))
增加TSL加密链路也非常简单:
from __future__ import unicode_literals import socket import ssl s = socket.create_connection(('www.ernw.de', 443)) s = ssl.wrap_socket(s) s.sendall(b'GET / HTTP/1.1 Host: www.ernw.de ') print(s.recv(1024))
上述功能也可以在已经使用的连接中实现:
from __future__ import unicode_literals import socket import ssl s = socket.create_connection(('smtp.example.com', 25)) s.sendall(b'HELO smtp.example.com STARTTLS ') print(s.recv(1024)) s = ssl.wrap_socket(s) s.sendall(b'MAIL FROM: ') print(s.recv(1024))
如何你不需要这些低级服务交互,还有些模块可以提供高层服务交互:
smtplib
ftplib
poplib
imaplib
httplib (Python 3以上版本的http客户端)
nntplib
telnetlib (应用于服务开发和之后的需要交互命令行会话)
xmlrpclib (Python 3以上版本的xmlrpc客户端)
4、二进制操作或编码当开发与服务或者文件交互的脚本时,你经常会发现需要将数据转换为不同格式或者编码。在Python2.x版本中,通常使用encode或者decode方法将字符串在不同格式之间转换。
"Hello World".encode("hex") "AAA=".decode("base64")
很可惜,这种捷径在Python3.x版本中被取消了,encode和decode方法当前只可以实现字符编码,如utf-8, cp1250, iso8859, big5等。
作为替代,你现在只能使用bytes类型的两种方法实现十六进制编码:
bytes.fromhex('414141') b'AAA'.hex() # 从Py3.5 开始
对于Base64编码,你需要使用另外的模块(在Python2.x版本中也有):
import base64 base64.b64encode(b'Hello World') import codecs codecs.encode(b'Hello World', 'base64') import binascii binascii.b2a_base64(b'Hello World')
URLs编码或者解析可以用urllib.parse模块实现(Python2.x版本中是urllib)
from urllib.parse import quote_plus, unquote_plus quote_plus('Hello World+1=1337') # Hello+World%2B1%3D1337 unquote_plus('Hello+World') # Hello World
Python普通数据类型(如int,float,str)与二进制之间的一般转换,可以在stuct模块中实现:
import struct struct.pack('关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录