11
Подписаться
503
Подписчики

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

Создано: 2023-03-14 23:25:45, Обновлено: 2024-11-29 18:57:29
comments   6
hits   1558

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

Я видел в группе экспертов по соседству, что OKX проводит мероприятие по разгадыванию тайн, посвященное Всемирному дню числа Пи. Тема следующая:

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

Будучи старшим программистом, увидев эту новость, я слегка приподнял уголки рта, открыл свой MacBook Pro и начал работать, не говоря ни слова.

анализировать

Чиновники заявили, что в части рисунка, которая перекрывается с числом пи, находится 61 бит ключа. Как мы все знаем, длина закрытого ключа составляет 32 байта, что преобразуется в шестнадцатеричное число, которое составляет 64 бита плюс префикс 0x , всего 66 бит, 61 бит уже есть. На первый взгляд, “0X” в первой строке рисунка - это, очевидно, не пи, а префикс закрытого ключа. Затем идут 5 цифр (0123456789ABCDEF) Случайное расположение этих символов. Нет никаких проблем с перебором, так что давайте начнем

Используйте встроенные инструменты Mac для простого повышения резкости и настройки цвета.

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

Выглядит это так. Mac может автоматически распознавать символы на картинке. Давайте скопируем их напрямую:

3.141592653589793230X1D64338
А694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B3
81284
•探索,
038
永无止境
027
493
05%
0128
4756482337867831731712019091
47D9E56692346034861045432664
8213393607743749141273724587
006606315588174881BEEA209628
2925409192744436789259036001

Это определенно не может быть использовано. Давайте вручную исправим это. Мы отмечаем неподтвержденные, которые заблокированы изображением, как*Нет. Не уверен, скажу позже. Другие, которые блокируются изображением, можно оценить, наблюдая за формой штриха других шрифтов. В это время мы используем Python для вычисления разницы между ними. То же самое используется_’ означает, что только разные

img = '''
3.141592653589793230X1D64338
A694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B32594081284811174502841027
0193**2*D2299964462294895493
0381960EFC8103F9365933446128
4756482337867831731712019091
47D9E56692346034861045432664
82133936077A3749141273724587
006606315588174881BEEA209628
2925409192744436789259036001
'''
# 真实圆周率
real='''
3.14159265358979323846264338
3279502884197169399375105820
9749445923078164062862089986
2803482534211706798214808651
3282306647093844609550582231
7253594081284811174502841027
0193852110555964462294895493
0381964428810975665933446128
4756482337867831652712019091
4564856692346034861045432664
8213393607260249141273724587
0066063155881748815209209628
2925409171536436789259036001
'''

items = img.strip().split('\n')
diffStr = ''
for pos, line in enumerate(real.strip().split('\n')):
    for i, c in enumerate(line):
        imgLine = list(items[pos])
        if line[i] == imgLine[i]:
            imgLine[i] = '_'
        else:
            diffStr += imgLine[i]
        items[pos] = ''.join(imgLine)
print('\n'.join(items))
print(diffStr, 'Len:', len(diffStr))

Результаты исполнения следующие:

___________________0X1D_____
A694________________________
____25E1____________________
____3DB0________4099________
___________ED42_____________
8B32________________________
____**_*D2299_______________
______0EFC___3F93___________
________________731_________
_7D9E_______________________
__________7A37______________
__________________BEEA______
________92744_______________
0X1DA69425E13DB04099ED428B32***D22990EFC3F937317D9E7A37BEEA92744 Len: 64

Есть 3 лишних цифры, и есть ровно 3 неопределенных. Давайте попробуем их удалить, потому что после их удаления все остальные 61 цифра в порядке. Сохраняются только самые определенные различия, а окончательный префикс выглядит следующим образом:

0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744

Далее нам все еще нужно использовать Python, чтобы яростно поднять баланс в цепочке OK и сравнить, какой закрытый ключ имеет баланс. Фактически, вы также можете сначала выбрать открытый ключ с переводом 314USDT, что быстрее. Согласно официальному сайту , осталось еще немного газа. Просто проверьте баланс напрямую. Код запутанный.

import sys
import web3,time,logging
from eth_account import Account
from web3 import Web3
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')
w3 = Web3(Web3.HTTPProvider("https://exchainrpc.okex.org"))
logging.info(w3.clientVersion)
found = None

def get_balance_gas(key):
    global found
    _counter += 1
    address = Account.from_key(key).address
    logging.info('fetch address %s %s' % (found, address))
    while True:
        try:
            balance = w3.eth.get_balance(address)
            break
        except:
            logging.warning(traceback.format_exc())
            time.sleep(1)
            continue
    if balance != 0:
        found = key
        raise BaseException('Found balance: %s %s' % (address, balance))
    return balance

from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=50)
keys = []
prefix = '1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744'
# 无所谓优化算法了, 争分夺秒跑密钥
ch = '0123456789ABCDEF'
for a in range(0, 16):
    for b in range(0, 16):
        for c in range(0, 16):
            for d in range(0, 16):
                for e in range(0, 16):
                    keys.append("0x"+prefix+ch[a]+ch[b]+ch[c]+ch[d]+ch[e])
print('all keys:', len(keys))
tasks = [None for t in keys]
for idx, key in enumerate(keys):
    tasks[idx] = executor.submit(get_balance_gas, key)
for t in tasks:
    t.result()
    

Вы видите, что его нужно пройти 1048576 раз. Использование многопоточности намного быстрее. Запустите его на одном из моих серверов.

2023-03-15 00:20:19,491 exchain-v1.6.8.5
all keys: 1048576
2023-03-15 00:20:20,372 fetch address None 0xc20C41f06F2428a0FD84ef03Ec6960992F5f8016
2023-03-15 00:20:20,473 fetch address None 0xcFa87ee54bc1c14c09a3AB3f41640bBab5C5480a
2023-03-15 00:20:20,483 fetch address None 0x126E922652f8B276F231D0eCA94d98685a26a45D
以下省略......

С нетерпением жду~~~~, плохие новости, до выхода из стратегии результата нет, все отображаемые значения - None

Внезапный поворот событий

Так быть не должно. Я не мог понять. Я начал читать обсуждения в Twitter и обнаружил, что все следовали тем же шагам, что и я. Но странность заключалась в том, что никто не сказал, что расшифровка прошла успешно , и чиновник еще не объявил об этом. Правильные первые 61 цифра. В это время странный ответ привлек мое внимание, потому что в середине была разницаD2299Я уверен, что возражений нет, но он также выглядит очень уверенным в себе.

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

Но 61-я цифра, которую дал этот человек, — D2290. Он также сказал, что тщательно проверил ее. Это неважно. Давайте попытаем счастья. В любом случае, это пустая трата электроэнергии.

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

С трудом я нашел еще нескольких человек, которые оставили сообщения о том, что нашли 61 человека, и все они казались очень уверенными.

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

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

prefixs =[
'1DA69425E13DB04099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B320D2290EFC3F937317D9E7A37BEEA92744',
'1DA694255E3DB040990ED428B3208890EFC3F937317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B3202299EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB01099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744',
]

На самом деле, новых комментариев стало больше. Значение PI одного брата отличается от моего. Это удивительно. Давайте сначала запустим их. Я не верю своим глазам. Это действительно работает. Это означает, что один из префиксов выше правильный. Это не научно. Закрытый ключ:

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

Его номер D229, но на картинке четко видно D2299, и после 731 стоит 7, но у него их два. Но оказалось, что это были правильные 61 цифры. Я не знаю, как он это вычислил. Мне очень любопытно, но я не сомневаюсь в своей собственной операции. Я видел в комментариях, что официальная служба поддержки клиентов сказала, что есть еще один версия числа пи. Я невежественен. Знания, полученные и современное понимание вселенной людьми, иррациональное число пи может представлять бесконечность вселенной, и его десятичная часть никогда не повторится и не закончится. Вы можете думать об этом как о UUID вселенной, в которой вы находитесь. Если есть другие версии, возможно, из параллельного мира.

Вот ответ службы поддержки клиентов после того, как другой старший брат выразил сомнения:

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

Это расширение знаний.

Код перевода монет Web3

Наконец, вот код для перевода бонуса. На этот раз я напрямую использовал функцию Web3 платформы FMZ. Я просто установил адрес цепочки на OKC. При добавлении закрытого ключа на биржу это не имеет значения. Затем Я могу сделать это в две строки. Выполнить в режиме отладчика

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

доказывать

Взломанный адрес открытого ключа

>>> from eth_account import Account
>>> Account.from_key('0x1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155').address
'0x0bd08825e05e540C9508961a32E58D14da47275A'

Просмотреть ссылку: https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a

TX после того, как я его убрал: https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c

Вы можете видеть, что адрес получателя

0x25f0a126be95f437ee71d7c4de725567c5f6c731

Как взломать приз OKX «Загадка с закрытым ключом» ко Всемирному дню числа Пи (с полным кодом)

Чтобы доказать, что этот адрес принадлежит мне, я использовал адрес получателя для перевода денег на адрес черной дыры.

https://www.okx.com/cn/explorer/okc/tx/0xc32b5e299064456af3eb67c34a3b153f74a1bd18a31429052e3e3c5614bcdb6e

Адрес черной дыры: 0x0000000000000000005757572e464d5a2e434f4d

Этот адрес черной дыры содержит URL, который после декодирования

~ % python -c 'print(bytes.fromhex("0000000000000000005757572e464d5a2e434f4d"))'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00WWW.FMZ.COM'

Послесловие

Это конец. Оглядываясь назад, я благодарен за свои знания, накопленные за эти годы. Иначе скорость взлома была бы не такой высокой, и другие бы меня опередили. Я уверен, что в официальной диаграмме есть ошибка. В любом случае, мне повезло, что я разгадал ответ до того, как он был обнародован. Надеюсь, OKX будет более строгим в следующий раз, когда будет проводить подобные мероприятия.