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

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

Mogen

Red Team
27.08.2019
314
610
BIT
5
Здравствуйте!

Хочется знать, как улучшить код, написанный на 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]) +...

Pernat1y

Red Team
05.04.2018
1 443
135
BIT
0
Я не гуру питона, поэтому могу ошибаться, но:

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()
 
Последнее редактирование:

Mogen

Red Team
27.08.2019
314
610
BIT
5
Я не гуру питона, поэтому могу ошибаться, но:

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'ах буду стараться лучше.
 

Andr0G3n

One Level
12.04.2020
6
2
BIT
0
А ключ должен находится ? Если он не найдётся, что делать? Неопределённость какая-то
Я б переписал генерацию ключа вот в таком варианте:
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()
 
Решение
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!