広大なネットワークの中で、私たちのポッドが見つかりました。これはcrackmeです。当然、勉強する必要があります。剖検には以下が必要です。
- アセンブラーのビット
- デバッガー付きロジック(IDA PRO)
Pythonを使っ
このクラックミーはそれほど複雑ではありません。正しいキー8365-5794-2566-0817でキーを生成するためのアルゴリズムを検討してください。IDA Proでは、コードに関するコメントを追加しました。
患者の検査
一見、動作は正常です。.Exe拡張子。梱包されていません。はじめましょう。
それは何ですか?キーが必要です。癒す必要があります:)
患者の剖検
エラーが発生した場合は、「失敗、シリアルが無効です!」という表記がありました。プログラムで使われているところを見てみましょう。
条件分岐の前に1つの関数key_check_funcがあります。彼女を調べてみましょう。
面白い木が見つかりました。
ブレークポイントを設定してデバッグを開始します。
キーの長さは19文字である必要があります。
次に、プログラムは5文字ごとにキーにダッシュが含まれているかどうかを確認し、ループに3回入ります。
ダッシュの存在を確認した後、プログラムはキーブロック(1/4キー)が数字で構成されているかどうかを調べます。コマンドを実行するためにどの桁がコンパイラに転送されたかを理解することを前提としています
add eax, 0FFFFFFD0h
。たとえば、この番号に8(38h)を追加します。結果の数が大きすぎます(10000008h)そして最後は8なので、カットオフされます。残り8。これは私たちが与えた数字です。これは1サイクルで4回発生します。
それで?現在、チェックされたブロックの各桁のコードは互いに追加されていますが、最後の4桁は3回続けて追加されています。結果の金額は再び合計されます。ブロックの最後の桁のコード+結果の量は150hです。結果はr10dに追加されます。このサイクル全体が、キーブロックごとに4回繰り返されます。
この場合、キー8365の最初のブロックの例を考えてみましょう:38h(8)+ 33h(3)+ 36h(6)+ 35h(5)+ 35h(5)+ 35h(5)= 140h + 35h-150h = 25h。 25がr10dに追加され、メモリに書き込まれます。この場所をAとしてマークしましょう。キーの他のブロックの合計も25hに等しくなります。したがって、25h * 4 = 94を掛けます。
次に、2バイトずつ右にビット単位でシフトします。この場所をBとしてマーク
します。A(25h)およびB(25h)として指定された値があります。続いて、これらの数値が比較されます。それらは同じでなければなりません。この操作は、キーブロックごとに発生します。
プログラムが最後に行うことは、ブロック内の番号が類似しているかどうかを確認することです。まず、1番目のブロックの桁が2番目のブロックの桁と比較されます。次に、2ブロックと3ブロックを確認します。最終チェック3ブロックと4ブロック。このすべての検証はすぐには実行されませんが、サイクルで徐々に実行されます。
分析は終了しました。患者は研究されました。
治療の時間
異常なものを使用してキーを生成します。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))
# (1 )
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):
#
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:
# i 1 4.
first = 0 + i
second = 5 + i
third = 10 + i
four = 15 + i
# ( , A B)
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
while True: #
if check_key(key) == False:
#
key = gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part()
print('Checking this key -> ' + key)
else:
#
print('This is the correct key -> ' + key)
break
# ,
if __name__ == "__main__":
generate_key()
ローンチします。
キーを入力してを参照してください。
患者は治癒します。
ご清聴ありがとうございました。ご意見・ご感想をお待ちしております。病気にならないでください。