[Tools]Pwn中用于远程交互的库函数总结

Pwn中用于远程交互的库函数总结

在比赛当中经常会与端口应用交互的场景,

首先是PWN库的安装和使用,

参考资料:pwntools — pwntools 4.9.0dev documentation

安装

pip install --upgrade pwntools

导入

from pwn import *

简单IO函数

进程创建
p = process('/bin/sh')
# 还可以在已经建立的连接,如IP连接和SSH连接上创建进程
# 关闭进程
p.close()
远程连接主机端口
host = remote('ip', port, typ='协议\协议簇') # 可参考的协议或协议簇,udp、ipv4等
远程侦听
client = listen(port).wait_for_connection()
创建交互Shell
host.interactive()
# 当然,你也可以与本地的shell连接
sh = process('/bin/sh')
sh.interactive()
接收操作
#  接收n字节数据,一定时间后超时
bytes = host.recv(n, timeout = default)
# 换行结束接收,keepends=False不保留结尾的\n
bytes = host.recvline(keepends=True)
# 接收直至分隔符delim
bytes = host.recvuntil(delim,drop=Fasle)
# 接收模式匹配的字符串
bytes = host.recvregex(pattern)
# 接收直到超时或EOF
bytes = host.recvrepeat(timeout)
# 接收数据直到EOF
bytes = host.recvall() 
# 清空缓冲区未接收的数据
host.clean()
发送操作
# 发送一段数据
host.send(bytes)
# 发送数据加一个换行
host.sendline(bytes)
SSH连接
# 创建连接
shell = ssh(host='ip', user='root', port=port, password=password)
# 可以在该SSH连接开启进程
s = ssh(host='example.pwnme')
sh = s.process('/bin/sh', env={'PS1':''})
sh.sendline(b'echo Hello; exit')
sh.recvall() # 或者sh.recvline()
输出:b'Hello\n'

脚本示例

针对的是VNCTF2022ezmath

按照逻辑完成Crypto问答题目任务的脚本(无sao操作


from pwn import *
from hashlib import sha256


'''
功能:爆破计算MD5前4位
'''
def figure_puzzle1(puzzle1_l, puzzle1_r):
    '''省略'''
    return XXXX

# 连接远程主机,从目标主机接收一次数据
target = remote('ip', port)
puzzle1 = str(target.recvline())

# 截取问题关键信息,按照对方提供的信息处理,时间充足可以用正则提取
puzzle1_l = puzzle1[18:34]
puzzle1_r = puzzle1[39:103]

# 计算MD5的缺失位
output_of_puzzle1 = figure_puzzle1(puzzle1_l, puzzle1_r)
print(puzzle1_l, puzzle1_r, output_of_puzzle1)

# 向目标主机发送一段信息,但要注意的是,要对bytes类型进行编码(一般默认就是utf8
target.send(bytes(output_of_puzzle1, 'utf-8'))
count = 780

# 循环完成与对方主机的777次连接,完成对方脚本逻辑中的任务,最终获取返回的Flag
while (count):
    count -= 1
    # 输出轮次,作为对人的提醒
    print("----------------"+str(count)+"------------------")
    # 获取第二阶段的谜题,第X个n,使得(2^n-1) % 15 == 0,答案即为它本身*4
    puzzle2plus = str(target.recvline())
    print(puzzle2plus)
    # 初次连接的特殊处理
    if count == 779:
        output_of_puzzle2plus = int(puzzle2plus[40:50]) * 4
    else:
        # 正常处理
        output_of_puzzle2plus = int(puzzle2plus[18:28]) * 4
    target.send(bytes(str(output_of_puzzle2plus), 'utf-8'))
    print(target.recvline())
    # 提高容错率,多获取几次
    if count <= 3:
        print(target.recvline())
        print(target.recvline())
        print(target.recvline())
        print(target.recvline())
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值