关于PwnTools的各种汇总

本文详细介绍Pwntools库的使用方法,涵盖从远程连接建立到shellcode生成的全过程,解析关键模块如asm、shellcraft及ELF的运用技巧,适合于渗透测试和二进制漏洞利用的学习。

大致框架

官网的一个简单样例

from pwn import *
#用来导入pwntools模块
context(arch = 'i386', os = 'linux')
#用来设置目标机的信息

r = remote('exploitme.example.com', 31337)
#建立一个远程连接 url或者ip作为地址 指明端口 

r.send(asm(shellcraft.sh()))
r.interactive()

也可以仅仅使用本地文件 调试时方便
r=process(".test")
test即为文件名 这让改变远程和本地十分方便

asm() 函数接受一个字符串作为参数,得到汇编码的机器代码
eg:

>>>asm('mov eax, 0')
'\xb8\x00\x00\x00\x00'

r.send()将shellcode发送到远程连接

最后控制权交给用户r.interactive()这样就可以打开shell了

基本模块

asm : 汇编与反汇编,支持x86/x64/arm/mips/powerpc等基本上所有的主流平台
dynelf: 用于远程符号泄漏,需要提供leak方法
elf: 对elf文件进行操作,可以获取elf文件中的PLT条目和GOT条目信息
gdb : 配合gdb进行调试,设置断点之后便能够在运行过程中直接调用GDB断下,类似于设置为即使调试JIT
memleak : 用于内存泄漏
shellcraft : shellcode的生成器
tubes : 包括tubes.sock, tubes.process, tubes.ssh, tubes.serialtube,分别适用于不同场景的PIPE
utils : 一些实用的小功能,例如CRC计算,cyclic pattern等

Context设置

context是pwntools用来设置环境的功能。 在很多时候,由于二进制文件的情况不同,我们可能需要进行一些环境设置才能够正常运行exp,比如有一些需要进行汇编,但是32的汇编和64的汇编不同,如果不设置context会导致一些问题。

一般来说我们设置context只需要简单的一句话:

context(os='linux', arch='amd64', log_level='debug')

这句话的意思是:
1.os设置系统为linux系统,在完成ctf题目的时候,大多数pwn题目的系统都是linux
2.arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
3.log_level设置日志输出的等级为debug,这句话在调试的时候一般会设置,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误。

数据打包

数据打包,即将整数值转换为32位或者64位地址一样的表示方式,比如0x400010表示为\x10\x00\x40一样,这使得我们构造payload变得很方便

用法:

p32/p64: 打包一个整数 分别打包为32或64位
u32/u64: 解包一个字符串 得到整数

p对应pack 打包 u对应unpack 解包 简单好记

payload = p32(0xdeadbeef) # pack 32 bits numbe


本文节选自 Anciety 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/qq_29343201/article/details/51337025?utm_source=copy


shellcraft 模块

shellcraft模块是shellcode的模块,包含一些生成shellcode的函数。

其中的子模块声明架构,比如shellcraft.arm 是ARM架构的,shellcraft.amd64是AMD64架构,shellcraft.i386是Intel 80386架构的,以及有一个shellcraft.common是所有架构通用的。

有的时候我们需要在写exp的时候用到简单的shellcode,pwntools提供了对简单的shellcode的支持。
首先,常用的,也是最简单的shellcode,即调用/bin/sh可以通过shellcraft得到:

注意,由于各个平台,特别是32位和64位的shellcode不一样,所以最好先设置context。

print(shellcraft.sh()) # 打印出shellcode
print(asm(shellcraft.sh())) # 打印出汇编后的shellcod
asm可以对汇编代码进行汇编,不过pwntools目前的asm实现还有一些缺陷,比如不能支持相对跳转等等,只可以进行简单的汇编操作。如果需要更复杂一些的汇编功能,可以使用keystone-engine项目,这里就不再赘述了。

ELF 模块

这是一个静态模块,即静态加载ELF文件,然后通过相关接口获取一些信息,常用接口有:

  • got 获取指定函数的GOT条目
  • plt 获取指定函数的PLT条目
  • address 获取ELF的基址

cyclic and cyclic_find对于直接的缓冲区溢出,可以很方便的确认再偏移多少可以控制eip

### 如何在Kali Linux中安装和使用pwntools #### 安装pwntools 对于希望在Kali Linux环境中设置pwntools的用户,推荐通过pip安装此库。由于Kali Linux本身已经预装了许多安全工具以及Python环境,这使得安装过程相对简单。 为了确保拥有最新的版本,建议先更新系统的包列表: ```bash sudo apt update && sudo apt upgrade -y ``` 接着可以安装Python依赖项和支持库以便更好地运行pwntools中的组件[^2]: ```bash sudo apt install python3-y ``` 最后一步则是实际安装pwntools,可以通过pip执行如下命令完成操作: ```bash pip3 install pwntools ``` #### 验证安装 验证是否成功安装了`pwntools`,可尝试导入模块并打印其版本号: ```python import pwn print(pwn.__version__) ``` 如果一切正常,则说明已准备好开始探索该框架的功能特性。 #### 使用pwntools进行基本渗透测试 pwntools是一个强大的CTF竞赛辅助工具集合,同时也适用于各种类型的二进制漏洞挖掘与利用场景。这里给出一个简单的例子展示如何连接到远程服务并与之交互。 创建一个新的Python文件(例如test.py),并将以下代码粘贴进去: ```python from pwn import * # 创建一个TCP连接对象指向目标服务器 conn = remote('example.com', 1234) # 向服务器发送数据 conn.sendline(b'Hello') # 接收来自服务器的数据直到遇到换行符\n为止 response = conn.recvuntil(b'\n') log.info(f'Server replied with: {response}') # 关闭连接 conn.close() ``` 上述脚本展示了怎样建立网络连接、传输消息及处理响应的过程。当然,在真实世界的应用案例里可能会涉及到更复杂的逻辑设计和技术细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值