当前位置:网站首页>[Tools]Pwn中用于远程交互的库函数总结
[Tools]Pwn中用于远程交互的库函数总结
2022-04-21 08:07:00 【車鈊】
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'
脚本示例
针对的是VNCTF2022的ezmath
按照逻辑完成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())
版权声明
本文为[車鈊]所创,转载请带上原文链接,感谢
https://blog.csdn.net/DARKNOTES/article/details/124282024
边栏推荐
猜你喜欢
随机推荐
WOS开道,微盟为中国SaaS趟新路
How did you spend your day in Shenzhen?
According to the variable name we want to visit
完整版操作过程JETSON安装最新opencv
实验一:数据库的基本操作
根据变量名来访问我们想要的网站
Servlet生命周期
Class loading and class loader overview
综合案例:品优购项目(品优购项目流程,SEO优化,TDK三大标签,代码)后期逐步优化
数据集划分小探
各种数据库连接字符串(EFCore)
Kernel PWN learning (1) -- environment construction
JVM——》常用参数
QBoxSet、QBoxPlotSeries
鸢尾花种类预测--数据集介绍
ASUS good screen 120Hz high refresh rate, opening a new pattern of OLED Market
docker怎么访问宿主中redis服务6379端口
MySQL的卸载安装与设置
Unity clones only 48 cubes
ssm+double 用redis实现三次登录,三次登录失败锁定五分钟









