옆집 전문가 모임에서 OKX에서 월드 파이 데이 미스터리 풀기 이벤트를 진행 중이라는 것을 봤는데, 테마는 다음과 같습니다.
선임 프로그래머로서, 뉴스를 보고 난 후, 저는 입가가 살짝 올라가더니 아무 말 없이 맥북 프로를 열고 일을 시작했습니다.
분석하다
공무원들은 파이와 겹치는 그림 부분에 키가 61비트라고 말했습니다. 우리가 알다시피, 개인 키의 길이는 32바이트이고, 64비트에 0x 접두사를 더한 16진수로 변환됩니다. , 총 66비트, 61비트가 이미 존재합니다. 첫눈에 보면 그림의 첫 번째 줄에 있는 “0X”는 분명히 pi가 아니라 개인 키의 접두사입니다. 그 다음에는 5자리(0123456789ABCDEF)가 있습니다. 이러한 문자의 무작위 배열입니다. 무차별 대입 공격에는 문제가 없으므로 시작해 보겠습니다.
Mac의 내장 도구를 사용하여 색상을 간단히 선명하게 하고 조정하세요.
이렇게 보입니다. 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개의 추가 숫자가 있습니다. 제거하고 시도해 보겠습니다. 왜냐하면 제거한 후 나머지 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()
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
이의가 없을 거라고 확신합니다. 하지만 그는 매우 자신감이 있는 듯합니다.
하지만 이 사람이 준 61번째 숫자는 D2290입니다. 그는 또한 그것을 주의 깊게 확인했다고 말했습니다. 중요하지 않습니다. 운을 시험해 봅시다. 어차피 전기 낭비입니다.
노력하는 마음으로, 저는 61명을 찾았다는 메시지를 남긴 여러 사람을 찾았는데, 그들은 모두 자신감이 넘치는 듯했습니다.
저는 주석 영역에서 발견된 모든 접두사를 수집하여 이전 코드로 탐색했습니다. 기본 코드는 크게 바뀌지 않았으므로 다시 붙여 넣지 않겠습니다.
prefixs =[
'1DA69425E13DB04099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B320D2290EFC3F937317D9E7A37BEEA92744',
'1DA694255E3DB040990ED428B3208890EFC3F937317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B3202299EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB01099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744',
]
사실 새로운 댓글이 더 많아요. 한 형의 PI 값이 내 것과 달라요. 정말 놀랍네요. 먼저 이것들을 실행해 보겠습니다. 제 눈을 믿을 수 없습니다. 실제로 작동합니다. 즉, 위의 접두사 중 하나가 정확하다는 뜻입니다. 이것은 과학적이지 않습니다. 개인 키는 다음과 같습니다.
1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155
그의 번호는 D229입니다만, 그림에서는 D2299가 명확히 나와 있고, 731 뒤에 7이 있는데, 그는 두 개를 가지고 있습니다. 하지만 그것은 올바른 61자리로 밝혀졌습니다. 그가 어떻게 계산했는지는 모르겠습니다. 저는 매우 궁금하지만 제 작업을 의심하지 않습니다. 공식 고객 서비스에서 다른 버전이 있다고 댓글에서 보았습니다. 파이의. 나는 무지합니다. 인간이 배운 지식과 현재 우주에 대한 이해, 무리수 파이는 우주의 무한대를 나타낼 수 있으며, 소수 부분은 결코 반복되거나 끝나지 않습니다. UUID라고 생각할 수 있습니다. 당신이 있는 우주의. 다른 버전이 있다면, 아마도 평행 세계의 것일 수도 있습니다.
이는 또 다른 빅브라더가 의심을 표시한 후의 고객 서비스 대응입니다.
지식의 증가입니다.
Web3 코인 전송 코드
마지막으로 보너스를 전송하는 코드가 있습니다. 이번에는 FMZ 플랫폼의 Web3 기능을 직접 사용했습니다. 체인 주소를 OKC로 설정했습니다. 거래소에 개인 키를 추가할 때는 어차피 상관없습니다. 그런 다음 두 줄로 할 수 있어요. 디버거 모드에서 실행
입증하다
크랙된 공개 키 주소
>>> 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
이 주소가 내 주소라는 것을 증명하기 위해 수신자 주소를 사용하여 블랙홀 주소로 돈을 이체했습니다.
블랙홀 주소는
0x0000000000000000005757572e464d5a2e434f4d
이 블랙홀 주소에는 디코딩 후 URL이 포함되어 있습니다.
~ % python -c 'print(bytes.fromhex("0000000000000000005757572e464d5a2e434f4d"))'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00WWW.FMZ.COM'
후기
이것이 끝입니다. 돌이켜보면, 저는 수년간 축적된 지식에 감사합니다. 그렇지 않았다면, 크래킹 속도가 그렇게 빠르지 않았을 것이고, 다른 사람들이 저보다 앞서 나갔을 것입니다. 공식 다이어그램에 오류가 있을 거라고 확신합니다. 어쨌든, 공개되기 전에 답을 알아낸 건 행운입니다. OKX가 다음에 비슷한 이벤트를 열 때 더 엄격해지기를 바랍니다.