Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Python语言编写的(除了用Ruby写的安全漏洞检测工具)。Python允许开发者编写脚本处理远程服务,处理二进制文件,与C语言库(或者Java的Jython/。Net的IronPython)以快速且简单的方式进行交互。它“内置电池”原则的巨大标准库,为开发省去对其它框架或者语言的依赖。我想跟读者们分享个人

的python编程经历,这些也许会对你未来的工作有所帮助,让这个世界变得更加安全一些(注:大多数例子基于Python3.0以上版本编写的,有些可以兼容python所有分支)。

环境配置

对于你要编写的大多数工程或者脚本,建议读者们最好将所有的依赖放在同一个位置(除了有些在特殊工程中才用到的依赖)。为了满足上述要求,需要用到一个叫virtualenv的工具(Python3.3已经包括该工具),这个工具有一个简洁的功能,就是在不打乱全局环境的基础上,为你的Python工程生成独立的环境,生成新环境的方法如下:

$ virtualenv <新环境的路径>

或者在Python3.3以上的环境中&#xff1a;

$ python3 -mvenv <新环境的路径>

使用这个环境之前&#xff0c;你要先激活它&#xff1a;

$ source <新环境的路径>/bin/activate

禁止该环境的方式也很简单&#xff1a;

$ deactivate

安装依赖包

很多时候读者们会发现&#xff0c;借助大型python社区中的python库编写的个人工具&#xff0c;可以帮助我们很快得到结果。你可以通过个人软件管理包或者可用的python软件包管理器安装这些库&#xff0c;其中最权威的就是pip工具了。有了pip&#xff0c;你可以全局安装这些依赖包&#xff08;#pip install &#xff09;,或者逐用户安装&#xff08;$ pip install --user &#xff09;&#xff0c;或者在虚拟环境中安装((venv) $ pip install )。读者可以手动地使用个人发行版包管理器&#xff0c;或者基于Python3.4提供的库&#xff0c;安装pip包。

有一个基本的python包叫iPython&#xff0c;通常在我不是100%肯定该如何解决当前任务&#xff0c;想尝试做些实验时&#xff0c;我会安装这个依赖包。IPython是常用的python命令行&#xff0c;它是基于Python编写的&#xff0c;有以下几个特点&#xff1a;

  • 动态对象内省

  • 通过Tab完成本地命名空间

  • 持续的历史记录

  • 会话日志

  • 路径补全

  • JIT调试器

  • 自动缩进

和平常一样&#xff0c;通过pip安装也很简单&#xff1a;$ pip install ipython

如果你想创建教程或者其它文本文件&#xff0c;ipython中的笔记本特性&#xff08;现在由jupyter提供&#xff09;允许用户通过个人浏览器和IPython命令行交互&#xff0c;包括markdown、 mathjax、matplotlib等工具支持。

(通过安装jupyter&#xff08;pip install jupyter&#xff09;可以使用它们&#xff0c;开启笔记本服务通过&#xff08;jupyter notebook&#xff09;)。

如果读者们需要与包括JSON/XML的HTTP服务交互&#xff0c;我建议特别好用的requests依赖库。该python库可以处理与网页交互面对的各类操作&#xff0c;如编码、解码、参数、标记、重定向等。例如&#xff0c;请求和解析一个JSON资源的代码如下&#xff1a;


v2-0fca6ceac4e4095ad451309aaedf6019_hd.jpg


大多数HTML解析和交互工作都可以交给BeautifulSoup库&#xff0c;该python库可以在任何现在浏览器上处理HTML输入&#xff0c;包括修复受损代码。

与网络交互

我们大多数目标都有可能在网络上获取&#xff0c;安装好的标准库中已经包含了通用的、有用的python库&#xff0c;这里我对其进行简短的介绍。socket模块是基于BSD socket API的瘦包装器&#xff0c;它在所有的通用操作系统都可用。所以如果你已经有C语言socket编程经验&#xff0c;你可以将你的代码轻易地翻译成python代码。有很多特别方便的函数&#xff0c;如create_connection函数可以创建TCP socket,建立本机和给定主机或者端口的连接。另一个包装器是sendall方法&#xff0c;有些数据只有当所有给定数据都被发出&#xff0c;或者有错误发生才能在线路中传输&#xff0c;而sendall方法可以尝试重传这些数据。


v2-71fc38f2af87ff1c1e86e11a43b2dbc8_hd.jpg


增加TSL加密链路也非常简单&#xff1a;


v2-881284440b8a6b9179308acfb8f2697f_hd.jpg


上述功能也可以在已经使用的连接中实现&#xff1a;


v2-0c22d9163237fba709457bdcf0f41a82_hd.jpg


如何你不需要这些低级服务交互&#xff0c;还有些模块可以提供高层服务交互&#xff1a;

  • smtplib

  • ftplib

  • poplib

  • imaplib

  • httplib (Python 3以上版本的http客户端)

  • nntplib

  • telnetlib (应用于服务开发和之后的需要交互命令行会话)

  • xmlrpclib (Python 3以上版本的xmlrpc客户端)

二进制操作或编码

当开发与服务或者文件交互的脚本时&#xff0c;你经常会发现需要将数据转换为不同格式或者编码。在Python2.x版本中&#xff0c;通常使用encode或者decode方法将字符串在不同格式之间转换。


v2-8e4da50eae1e9bf9598e46e90%C3%97%C3%97%C3%971f6_hd.jpg


很可惜&#xff0c;这种捷径在Python3.x版本中被取消了&#xff0c;encode和decode方法当前只可以实现字符编码&#xff0c;如utf-8, cp1250, iso8859, big5等。

作为替代&#xff0c;你现在只能使用bytes类型的两种方法实现十六进制编码&#xff1a;


v2-2aaee50fef36a80e3c0a487fc61c774b_hd.jpg


对于Base64编码&#xff0c;你需要使用另外的模块&#xff08;在Python2.x版本中也有&#xff09;&#xff1a;


v2-8fb401ac0f03f4db378d194295b6a9b0_hd.jpg


URLs编码或者解析可以用urllib.parse模块实现&#xff08;Python2.x版本中是urllib&#xff09;


v2-1bf94c0e0d574d2ae4ff41b1a1adb76b_hd.jpg


Python普通数据类型&#xff08;如int,float,str&#xff09;与二进制之间的一般转换&#xff0c;可以在stuct模块中实现&#xff1a;


v2-8ddb7fd19d06f6329fafda40570ed00e_hd.jpg


Python3.2也可以使用int类型直接获取其二进制表示&#xff1a;


v2-2b46c1d347a65e20982bc8e93e817bd7_hd.jpg


ctypes 模块还有一个特别棒的特征&#xff0c;如果你将cpython作为解译器&#xff08;通常大家都是这样&#xff09;&#xff0c;就可以使用ctypes.Structure结构化描述C语言&#xff0c;获取它们的二进制表示&#xff0c;就好像从C应用程序中转储的一样。


v2-bd6e9fc0db9847a2d5959cf02c45ae67_hd.jpg


ctypes 模块通常是Python程序集和C语言库之间的桥梁&#xff0c;不需要编写任何Python包装器。有了ctypes模块&#xff0c;你可以使用任何C语言库和其输出函数&#xff1a;


v2-52095ca533a7f43b8ff92fcd2ce03770_hd.jpg


上文中提到Structure 类型主要用于C语言库的交互&#xff0c;在函数调用过程中传递或者获取结构。

漏洞开发工具

很多CTF团体提供他们自己的的CTF解决方案框架&#xff0c;我发现来自Gallopsled 的pwntools框架特别有用&#xff0c;尤其是开发远程elf二进制时&#xff0c;它包含很多方便的函数&#xff0c;例如位移计算&#xff08;通过cyclic模式&#xff09;、格式化字符串开发&#xff08;普通数据馈送以及产生的格式化字符串&#xff09;、跳转组合&#xff08;基于ropgadget解析elf二进制以及提供生成简单跳转组合调用的包装器&#xff09;和不同传输通道的全部API&#xff08;称作管道&#xff09;。这些可以让读者们开发gdb编译后端&#xff0c;同时简单地改变一行代码就可以传输到目标服务。



v2-37937837a275461650ce554527cfa491_hd.jpg



英文原文&#xff1a;insinuator.net/2015/09/ 
译者&#xff1a;zfzf1236
来源&#xff1a;Python部落