二进制漏洞挖掘pwn系列
PwnTools总结
00 分钟
2022-8-24
2024-11-11
type
status
date
slug
summary
tags
category
icon
password

pwntools介绍

Pwntools是一个非常著名的CTF框架漏洞利用开发库,可以让使用者快速的编写exp
它拥有本地执行远程连接读写shellcode生成ROP链构建ELF解析符号泄漏等众多强大的功能。
具体详细介绍可以参考:

pwntool安装

因为是一个python的库,所以直接pip安装就行
检查是否安装成功
notion image

pwntools常用模块和函数

Pwntools分为两个模块
  • 一个是pwn,简单的用from pwn import *就能把所有子模块和一些常用的系统库导入当前命名空间中,是专门为了CTF比赛优化的。
  • 另外一个模块是pwnlib,它适合开发成产品,根据自己需要来导入不同的子模块。

pwnlib的子模块

  • pwnlib.adb: 安卓adb
  • pwnlib.asm: 汇编和反汇编
  • pwnlib.constans: 包含各种体系结构和操作系统中的系统调用号常量(来自头文件),constants.linux.i386.SYS_stat
  • pwnlib.context: 设置运行环境
  • pwnlib.dynelf: 利用信息泄漏远程解析函数
  • pwnlib.encoders: 对shellcode进行编码,如encoders.encoder.null('xxx')
  • pwnlib.elf: 操作ELF可执行文件和共享库
  • pwnlib.fmtstr: 格式化字符串利用工具
  • pwnlib.gdb: 调试,配合gdb使用
  • pwnlib.libcbd: libc数据库,入libcdb.search_by_build_id('xxx')
  • pwnlib.log: 日志记录管理,比如log.info('hello')
  • pwnlib.memleak: 内存泄漏工具,将泄漏的内存缓存起来,可作为Payload
  • pwnlib.qume: QEMU模拟相关,一般用来模拟不同架构的指令或运行程序
  • pwnlib.rop: ROP利用工具,包括rop,srop等
  • pwnlib.runner: 运行Shellcode,例如:run_assembly('mov eax,SYS_exit;int 0x80;')
  • pwnlib.shellcraft: Shellcode生成器
  • pwnlib.tubes: scokets、ssh、进程管道通信
  • pwnlib.utils: 一些实用小工具,比如CRC计算,cyclic字符串生成等

pwnlib.context(运行环境)

这个模块主要是用来设置进程运行时的环境,比如目标是什么CPU架构,多少位数,什么平台,是否开启日志等等。
notion image
不知道cpu架构的可以去看看一本书《CTF权威指南(pwn篇)》里的第三章,cpu架构与指令集
CPU架构如下:
位数如下:
平台如下:

pwnlib.tubes(通信模块)

tubes模块是主要用来通信的模块,是pwn题中用的最广泛的交互方式
他主要有下面4中通信方式:
  1. pwnlib.tubes.process: 进程通信
  1. pwnlib.tubes.serialtube: 串口通信
  1. pwnlib.tubes.sock: socket套接字通信
  1. pwnlib.tubes.ssh: SSH连接通信
tubes.process
链接我们本地或者远程文件
notion image
链接成功后,我们就可以与文件进行交互
比如利用sendline命令就可以发送原始的十六进制数据
具体可参考于下面完整利用:

pwnlib.elf(ELF文件操作)

pwnlib.elf模块还是挺实用的,虽然linux下有<elf.h>头文件可以用来解析ELF文件,但是很多代码都要自己实现,这个模块就解决了这些实现,可以进行符号查找、虚拟内存、文件偏移、修改和保存二进制等等
比如我们有一个elf文件,我们可以用这些代码打印出GOT表、PLT表、符号表中hack函数的偏移,其中装载地址为0是因为这是个动态链接程序,装载地址不确定,改成静态编译就能显示装载地址。
notion image
notion image
一些常用子模块一览

pwnlib.asm(汇编模块)

这是个很强大的模块,可以进行汇编和反汇编,通常用来开发Shellcode的时候非常有用。
可以用pwnlib.context先设置CPU架构字节序位数。
asm()函数进行汇编,用disasm()函数进行反汇编
比如下面用asm模块打印自动写好的shellcode
利用asm模块将汇编打应成机器码:
notion image
当汇编反汇编,其他架构平台时候,记得要安装对应的Binutils,安装教程:
💡
我用的ubuntu22.24默认安装有2.38版本的
notion image
利用disasm模块将指令反汇编成汇编指令,注意下面的代码,返汇编的cpu架构arch需和虚拟机一样,位数bits一样
notion image
反汇编的效果真的很6,可以试试

pwnlib.shellcraft(Shellcode生成器)

这个模块可以用来生成Shellcode代码,这种模块简直太爱了,他可以生成aarch64、arm、thumb、mips、i386、amd64、powerpc架构的shellcode代码,基本上的架构都有了。
notion image
生成了一个x86架构平台的nop
接下来生成一个Android手机打开/data/local/tmp/test.txt的Shellcode,这模块真的很6。
notion image
它还能配合asm输出不同格式shellcode
notion image
官方的例:

pwnlib.util(小工具)

这个模块是一些常用的功能函数,比如上面用到过的unhex就来自这模块,除此之外还有packing、hashes、net、misc、sh_string、cyclic等函数

pwnlib.rop(rop利用模块)

先简单回顾一下ROP的原理,由于NX开启不能在栈上执行shellcode,我们可以在栈上布置一系列的返回地址与参数,这样可以进行多次的函数调用,通过函数尾部的ret语句控制程序的流程,而用程序中的一些pop/ret的代码块(称之为gadget)来平衡堆栈。其完成的事情无非就是放上/bin/sh,覆盖程序中某个函数的GOT为system的,然后ret到那个函数的plt就可以触发system('/bin/sh')。由于是利用ret指令的exploit,所以叫Return-Oriented Programming。(如果没有开启ASLR,可以直接使用ret2libc技术)
好,这样来看,这种技术的难点自然就是如何在栈上布置返回地址以及函数参数了。而ROP模块的作用,就是自动地寻找程序里的gadget,自动在栈上部署对应的参数。
使用ROP(elf)来产生一个rop的对象,这时rop链还是空的,需要在其中添加函数。
因为ROP对象实现了__getattr__的功能,可以直接通过func call的形式来添加函数,rop.read(0, elf.bss(0x80))实际相当于rop.call('read', (0, elf.bss(0x80)))。 通过多次添加函数调用,最后使用str将整个rop chain dump出来就可以了。
  • call(resolvable, arguments=()) : 添加一个调用,resolvable可以是一个符号,也可以是一个int型地址,注意后面的参数必须是元组否则会报错,即使只有一个参数也要写成元组的形式(在后面加上一个逗号)
  • chain() : 返回当前的字节序列,即payload
  • dump() : 直观地展示出当前的rop chain
  • raw() : 在rop chain中加上一个整数或字符串
  • search(move=0, regs=None, order=’size’) : 按特定条件搜索gadget,没仔细研究过
  • unresolve(value) : 给出一个地址,反解析出符号

参考于

pwntools
GallopsledUpdated Feb 25, 2023
Exploit利器--Pwntools
pwntools是由Gallopsled开发的一款专用于CTF Exploit的Python库,包含了本地执行、远程连接读写、shellcode生成、ROP链的构建、ELF解析、符号泄漏等众多强大功能,可以说把exploit繁琐的过程变得简单起来。这里简单介绍一下它的使用。 Pwntools的主页在 pwntools.com,Github项目地址为 pwntools,可以下载到最新的源码用python进行安装。也可以简单地使用 pip install pwntools 进行安装。 虽然Pwntools大部分的功能都是纯python实现的可以直接使用,其还是依赖一些外部的python库例如capstone等,如果使用pip安装的话可以发现安装了不少依赖的库。而如果需要使用其ROP链的构建功能的话,则需要安装libcapstone这个非Python的库,这个可以到 capstone-download去下载,不过需要注意的一点就是要保持python的capstone与这个libcapstone的版本一致否则可能出现API Version冲突的问题,在pip安装时可以指定其版本 pip install capstone==3.0.4 一般使用的话可以直接用 from pwn import * 将所有的模块导入到当前namespace,这条语句还会帮你把os,sys等常用的系统库导入。 常用的模块有下面几个: asm : 汇编与反汇编,支持x86/x64/arm/mips/powerpc等基本上所有的主流平台 dynelf : 用于远程符号泄漏,需要提供leak方法 elf : 对elf文件进行操作 gdb : 配合gdb进行调试 memleak : 用于内存泄漏 shellcraft : shellcode的生成器 tubes : 包括tubes.sock, tubes.process, tubes.ssh, tubes.serialtube,分别适用于不同场景的PIPE utils : 一些实用的小功能,例如CRC计算,cyclic pattern等 这应该是exploit最为基础的部分了,对于一次攻击而言前提就是与目标服务器或者程序进行交互,这里就可以使用remote(address, port)产生一个远程的socket然后就可以读写了 同样地,使用process可以打开一个本地程序并进行交互 同时,也可以使用listen来开启一个本地的监听端口 无论哪种PIPE都是继承tube而来,可以用于读写函数主要有: interactive() : 直接进行交互,相当于回到shell的模式,在取得shell之后使用 recv(numb=4096, timeout=default) : 接收指定字节 recvall() : 一直接收直到EOF recvline(keepends=True) : 接收一行,keepends为是否保留行尾的\n recvuntil(delims, drop=False) : 一直读到delims的pattern出现为止 recvrepeat(timeout=default) : 持续接受直到EOF或timeout send(data) : 发送数据 sendline(data) : 发送一行数据,相当于在数据末尾加\n 这些看官们应该都很熟悉了,关于它们的用法也就不再赘述。 使用asm来进行汇编 可以使用context来指定cpu类型以及操作系统 使用disasm进行反汇编 注意,asm需要binutils中的as工具辅助,如果是不同于本机平台的其他平台的汇编,例如在我的x86机器上进行mips的汇编就会出现as工具未找到的情况,这时候需要安装其他平台的cross-binutils。 使用shellcraft可以生成对应的架构的shellcode代码,直接使用链式调用的方法就可以得到 如上所示,如果需要在64位的Linux上执行/bin/sh就可以使用 shellcraft.amd64.linux.sh() ,配合asm函数就能够得到最终的pyaload了。 除了直接执行sh之外,还可以进行其它的一些常用操作例如提权、反向连接等等。 这个还是挺实用的,在进行elf文件逆向的时候,总是需要对各个符号的地址进行分析,elf模块提供了一种便捷的方法能够迅速的得到文件内函数的地址,plt位置以及got表的位置。 同样,也可以打开一个libc.so来解析其中system的位置:) 甚至可以修改一个ELF的代码 ELF模块在文档里好像还没有写的样子,不过可以从源码中看到一些可用的函数 asm(address, assembly) : ...
Exploit利器--Pwntools
 
上一篇
2022网鼎杯(青龙组)WriteUp
下一篇
pwn环境终极指南