리소스 로딩... 로딩...

세계 원주율의 날 OKX의 개인 키 퍼즐 상을 해독하는 방법 (완전 코드와 함께)

저자:발명가 양자화, 창작: 2023-03-14 23:25:45, 업데이트: 2024-11-29 18:57:29

img

다음 주제로 OKX가 세계 원주년 기념일을 열고 있다고 말하는 이웃의 대성당을 보세요.

img

노인 농부로서, 이 소식을 보고, 입끝이 약간 올라가고, 내 맥북 프로를 열고, 아무 말도 하지 않고, 시작했어요.

분석

공식적으로는 61비트 키가 회로율과 겹치는 부분이라고 합니다. 사설 키는 길이가 32바이트라는 것을 모두 알고 있습니다. 즉, 64비트 + 0x 앞자리로 변환된 hex, 총 66비트, 이미 61비트가 있습니다.

Mac 내 장착된 도구로 간단한 모집 색조 처리를 합니다.

img

이런 식으로, 그리고 Mac는 자동으로 사진 속의 문자를 인식합니다. 우리는 바로 이 문자를 복사합니다.

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

이 모양은 확실히 작동하지 않습니다. 우리는 수작업으로 수정했습니다. 그림이 덮여있는 확인되지 않은 모양은 *로 표시되어 있습니다. 다른 글꼴들은 그림에 묶여 있고, 다른 글꼴들의 필름 형태를 관찰함으로써 판단할 수 있습니다. 이 때 우리는 파이썬에 가서 두 글꼴 사이의 차이를 계산합니다.

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

파이썬으로 내려가서 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()
    

10,485,76번의 이동이 필요하다는 것을 알 수 있습니다.

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
以下省略......

불안한 기다림 속에서, 나쁜 소식이 왔고, 탈퇴하기 전까지 전략은 효과가 없었습니다.

정상 회전

아니, 브루스는 몰랐습니다. 그래서 트위터에 가서 토론을 시작했고, 모든 사람들이 저와 비슷한 단계에 도달했다는 것을 알게 되었습니다. 하지만 이상하게도, 아무도 해독에 성공했다고 말하지 않았으며, 공식적인 발표도 없었고, 정확한 61개는 없었습니다.D2299저는 그가 자신감을 가지고 있는 것처럼 보이지만, 그는 자신감을 가지고 있는 것처럼 보이지만,

img

하지만 이 사람은 61자리 D2290을 올렸는데, 그는 그것을 철저히 확인했다고 말했습니다.

img

그리고 시도하는 정신을 가지고, 61개의 다른 사람들의 댓글을 찾았습니다.

img

댓글 구역에서 찾을 수 있는 전자를 모두 수집하고, 딱딱한 코드를 통해 기본 코드가 변경되지 않고, 반복적으로 붙이지 않습니다.

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

사실, 이 후에도 더 많은 새로운 글들이 있습니다. 한 형제의 PI도 저랑 다르죠. 먼저 이 몇 개로 달려보세요. 자신의 눈을 믿을 수 없을 정도로 달려 나가서 앞쪽의 에 있는 것이 맞다는 것을 보여줍니다.

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

여기서는 D229이네요. 하지만 그림은 D2299입니다. 그리고 731 뒤에 7이 있고, 여기서는 2이 있습니다. 그러나 그것이 정확히 61자리라는 것은, 그가 스스로 계산한 방법은 알 수 없지만, 호기심은 넘치지만, 나는 자신의 동작에 의심을 하지 않습니다. 코멘트 부위를 보며 공식 고객들은 원형의 다른 버전이 있다고 말합니다. 저는 외롭습니다. 제가 배운 지식과 인류가 현재 우주에 대한 이해를 통해, 원형의 이 불합리 숫자는 우주의 무한을 나타낼 수 있습니다. 소수 부분은 결코 반복되거나 종료되지 않습니다. 당신은 그를 당신이 이 우주에 있는 UUID로 이해할 수 있습니다. 다른 버전이 있다면, 아마도 평행 세계에서 온 것입니다.

다른 한 큰 형제는 의문을 제기한 후 고객 서비스의 답변을 다음과 같이 표현했습니다.

img

이 모든 것은

웹3 환전 코드

마지막으로 보너스를 이동시키는 코드입니다. 이번에는 FMZ 플랫폼의 Web3 기능을 직접 사용했습니다. 연쇄 주소를 OKC로 설정하면 작동합니다. 개인 키를 추가할 때 그냥 실행하면 작동하지 않습니다. 두 줄이 처리됩니다. 바로 디버깅 도구 모드에서 실행됩니다.

img

증명

해킹된 공개키 주소

>>> 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

img

이 주소가 제 주소라는 것을 증명하기 위해, 저는 이 수신자의 주소를 블랙홀에 송금했습니다.

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

블랙홀의 주소는0x0000000000000000005757572e464d5a2e434f4d

이 블랙홀의 주소는

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

후속 글

여기까지가 끝이고, 다시 돌아와서, 오랜 세월 쌓아온 지식에 감사해야 합니다. 그렇지 않으면 해킹 속도가 더 빠르거나 다른 사람들이 한 발 앞서게 될 것입니다. 공식 그림에 오류가 있는지 확실하지만, 답이 공개되기 전에 해독하는 것이 더 운이 좋아서 OKX가 다음 번에 비슷한 이벤트를 할 때 더 엄격하기를 바랍니다.


관련

더 많은

아빠얼마나 오래 걸리죠?

조니Z는 거칠다!

btcrobot손잡이 능력이 최고입니다

오크 정량화Z는 거칠다!

발명가 양자화20분 정도 걸렸습니다.

발명가 양자화오래된 철도가 왔습니다.