• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Улучшение Python кода генератора ключа для crackme

ROP

Red Team
27.08.2019
326
667
Здравствуйте!

Хочется знать, как улучшить код, написанный на Python. Давно не писал на python. Многое позабыл.
Генератора ключа для от Касперского.

Код
:

Python:
import random

def gen_key_part():
    num1 = str(random.randint(0, 9))
    num2 = str(random.randint(0, 9))
    num3 = str(random.randint(0, 9))
    num4 = str(random.randint(0, 9))

    # Генерация части ключа
    final = num1 + num2 + num3 + num4
    return final

def sum_ord(key_part):
    num1 = key_part[0]
    num2 = key_part[1]
    num3 = key_part[2]
    num4 = key_part[3]

    # Алгорит сложения в crackme
    sum = ord(num1) + ord(num2) + ord(num3) + ord(num4) + ord(num4) + ord(num4)
    sum_final = ord(num4) + sum - 336
    return sum_final

def shr(key):
    print(key)
    a = key[0:4]
    b = key[5:9]
    c = key[10:14]
    d = key[15:19]

    # Алгоритм сдвига по битам в crackme
    x = sum_ord(a) + sum_ord(b) + sum_ord(c) + sum_ord(d)
    x = x >> 2
    return x

def check_key(key):
    i = 0
    while i != 4:
        first = 0 + i
        second = 5 + i
        third = 10 + i
        four = 15 + i

        # Проверка ключа
        if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):
            return False
        if int(key[first]) == int(key[second]):
            return False
        if int(key[second]) == int(key[third]):
            return False
        if int(key[third]) == int(key[four]):
            return False
        i += 1

def generate_key():
    key = gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() # Генерация ключа

    # Проверяем ключ и печатаем true или false
    n = 1
    while n != 9999:
        if check_key(key) == False:
            key = gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part()
            print('false')
        else:
            print('True key ' + key)
            break


generate_key()
 
Решение
А ключ должен находится ? Если он не найдётся, что делать? Неопределённость какая-то
Я б переписал генерацию ключа вот в таком варианте:
Python:
def gen_key():
    digs = string.digits
    return '-'.join((''.join(random.choice(digs) for _ in range(4)))  for _ in range(4))
Разложение ключа на части можно сделать при помощи split, разложение на цифры составляющей ключа list.
В целом получается где-то так:
Python:
import random
import string


def gen_key():
    digs = string.digits
    return '-'.join((''.join(random.choice(digs) for _ in range(4))) for _ in range(4))

def sum_ord(key_part):
    nums = list(key_part)
    # Алгоритм сложения в crackme
    sum = ord(nums[0]) + ord(nums[1]) + ord(nums[2]) + ord(nums[3])*3
    return ord(nums[3]) +...
Я не гуру питона, поэтому могу ошибаться, но:

if shr(key) not in [sum_ord(key[0:4]), sum_ord(key[5:9]), sum_ord(key[10:14]), sum_ord(key[15:19])]:
вместо
if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):

Это
if int(key[first]) == int(key[second]):
можно заменить этим:
if key[first] == key[second]:

if not check_key(key):
вместо
if check_key(key) == False:
или, что ещё лучше, поменять на if check_key(key):

Проверки можно в одну собрать:
if key[first] == key[second] or key[second] == key[third] or key[third] == key[four]:

Ну и довольно странный алгоритм брутфорса в целом - рандом вместо последовательного перебора.

Python:
import random

def gen_key_part():
    num1 = str(random.randint(0, 9))
    num2 = str(random.randint(0, 9))
    num3 = str(random.randint(0, 9))
    num4 = str(random.randint(0, 9))

    # Генерация части ключа
    final = num1 + num2 + num3 + num4
    return final


def sum_ord(key_part):
    num1 = key_part[0]
    num2 = key_part[1]
    num3 = key_part[2]
    num4 = key_part[3]

    # Алгорит сложения в crackme
    sum = ord(num1) + ord(num2) + ord(num3) + ord(num4) + ord(num4) + ord(num4)
    sum_final = ord(num4) + sum - 336
    return sum_final


def shr(key):
    print(key)
    a = key[0:4]
    b = key[5:9]
    c = key[10:14]
    d = key[15:19]

    # Алгоритм сдвига по битам в crackme
    x = sum_ord(a) + sum_ord(b) + sum_ord(c) + sum_ord(d)
    x = x >> 2
    return x


def check_key(key):
    i = 0
    while i != 4:
        first = i
        second = 5 + i
        third = 10 + i
        four = 15 + i

        # Проверка ключа
        if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):
            i += 1
            continue
        if key[first] == key[second] or key[second] == key[third] or key[third] == key[four]:
            i += 1
            continue
        else:
            return True


def generate_key():
    # Проверяем ключ и печатаем true или false
    n = 1
    while n != 9999:
        key = f'{gen_key_part()}-{gen_key_part()}-{gen_key_part()}-{gen_key_part()}'  # Генерация ключа
        if check_key(key):
            print('True key ' + key)
            break
        else:
            print(key)
            print('false')


generate_key()
 
Последнее редактирование:
Я не гуру питона, поэтому могу ошибаться, но:

if shr(key) not in [sum_ord(key[0:4]), sum_ord(key[5:9]), sum_ord(key[10:14]), sum_ord(key[15:19])]:
вместо
if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):

Это
if int(key[first]) == int(key[second]):
можно заменить этим:
if key[first] == key[second]:

if not check_key(key):
вместо
if check_key(key) == False:
или, что ещё лучше, поменять на if check_key(key):

Проверки можно в одну собрать:
if key[first] == key[second] or key[second] == key[third] or key[third] == key[four]:

Ну и довольно странный алгоритм брутфорса в целом - рандом вместо последовательного перебора.

Python:
import random

def gen_key_part():
    num1 = str(random.randint(0, 9))
    num2 = str(random.randint(0, 9))
    num3 = str(random.randint(0, 9))
    num4 = str(random.randint(0, 9))

    # Генерация части ключа
    final = num1 + num2 + num3 + num4
    return final


def sum_ord(key_part):
    num1 = key_part[0]
    num2 = key_part[1]
    num3 = key_part[2]
    num4 = key_part[3]

    # Алгорит сложения в crackme
    sum = ord(num1) + ord(num2) + ord(num3) + ord(num4) + ord(num4) + ord(num4)
    sum_final = ord(num4) + sum - 336
    return sum_final


def shr(key):
    print(key)
    a = key[0:4]
    b = key[5:9]
    c = key[10:14]
    d = key[15:19]

    # Алгоритм сдвига по битам в crackme
    x = sum_ord(a) + sum_ord(b) + sum_ord(c) + sum_ord(d)
    x = x >> 2
    return x


def check_key(key):
    i = 0
    while i != 4:
        first = i
        second = 5 + i
        third = 10 + i
        four = 15 + i

        # Проверка ключа
        if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):
            i += 1
            continue
        if key[first] == key[second] or key[second] == key[third] or key[third] == key[four]:
            i += 1
            continue
        else:
            return True


def generate_key():
    # Проверяем ключ и печатаем true или false
    n = 1
    while n != 9999:
        key = f'{gen_key_part()}-{gen_key_part()}-{gen_key_part()}-{gen_key_part()}'  # Генерация ключа
        if check_key(key):
            print('True key ' + key)
            break
        else:
            print(key)
            print('false')


generate_key()
Спасибо за указание на мои ошибки :)
В следующих keygen'ах буду стараться лучше.
 
А ключ должен находится ? Если он не найдётся, что делать? Неопределённость какая-то
Я б переписал генерацию ключа вот в таком варианте:
Python:
def gen_key():
    digs = string.digits
    return '-'.join((''.join(random.choice(digs) for _ in range(4)))  for _ in range(4))
Разложение ключа на части можно сделать при помощи split, разложение на цифры составляющей ключа list.
В целом получается где-то так:
Python:
import random
import string


def gen_key():
    digs = string.digits
    return '-'.join((''.join(random.choice(digs) for _ in range(4))) for _ in range(4))

def sum_ord(key_part):
    nums = list(key_part)
    # Алгоритм сложения в crackme
    sum = ord(nums[0]) + ord(nums[1]) + ord(nums[2]) + ord(nums[3])*3
    return ord(nums[3]) + sum - 336

def shr(key):
    subparts = key.split('-')
    # Алгоритм сдвига по битам в crackme
    x = sum_ord(subparts[0]) + sum_ord(subparts[1]) + sum_ord(subparts[2]) + sum_ord(subparts[3])
    x = x >> 2
    return x


def check_key(key):
    i = 0
    while i != 4:
        first = 0 + i
        second = 5 + i
        third = 10 + i
        four = 15 + i
        if shr(key) not in [sum_ord(key[0:4]), sum_ord(key[5:9]), sum_ord(key[10:14]),
                            sum_ord(key[15:19])]:
            return False
        if key[first] == key[second]:
            return False
        if key[second] == key[third]:
            return False
        if key[third] == key[four]:
            return False
        i += 1

def generate_key():
    key = gen_key()
    for n in range(99999):
        if check_key(key):
            print(f'Found key: {key}')
            break
        else:
            print(f'Key {key} is invalid.')
            key = gen_key()

generate_key()
 
Решение
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab