호그와트

퓨어 알티지 DHA 오메가 3

영웅*^%&$ 2023. 6. 18. 14:15
728x90

#============================================================================#

#============================ARCANE CALCULATOR===============================#

#============================================================================#

import hashlib

from cryptography.fernet import Fernet

import base64

# GLOBALS --v

arcane_loop_trial = True

jump_into_full = False

full_version_code = ""

username_trial = "GOUGH"

bUsername_trial = b"GOUGH"

key_part_static1_trial = "picoCTF{1n_7h3_|<3y_of_"

key_part_dynamic1_trial = "xxxxxxxx"

key_part_static2_trial = "}"

key_full_template_trial = key_part_static1_trial + key_part_dynamic1_trial + key_part_static2_trial

star_db_trial = {

"Alpha Centauri": 4.38,

"Barnard's Star": 5.95,

"Luhman 16": 6.57,

"WISE 0855-0714": 7.17,

"Wolf 359": 7.78,

"Lalande 21185": 8.29,

"UV Ceti": 8.58,

"Sirius": 8.59,

"Ross 154": 9.69,

"Yin Sector CL-Y d127": 9.86,

"Duamta": 9.88,

"Ross 248": 10.37,

"WISE 1506+7027": 10.52,

"Epsilon Eridani": 10.52,

"Lacaille 9352": 10.69,

"Ross 128": 10.94,

"EZ Aquarii": 11.10,

"61 Cygni": 11.37,

"Procyon": 11.41,

"Struve 2398": 11.64,

"Groombridge 34": 11.73,

"Epsilon Indi": 11.80,

"SPF-LF 1": 11.82,

"Tau Ceti": 11.94,

"YZ Ceti": 12.07,

"WISE 0350-5658": 12.09,

"Luyten's Star": 12.39,

"Teegarden's Star": 12.43,

"Kapteyn's Star": 12.76,

"Talta": 12.83,

"Lacaille 8760": 12.88

}

def intro_trial():

print("\n===============================================\n\

Welcome to the Arcane Calculator, " + username_trial + "!\n")

print("This is the trial version of Arcane Calculator.")

print("The full version may be purchased in person near\n\

the galactic center of the Milky Way galaxy. \n\

Available while supplies last!\n\

=====================================================\n\n")

def menu_trial():

print("___Arcane Calculator___\n\n\

Menu:\n\

(a) Estimate Astral Projection Mana Burn\n\

(b) [LOCKED] Estimate Astral Slingshot Approach Vector\n\

(c) Enter License Key\n\

(d) Exit Arcane Calculator")

choice = input("What would you like to do, "+ username_trial +" (a/b/c/d)? ")

 

if not validate_choice(choice):

print("\n\nInvalid choice!\n\n")

return

 

if choice == "a":

estimate_burn()

elif choice == "b":

locked_estimate_vector()

elif choice == "c":

enter_license()

elif choice == "d":

global arcane_loop_trial

arcane_loop_trial = False

print("Bye!")

else:

print("That choice is not valid. Please enter a single, valid \

lowercase letter choice (a/b/c/d).")

def validate_choice(menu_choice):

if menu_choice == "a" or \

menu_choice == "b" or \

menu_choice == "c" or \

menu_choice == "d":

return True

else:

return False

def estimate_burn():

print("\n\nSOL is detected as your nearest star.")

target_system = input("To which system do you want to travel? ")

if target_system in star_db_trial:

ly = star_db_trial[target_system]

mana_cost_low = ly**2

mana_cost_high = ly**3

print("\n"+ target_system +" will cost between "+ str(mana_cost_low) \

+" and "+ str(mana_cost_high) +" stone(s) to project to\n\n")

else:

# TODO : could add option to list known stars

print("\nStar not found.\n\n")

def locked_estimate_vector():

print("\n\nYou must buy the full version of this software to use this \

feature!\n\n")

def enter_license():

user_key = input("\nEnter your license key: ")

user_key = user_key.strip()

global bUsername_trial

 

if check_key(user_key, bUsername_trial):

decrypt_full_version(user_key)

else:

print("\nKey is NOT VALID. Check your data entry.\n\n")

def check_key(key, username_trial):

global key_full_template_trial

if len(key) != len(key_full_template_trial):

return False

else:

# Check static base key part --v

i = 0

for c in key_part_static1_trial:

if key[i] != c:

return False

i += 1

# TODO : test performance on toolbox container

# Check dynamic part --v

if key[i] != hashlib.sha256(username_trial).hexdigest()[4]:

return False

else:

i += 1

if key[i] != hashlib.sha256(username_trial).hexdigest()[5]:

return False

else:

i += 1

if key[i] != hashlib.sha256(username_trial).hexdigest()[3]:

return False

else:

i += 1

if key[i] != hashlib.sha256(username_trial).hexdigest()[6]:

return False

else:

i += 1

if key[i] != hashlib.sha256(username_trial).hexdigest()[2]:

return False

else:

i += 1

if key[i] != hashlib.sha256(username_trial).hexdigest()[7]:

return False

else:

i += 1

if key[i] != hashlib.sha256(username_trial).hexdigest()[1]:

return False

else:

i += 1

if key[i] != hashlib.sha256(username_trial).hexdigest()[8]:

return False

return True

def decrypt_full_version(key_str):

key_base64 = base64.b64encode(key_str.encode())

f = Fernet(key_base64)

try:

with open("keygenme.py", "w") as fout:

global full_version

global full_version_code

full_version_code = f.decrypt(full_version)

fout.write(full_version_code.decode())

global arcane_loop_trial

arcane_loop_trial = False

global jump_into_full

jump_into_full = True

print("\nFull version written to 'keygenme.py'.\n\n"+ \

"Exiting trial version...")

except FileExistsError:

sys.stderr.write("Full version of keygenme NOT written to disk, "+ \

"ERROR: 'keygenme.py' file already exists.\n\n"+ \

"ADVICE: If this existing file is not valid, "+ \

"you may try deleting it and entering the "+ \

"license key again. Good luck")

def ui_flow():

intro_trial()

while arcane_loop_trial:

menu_trial()

# Encrypted blob of full version

full_version = \

b"""

gAAAAABgT_nv39GmDRYkPhrc2hba8UHCHnSTHqdFxXNdemW0svN2hYYw-6n56ErD3NrQYQlNL0sfdsGTmvWKxh5gVRGeCv5kNq-l6PpL0Fzzjo1x_E2Jjbw_xWKIwbvd7BRXFQZKnhs2ehcSEacqE(중략)oY6Hw3WwOK_Nnj10sPmWSFSuMPeOBwPEL2M-1tCkbOvilqccCAelhS87qU_fDUKzD68TV1tJIoXEKW4sdwAVGxguEv1BAm4G7LhrH08McB5n3ja5I_3IqkeYdyHaxAXJ-O2thg==

"""

# Enter main loop

ui_flow()

if jump_into_full:

exec(full_version_code)

  1. check_key 함수를 분석하여 키 생성 알고리즘을 이해합니다. 이 함수는 사용자가 입력한 키가 유효한지 확인합니다. 키의 일부는 정적이며, 나머지 부분은 사용자 이름에 대한 SHA256 해시의 특정 문자를 사용하여 동적으로 생성됩니다.
  2. username_trial ("GOUGH")에 대한 SHA256 해시를 계산하고, 이를 사용하여 key_part_dynamic1_trial을 생성합니다. 이 값은 해시의 4, 5, 3, 6, 2, 7, 1, 8번째 문자를 순서대로 사용합니다.
  3. 생성된 동적 키 부분을 정적 키 부분에 결합하여 전체 키를 생성합니다.
  4. 생성된 키를 enter_license 함수에 입력하여 decrypt_full_version 함수를 호출합니다. 이 함수는 입력된 키를 사용하여 full_version 코드를 복호화하고, 이를 keygenme.py 파일에 쓰려고 시도합니다.

import hashlib

import base64

from cryptography.fernet import Fernet

username_trial = "GOUGH"

key_part_static1_trial = "picoCTF{1n_7h3_|<3y_of_"

key_part_static2_trial = "}"

# Calculate SHA256 hash of the username

hash_object = hashlib.sha256(b"GOUGH")

hex_dig = hash_object.hexdigest()

# Generate dynamic part of the key

key_part_dynamic1_trial = hex_dig[4] + hex_dig[5] + hex_dig[3] + hex_dig[6] + hex_dig[2] + hex_dig[7] + hex_dig[1] + hex_dig[8]

# Combine parts to get the full key

key_full = key_part_static1_trial + key_part_dynamic1_trial + key_part_static2_trial

# Convert key to base64

key_base64 = base64.b64encode(key_full.encode())

# Decrypt the full version

f = Fernet(key_base64)

full_version = \

b"""

gAAAAABgT_nv39GmDRYkPhrc2hba8UHCHnSTHqdFxXNdemW0svN2hYYw-6n56ErD3NrQYQlNL0sfdsGTmvWKxh5gVRGeCv5kNq-l6PpL0Fzzjo1x_E2Jjbw_xWKIwbvd7BRXFQZKnhs2ehcSEacqE(중략)oY6Hw3WwOK_Nnj10sPmWSFSuMPeOBwPEL2M-1tCkbOvilqccCAelhS87qU_fDUKzD68TV1tJIoXEKW4sdwAVGxguEv1BAm4G7LhrH08McB5n3ja5I_3IqkeYdyHaxAXJ-O2thg==

"""

full_version_code = f.decrypt(full_version)

#show me what you got

print(key_full)

# Print the decrypted code

print(full_version_code.decode())

이 코드는 암호화된 메시지를 복호화하는 프로세스를 구현하고 있습니다. 복호화에 사용되는 키는 사용자 이름에 기반하여 생성되며, 이 키는 정적 부분과 동적 부분으로 구성됩니다. 정적 부분은 코드에 직접 적혀 있고, 동적 부분은 사용자 이름의 SHA256 해시에서 특정 문자를 추출하여 생성됩니다. 이렇게 생성된 키는 base64로 인코딩되고, 이 인코딩된 키를 사용하여 암호화된 메시지를 복호화합니다.

  1. check_key 함수와 키 생성 알고리즘:

check_key 함수는 코드에 직접적으로 나타나 있지 않지만, 키 생성 알고리즘은 코드에서 확인할 수 있습니다. 키 생성 알고리즘은 다음과 같습니다:

  • 사용자 이름의 SHA256 해시를 계산합니다. 이 해시는 64자리의 16진수 문자열입니다.
  • 이 해시에서 4, 5, 3, 6, 2, 7, 1, 8번째 문자를 추출하여 동적 키 부분을 생성합니다. 이는 8자리의 16진수 문자열입니다.
  • 정적 키 부분과 동적 키 부분을 결합하여 전체 키를 생성합니다.

이 알고리즘은 사용자 이름에 기반한 동적 키 부분을 생성하므로, 각 사용자에 대해 고유한 키를 생성할 수 있습니다.

  1. 이 코드가 나온 과정:

이 코드는 암호화된 메시지를 복호화하는 문제를 해결하기 위해 작성되었습니다. 이 문제는 사용자 이름에 기반한 키를 생성하고, 이 키를 사용하여 암호화된 메시지를 복호화하는 것입니다.

내 visual studio code 에서 직접 가져오다 보니 배경색이랑 글자색이 입혀져 버렸다 @_@

728x90

'호그와트' 카테고리의 다른 글

주식 주식 바운스~ 바운스~  (0) 2023.06.20
rot13  (0) 2023.06.20
쥐를 잡아 미키마우스  (0) 2023.06.16
파벳이 울트라고기 구워 먹을 때  (0) 2023.06.12
GPT4가 분석한 memcpy  (0) 2023.06.08