Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

socket.socket

socket 是 Python 标准库中的模块,用于进行 TCP/UDP 连接。

假设服务器地址是 example.com,端口是 1234

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import socket

# 1. 创建一个TCP socket
s = socket.socket()

# 2. 连接远程服务器
# connect的参数要求为一个tupel
s.connect(("example.com", 1234))

# 3. 发送数据(例如发送 "Hello")
# sendall() 默认发送的是 bytes 类型的数据,所以需要 b"" 或者 "".encode
s.sendall(b"Hello\n")

# 4. 接收服务器返回的数据
# 这个参数按需调节就好
data = s.recv(1024) # 一次接收 1024 字节

print("Received:", data.decode())

# 5. 关闭连接
s.close()

如果服务器会发送非常多的内容,则需要一直循环接收服务器发送的消息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import socket

s = socket.socket()

s.connect(("example.com", 1234))

# 持续接收数据,直到服务器关闭连接
data = b"" # 用于存储完整的接收数据

while True:
part = s.recv(1024) # 每次读取 1024 字节
if not part: # 如果 part 为空,表示服务器关闭连接
break
data += part # 累加数据

# 按行分割并逐行打印
lines = data.decode().splitlines()
for line in lines:
print(line)

s.close()

也可以使用time.sleep()来确保收到完整信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import socket
import time

s = socket.socket()

s.connect(("example.com", 1234))

s.sendall(b"Hello\n")

time.sleep(0.5)

data = s.recv(1024)

print("Received:", data.decode())

s.close()

SSL连接

SSL 连接会比普通的TCP连接(socket.socket())多一步加密的步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import socket
import ssl


sock = socket.socket()

# 使用 SSL 加密 socket
s = ssl.wrap_socket(sock)

s.connect(("example.com", 1234))

s.sendall(b"Hello\n")

data = s.recv(1024)

print("Received:", data.decode())

s.close()

pwntools的remote

pwntools 是专门为 Pwn 题目设计的 Python 库,封装了 socket。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pwn import *

# 1. 连接服务器
r = remote("example.com", 1234)

# 2. 发送数据
r.sendline(b"Hello") # 自动添加 '\n'

# 3. 接收数据
response = r.recvall() # 读取所有信息
# response = r.recvline() # 读取一整行
print("Received:", response.decode())

# 4. 关闭连接
r.close()

比起socket,pwn拥有更高级的功能:

1
2
3
4
5
6
7
8
9
10
r.recvuntil(b"\n") #一直读数据,直到匹配特定字符串。
# p.recvuntil(b"Enter your name:")

r.interactive() # 进入交互模式
#比如说在pwn的题目里如果成功打开了shell(system("/bin/sh")),进入交互模式则可以直接手动执行命令。

response = r.recvall()
# recvall会自动读取所有可用数据 直到服务器关闭连接。不再需要像原生 socket 那样手写 while True 循环。

r.sendafter(b"input:", b"1234") # 先等待服务器发送 input:,然后再发送 1234

remote() 里也可以启用 SSL:

1
2
3
4
5
6
7
8
9
10
from pwn import *

r = remote("example.com", 1234, ssl=True) # 开启 SSL 加密

r.sendline(b"Hello") # 自动添加 '\n'

response = r.recvline()
print("Received:", response.decode())

r.close()

总的来说,在做CTF题目时,pwn的remote可以完成所有与服务器的交互。

socket.socket没有的remote有,socket.socket没有的remote也有。