pwntools安装使用方法

pwntools是一个CTF框架和漏洞利用开发库,用Python开发,由rapid设计,旨在让使用者简单快速的编写exploit。

pwntools对Ubuntu 12.04和14.04的支持最好,但是绝大多数的功能也支持Debian, Arch, FreeBSD, OSX, 等等。

安装前确保安装了Binutils、Capstone、Python Development Headers等系统库

官方文档:http://docs.pwntools.com/en/stable/

本文包含:

  • 总结:pwntools的各种新版本问题
  • windows安装pwntools方法
  • linux的简单安装pwntools方法
  • 以前按部就班的详细安装步骤
  • 安装pwntools时出现的各种错误
  • 使用asm功能报错

0x00 总结:pwntools的各种新版本问题

  • python3运行elf.plt['puts']之类报错

    [!] Could not populate PLT: future feature annotations is not defined (unicorn.py, line 2)
    

    from __future__ import annotations在Python 3.7及以上版本中引入的。推荐安装python3.7以上版本

  • python2运行elf.plt['puts']之类报错

    [!] Could not populate PLT: invalid syntax (unicorn.py, line 110)
    [!] Could not populate PLT: cannot import name arm_const
    # 或
    RuntimeError: maximum recursion depth exceeded
    

    这是安装的pwntools版本太高了。不管python2.7.17还是2.7.18,卸载pwntools后,安装pwntools==4.4.0可以,而且可以再卸载4.4.0版,再安装pwntools==4.10.0(目前测试的python2.7能使用的最高版本)

  • windows的python3运行p.interactive()任何命令都是not found

    ls
    : not found ls
    cat flag
    cat: 'flag'$'\r': No such file or directory
    

    新版本的interactive之后由cmd或者powershell接管,发送的命令就会多一个\r,例如想发送ls,就会变成ls\r\n,使得在linux系统内无法找到ls\r这个命令。可以使用pycharm或者wsl来运行。

  • windows的python2使用了context.log_level='debug',在cmd里输出时候也会报警告:

    stream.write(fs % msg)
IOError: [Errno 0] Error
Logged from file log.py, line 29

也是推荐使用pycharm或者wsl来运行。

  • (本文将不定时更新)

0x01 windows安装pwntools方法

由于pwntools推出了4.3.1版,pcat尝试在windows里安装pwntools,发现是可行的。windows的python版本推荐是py2.7.15以上。

且由于capstone推出了capstone-windows,让安装更简单起来。

python2:

pip install win-inet-pton
pip install psutil pysocks unicorn==1.0.2rc1 MarkupSafe bcrypt==3.1.3 cryptography==2.5 pynacl==1.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install capstone-windows ropgadget
pip install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple/

python3:

pip install win-inet-pton
pip install psutil pysocks unicorn MarkupSafe bcrypt cryptography pynacl -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install capstone-windows ropgadget
pip install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple/

-= 2023年9月补充 =-

如果python3安装pwntools后,运行报错

    from elftools.common.py3compat import bytes2str
ModuleNotFoundError: No module named 'elftools.common.py3compat' 

查看下pyelftools的版本是不是0.30,测试后发下0.29的版本不会报错,于是选择卸载当前版本,换回旧版

pip uninstall pyelftools -y
pip install pyelftools==0.29

再运行pwntools就没问题了。

0x02 linux的简单安装pwntools方法

现在linux的安装方法可以很简单:

pip install pwntools

这里py2.7的版本推荐py2.7.12或以上,总之py2.7.5或py2.7.6等老版本不用尝试安装,否则会有各种报错。

诸如:

SyntaxError: unqualified exec is not allowed in function 'make_function' it contains a nested function with free variables

-= 2019年10月补充 =-

pwntools支持python3

apt-get update
apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pwntools

(如果有各种报错,欢迎留言)

-= 2019年5月补充 =-

在ubuntu上pip安装,建议先

apt-get install -y python-dev python-pip libffi-dev libssl-dev
pip install -U setuptools
pip install cryptography==2.4.2

-= 2020年4月补充 =-

pip安装的各种报错

  File "/usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 228, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

由于国内网速的原因,推荐换个清华源

pip install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple/

报错:

    File "<string>", line 1, in <module>
  IOError: [Errno 2] No such file or directory: '/tmp/pip-build-jbiHJq/unknown/setup.py'
  
  ----------------------------------------
  Failed building wheel for unknown

此乃一个bug,无视它即可,重新执行语句就不报错了。

如再报错:

AssertionError: zipp>=0.5 .dist-info directory not found

这是zipp在清华源下找不到相对应的版本,推荐个国外源piwheels

pip install pwntools -i https://www.piwheels.org/simple/

0x03 以前按部就班的详细安装步骤

(内容距今很久,仅供参考)

(1) 安装Capstone

Capstone disassembly/disassembler framework: Core (Arm, Arm64, M68K, Mips, PPC, Sparc, SystemZ, X86, X86_64, XCore) + bindings (Python, Java, Ocaml)

在终端输入

git clone https://github.com/aquynh/capstone
cd capstone
make
make install

(这里很顺利)

(2) 安装pwntools

在终端输入

git clone https://github.com/Gallopsled/pwntools
cd pwntools
python setup.py install

如果没报错,并且终端输入python进入其交互模式后,输入import pwn回车后没报错,差不多就好了。

这时候再尝试pwntools的asm功能

>>> pwn.asm("xor eax,eax")
'1\xc0'

如果有正确输出,即说明这个功能是可以用的,到这里就算安装完成。

(如果想了解更多asm可以访问: http://docs.pwntools.com/en/stable/asm.html)

0x04 安装pwntools时出现的各种错误

Err1:

fatal error: openssl/e_os2.h: 没有那个文件或目录

要解决这个问题,只需要安装OpenSSL 开发包

apt-get install libssl-dev

Err2:

error: Installed distribution pyasn1 0.1.7 conflicts with requirement pyasn1>=0.1.8

把pyasn1(ASN.1 library for Python)更新即可

git clone https://github.com/etingof/pyasn1
cd pyasn1
python setup.py install

0x05 使用asm功能报错

[!] Your local binutils won't be used because architecture 'i686' is not supported.
[!] Could not find 'as' installed for ContextType()
    Try installing binutils for this architecture:
        https://pwntools.readthedocs.org/en/latest/install/binutils.html

大概就是Binutils库不支持i686这种32位架构(Binutils 是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。)

我访问了里面的链接地址,下面是里面的安装方法:

apt-get install software-properties-common
apt-add-repository ppa:pwntools/binutils
apt-get update

apt-get install binutils-$ARCH-linux-gnu  # $ARCH is your target architecture (e.g., arm, mips64, vax, etc.).

我在kali2 32位执行到第2句会报

aptsources.distro.NoDistroTemplateException: Error: could not find a distribution template for Kali/sana

诶- -。伤感,然后我看那链接里后面的一个sh,里面写得不好(rm后还能tar解压。。),即使我修改后运行sh也解决不了这个asm问题。

在我绝望的时候,我觉得可以去github找找,果然让我找到了一个pwntools-binutils项目

git clone https://github.com/Gallopsled/pwntools-binutils
cd ubuntu
chmod +x install_all.sh
./install_all.sh arm #your architecture

项目里面ubuntu文件夹有一个install.sh和install_all.sh,但我试了./install.sh arm找不到安装包后,我就只好尝试./install_all.sh arm安装所有。

这一试,也让我知道Binutils库目前支持的架构。

以下的安装包是存在的(其架构也是被支持的):

binutils-aarch64-linux-gnu
binutils-mips-linux-gnu
binutils-powerpc-linux-gnu

而下面这些安装包暂时是不存在:

binutils-alpha-linux-gnu
binutils-arm-linux-gnu
binutils-avr-linux-gnu
binutils-cris-linux-gnu
binutils-hppa-linux-gnu
binutils-ia64-linux-gnu
binutils-m68k-linux-gnu
binutils-mips64-linux-gnu
binutils-msp430-linux-gnu
binutils-powerpc64-linux-gnu
binutils-s390-linux-gnu
binutils-sparc-linux-gnu
binutils-vax-linux-gnu
binutils-xscale-linux-gnu
binutils-i386-linux-gnu
binutils-x86_64-linux-gnu

所以暂时不被支持的架构下是无法安装好Binutils库,也就无法使用asm功能。

0x06 等pcat以后更新:)

http://pcat.cc