본문 바로가기
reversing/Crack ME 풀기

Easy KeygenMe

by 코끼리_땃쥐 2023. 3. 8.
반응형

http://reversing.kr/ 사이트의 Easy KeygenMe 입니다.

 

파일을 실행하기전에 ReadME.txt 파일을 읽어보면

시리얼이 5B134977135E7D13 일 경우 이름을 찾아 보라네요

 

 

 

그럼 이제 프로그램을 실행 시켜봅시다.

 

프로그램을 실행시켜보면

Name과 Serial을 입력받습니다.

그후에 Wrong 문자열을 출력하고 프로그램이 종료되었습니다.

 

예상하기에 이름과 시리얼이 틀렸고, Wrong이란 문자열을 출력하고 프로그램이 종료 된것 같습니다.

x64dbg를 이용하여 자세히 확인해보겠습니다.

 

x64dbg 를 켜고 Wrong이란 문자열을 찾아봅니다.

401130 주소에 wrong이 보입니다. 찾아서 따라가봅시다.

 

401118 주소에서 조건 분기를 하는 것을 확인 할 수 있습니다.

특정 조건에 의해서 Crrect ! 와 wrong으로 나뉩니다.

 

특정 조건을 찾기 위해서 일단 Name을 입력하고 스택을 살펴 봅니다.

스택에 방금입력한 Name("abcde")가 입력되었습니다.

 

F8을 눌러 진행을 좀더 해보면 반복문이 나옵니다.

 

 

반복문 에서 이부분을 의 주소값을 계산하여 따라가보면

esp + esi + c = 0019FE04 

esp + ebp + 10 = 0019FE08

 

0019FE04 의 값은 10 20 30 이며

0019FE08 의 값은 61 62 63 64 입니다. (입력한 이름의 데이터)

 

반복문 코드에서 보면 두개의 값을 xor하여 특정위치(esp+74)에 저장되는것을 확인할수 있습니다.

반복문이 끝나고 생성된 예상 Serial

그럼 한번 예상 Serial을 입력하여 확인해봅니다.

 

정상적으로 해결이 된 모습

 

하지만 원하는건 시리얼이 5B134977135E7D13 일 경우 이름을 찾는 것이므로

시리얼키를 가지고 이름을 만드는 코드를 작성해서 찾아 봤습니다.

def n2_To_n10(n2) -> int:
    return int(n2, 2)

def n10_To_n16(n10):
    return hex(n10)
    
def find_name(serial):
    name = ""
    name_data = []
    xor_code = [0x10, 0x20, 0x30]
    serial_count = 0
    count = 0
    for serial_data in serial:
        for idx in range(0,256):
            temp_data = n2_To_n10(bin(idx ^ xor_code[count]))
            if temp_data == serial_data:
                name_data.append(idx)
        serial_count += 1
        if count == 2:
            count = 0
        else:
            count += 1
    for name_ch in name_data:
        name += chr(name_ch)
    return name
    
My_Serial= [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
name = find_name(My_Serial)
print(name)

파이썬 코드를 돌려서 이름을 출력해서 한번 테스트 해봅니다.

파이썬 코드에서 이름이 K3yg3nm3 이 나왔습니다.

 

그럼 Easy KeygenMe 프로그램을 실행시켜서 확인합니다.

그럼 문제의 정답, 이름은 K3yg3nm3가 맞는것을 확인 할 수 있습니다. 

반응형

'reversing > Crack ME 풀기' 카테고리의 다른 글

caeser  (0) 2023.03.15
hackme reach lvl 9000  (0) 2023.03.14
Easy CrackMe  (0) 2023.03.13

댓글