pwntools的基本使用方法

原文链接:https://blog.csdn.net/samlirongsheng/article/details/128189257

以及https://ch4r1l3.github.io/2018/07/19/pwn%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E6%94%BE%E5%BC%83%E7%AC%AC%E5%9B%9B%E7%AB%A0%E2%80%94%E2%80%94pwntools%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/

原来的pwntools应该只能在py2上跑,现在py3应该可以了

pwn的模板脚本

# 导入pwntools库中的所有符号
from pwn import *

# 设置调试模式
debug = 1

# 如果调试模式启用
if debug:
  # 启动本地进程
  p = process('')
  # 如果需要LD_PRELOAD,请取消下面一行的注释,并将''替换为libc文件的路径
  # p = process('', env={'LD_PRELOAD': './libc.so'})
  # 设置日志级别为debug以获取详细的日志输出
  context.log_level = 'debug'
  # 附加gdb到正在运行的进程以进行调试
  gdb.attach(p)

# 如果调试模式未启用
else:
  # 连接到远程服务器
  p = remote('')

# 定义一个函数以接收数据,直到遇到特定的字符串为止
def ru(x):
  return p.recvuntil(x)

# 定义一个函数以向进程发送数据
def se(x):
  p.send(x)

# 将控制权交给用户,以进行与进程的交互操作
p.interactive()

1.pwntools的安装

这里直接默认py3环境下编译安装

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

2.pwntools的函数

大佬可以参考官方文档

https://docs.pwntools.com/en/latest/util/crc.html

1.传输相关

1.接收数据

recv(n)//接收任意数量的字符串
recvline(n)//接收数据直到遇到换行符
recvuntil(delim)//接收数据直到找到分隔符
recvregex(pattern)//接收数据直到满足正则表达式模式
recvrepeat(timeout)//继续继续接收数据,知道发生超时
clean()//丢弃所有的数据

详解

  1. recv(n)
    • 作用:接收任意数量的字符串,长度为n。
    • 示例用法:recv(1024)表示接收最多1024个字符的字符串。
  2. recvline(n)
    • 作用:接收数据直到遇到换行符为止,并且最多接收n个字符。
    • 示例用法:recvline(1024)表示接收一行数据,最多1024个字符。
  3. recvuntil(delim)
    • 作用:接收数据直到找到指定的分隔符为止。
    • 示例用法:recvuntil('\n')表示接收数据直到遇到换行符为止。
  4. recvregex(pattern)
    • 作用:接收数据直到满足指定的正则表达式模式为止。
    • 示例用法:recvregex('[0-9]+')表示接收数据直到出现一个或多个数字为止。
  5. recvrepeat(timeout)
    • 作用:持续接收数据,直到发生超时。
    • 示例用法:recvrepeat(10)表示持续接收数据,如果10秒内没有数据到达,则停止接收。
  6. clean()
    • 作用:丢弃当前接收缓冲区中的所有数据。
    • 示例用法:clean()表示清空接收缓冲区中的所有数据,准备接收新的数据。

这些函数可能是在网络编程中用于处理数据接收的一些辅助函数,它们可以用于构建网络通信的逻辑,例如客户端与服务器之间的数据交换。

2.发送数据

sendline(line)//发送数据的话加上换行符

详解:

sendline(line)

  • 作用:发送一行数据,并在数据末尾添加换行符。
  • 示例用法:sendline("Hello, world!")表示发送一行数据 “Hello, world!”,并在其末尾添加换行符,以表示该行数据传输结束。

3.操作整数

pack(int)//发送一个字长的压缩整数
unpack()//接收并解包一个字长的整数

详解

  1. pack(int)
    • 作用:将整数数据进行打包,通常是将其转换成网络字节序(big-endian或little-endian)以便在网络上传输。
    • 示例用法:pack(42) 表示将整数 42 打包成网络字节序,以便发送到远程主机。
  2. unpack()
    • 作用:接收并解包一个字长的整数数据,将其从网络字节序转换为本地字节序。
    • 示例用法:unpack() 表示接收并解包一个整数,将其从网络字节序转换为本地字节序

4.进程操作

创建一个与进程对话的管道:

即是创建一个进程对象,然后为其指定一个二进制文件的名称

from pwn import *

# 创建一个与进程对话的tube
p = process('./target_binary') # 指定目标二进制文件的名称

# 现在你可以使用p来发送和接收数据
p.sendline('Hello, world!') # 发送一行数据
received_data = p.recvuntil('\n') # 接收数据直到遇到换行符为止

print(received_data.decode()) # 打印接收到的数据

# 最后,关闭tube
p.close()
详解
  • process('./target_binary') 创建一个与名为 target_binary 的目标二进制文件对话的tube
  • p.sendline('Hello, world!') 发送一行数据 “Hello, world!” 到目标进程
  • p.recvuntil('\n') 接收数据,直到遇到换行符为止
  • p.close() 关闭与进程的通信管道
注意byteswarning的报错
image-20240327191801618

一开始pwntools开发的时候是没有python3的,然后python2的str类型就是bytes类型,所以是不需要对这两个数据类型进行额外的处理;但是到了python3之后,str类型是unicode类型了,跟bytes类型有区别了

处理的方式:

b在str类型前面,以此来声明这是bytes类型的数据

5.网络请求

在pwn中,先基于本地文件进行分析,完成攻击脚本后,连接服务器执行脚本获取flag

1.基本模板
from pwn import *

# 使用 pwntools 库中的 remote 函数创建一个与远程主机的通信管道
# 通常用于与远程服务器进行交互
io = remote('', 80) # 在这里应填写远程主机的 IP 地址或主机名,端口号为 80

# 发送一个 HTTP GET 请求到远程主机,请求的内容为根路径 '/'
# 请求头和请求体之间使用 '\r\n\r\n' 来表示请求头的结束
io.send('GET /\r\n\r\n')

# 接收并返回一行来自远程主机的数据
# 这里假设远程主机会响应一个 HTTP 请求,并返回数据
received_data = io.recvline()

# 打印收到的数据
print(received_data)

# 关闭与远程主机的通信管道
io.close()
2.指定不同的请求协议
from pwn import *

# 使用 pwntools 库中的 remote 函数创建一个与远程主机的通信管道
# 通常用于与远程服务器进行交互
# 这里创建了两个与远程主机通信的管道,一个使用 UDP 协议,一个使用 TCP 协议

# 创建一个与 IP 地址为 8.8.8.8 的远程主机通信的 UDP 管道,端口号为 53
dns = remote('8.8.8.8', 53, typ='udp')

# 创建一个与域名为 google.com 的远程主机通信的 TCP 管道,端口号为 80
# 这里使用了 IPv6 地址族进行通信
tcp6 = remote('google.com', 80, fam='ipv6')

6.shell请求

from pwn import *

# 使用 pwntools 库中的 ssh 函数建立一个 SSH 会话
# 这里连接到 bandit0 用户的 bandit.labs.overthewire.org 主机,密码为 bandit0
session = ssh('bandit0', 'bandit.labs.overthewire.org', password='bandit0')

# 在建立的 SSH 会话中启动一个新的 shell 进程
io = session.process('sh', env={"PS1":""})

# 向 shell 进程发送命令 'echo Hello, world!'
io.sendline('echo Hello, world!')

# 接收并返回 shell 进程的输出
received_data = io.recvline()

# 打印 shell 进程输出的内容
print(received_data)

# 关闭 SSH 会话
session.close()

7.串口调试

from pwn import *

# 使用 pwntools 库中的 serialtube 函数创建一个串口通信管道
# 这里将串口设备 '/dev/ttyUSB0' 与波特率 115200 绑定
io = serialtube('/dev/ttyUSB0', baudrate=115200)

2.功能函数

因为主要的打包函数个解包函数存在全局设置:

字节序.位符号等,可以在函数调用时明确的指定他们

1.整数的处理

知识补全

在编程中,处理整数时,特别是在网络通信或者二进制数据处理中,需要考虑到整数的打包(pack)和解包(unpack)

  1. 打包:是指将整数数据转换为特定字节序列的过程,通常用于将整数数据发送到网络或者保存到文件中
  2. 解包:是将收到的字节序列还原为整数数据的过程,通常用于从网络接收数据或者读取文件中的数据
2.函数实现

因为主要的打包函数个解包函数存在全局设置:

字节序.位符号等,可以在函数调用时明确的指定他们

from pwn import *

# 使用 pwntools 库中的 serialtube 函数创建一个串口通信管道
# 这里将串口设备 '/dev/ttyUSB0' 与波特率 115200 绑定
io = serialtube('/dev/ttyUSB0', baudrate=115200)

# 打包一个16位整数(short)并发送
short_value = 12345
io.send(p16(short_value))

# 打包一个32位整数(int)并发送
int_value = 987654321
io.send(p32(int_value))

# 从接收的数据中解析出一个16位整数(short)
received_data = io.recv()
parsed_short = u16(received_data[:2])
print("Received 16-bit integer:", parsed_short)

# 从接收的数据中解析出一个32位整数(int)
parsed_int = u32(received_data[2:])
print("Received 32-bit integer:", parsed_int)

2.文件处理

from pwn import *

# 写入数据到文件
write('filename', 'data')

# 读取整个文件的数据
file_data = read('filename')
print(file_data) # 输出整个文件的内容

# 读取指定字节数的数据
partial_data = read('filename', 1)
print(partial_data) # 输出文件的第一个字节数据

3.程序进程操作

gdb.attach(p)

用于本地程序调试的,gdb可以附加到一个正在运行的程序上面,进行调试

gdb attach一般会停在read的syscall那里,等待输入,因为gdb attach是附加到正在运行的程序上面,而p=process之后,程序停在了等待输入那里,所以gdb附加上去之后就停在read 的syscall那里

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇