关于 pwntools

无论你是用pwntools编写exp,还是将它作为一个其它软件工程的一部分,你都可以决定如何使用它。

历史上, pwntools是被用来编写一系列exp的领域特定语言(DSL)。在当前的pwntools版本中,我们只需要简单地用 from pwn import * 短短一行代码就可以使用各种漂亮的作用。

当我们重构pwntools的2.0版本时,我们注意到了两个相反的目标:

  • 我们更愿意构造一个“寻常的”python模块结构,来使得使用者更快速地了解和使用pwntools。
  • 我们想拥有更多的炫酷效果,尤其是将终端设为raw模式。

为了实现上面两个目标,我们决定开发两个不同的python模块: pwnlib 是一个整洁的python模块,而 pwn 则是我们在CTF中使用和编写exp的模块。

pwn — 为CTF优化的工具箱

就像之前所说的那样,我们希望可以得到各种各样炫酷的结果,这也是这个模块的目的。它可以完成以下事情:

  • 可以在子模块中引用所有 pwnlib 顶级模块中的函数。这意味着,如果你使用了 import pwn 或者 from pwn import * ,你就可以使用你所需要的函数去编写exp。
  • 调用 pwnlib.term.init() 函数将会使当前终端处于raw模式,同时可以引入一些让其变得与众不同的功能。
  • 设置 pwnlib.context.log_level 为info记录状态。
  • 试图解析 sys.argv 中的一些值,并且每成功分析一个,就会删除掉一个。

pwnlib — 标准的python模块

这个模块是我们使用“纯净”的python开发的。一般地,我们不想在引用 pwnlib 或是在使用其子模块时出现这样那样的副作用。

大多数情况下,你只会得到你想使用的功能。例如,如果你不使用 import pwnlib.util ,你将没有权使用 pwnlib.util.packing 这个子模块。

尽管pwnlib中有一些特例,例如 pwnlib.shellcraft , 影响这整个模块的简洁,但它们仍可在没有隐性副作用的情况下被使用。