히공

코드엔진 - basic 20 본문

reverse engineering/CodeEngn

코드엔진 - basic 20

heegong 2020. 10. 19. 10:02
728x90

20번을 풀어보겠습니다.

 

드디어 마지막 문제입니다.

 

 

 

 

 

 

 

이러한 문제입니다.

 

 

 

 

 

 

 

실행했을때 이런식으로 나옵니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

x32dbg로 열었습니다.

 

 

 

 

 

 

 

파일을 만드는 부분인것 같습니다.

 

cmp eax, 0xffffffff로 eax를 비교하는데

eax가 0xffffffff가 아니여야 합니다.

 

그래야 ReadFile을 호출하는 부분으로 갈 수 있습니다.

 

 

 

 

 

여기 나와있는 파일이름을 만들어보았습니다.

 

 

 

 

 

다시실행 후 CreateFileA를 실행해보았습니다.

 

 0xffffffff가 아닙니다.

 

1단계는 성공했습니다.

 

 

이제 저 파일에 아무 글자나 써보겠습니다.

 

 

 

 

 

 

HxD로 1234를 넣었습니다.

 

 

 

 

 

0x402008에 1234 가 들어갑니다.

그리고 cmp로 [4021A0] 와 0x12를 비교합니다.

 

저 값을 살펴보니 4였습니다.

 

 

 

 

인자들을  확인해보겠습니다.

docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-readfile

 

ReadFile function (fileapi.h) - Win32 apps

Reads data from the specified file or input/output (I/O) device. Reads occur at the position specified by the file pointer if supported by the device.

docs.microsoft.com

 

 

 

 

저 4021A0은 byte가 들어갑니다.

 

1234가 총 4바이트여서 0x4021A0은 4입니다.

 

그러면 글자수를 0x12(10진수로 18) 로 맞추겠습니다.

 

 

 

 

 

 

 

이런식으로 맞춰줍시다.

 

 

 

 

 

 

이 부분을 통과했습니다!!

 

 

 

 

 

 

이제 bp를 건 함수를 분석해봅시다.

 

 

 

 

 

 

이런식으로 됩니다.

 

 

 

파이썬 코드로 나타내었습니다.

 

 

 

 

 

그리고 나서

1. 0x4020f9와 0x12345678하고 xor연산

2. 바뀐 문자열 push

3. 0x40133C 호출

 

 

40133C를 분석하겠습니다.

 

 

 

 

뒤에 바뀌지 않은 문자열 efgh를 eax에 넣습니다.

 

 

 

현재 eax값

 

 

 

 

 

 

그 다음

eax와 [0x4020f9]를 비교합니다.

 

 

 

 

그러면 key파일에 efgh를 0x62533412로 수정해보겠습니다.  (리틀엔디안)

 

 

 

 

 

 

그리고 f9를 눌러 실행해보겠습니다.

 

 

 

 

 

성공입니다.

 

이 문제는 정답이 엄청 나올 수 있으므로 

무조건 정답이 나오게 key값을 바꿔주는 파일을 만들어보겠습니다.

 

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import string
import random
 
 
print('key값을 바꾸겠습니다.')
 
while True:
    key = list(random.choice(string.ascii_letters + string.digits) for _ in range(14))
    later_key = key[::]
 
 
    # 처음 분석한 루틴
    p_4020f9 = 0
    bl = 0x41
    ecx = 0
    for i in range(14):
        al = ord(key[i]) ^ bl
        key[i] = chr(al)
        bl += 1
        ecx += 1
        p_4020f9 += al
    p_4020f9 = p_4020f9 ^ 0x12345678
 
 
 
    # key에 추가
    for_p = hex(p_4020f9).replace('0x','')
 
    ls = []
    for i in range(0,len(for_p),2):
        ls.append(chr(int(for_p[i:i+2],16)))
 
    later_key.extend(ls[::-1])    # 리틀엔디안 이니깐 반대로 뒤집기
 
 
    f = open('CRACKME3.KEY','w')
    try:
        f.write(''.join(later_key))
        f.close()
        break
    except UnicodeEncodeError:
        f.close()
        continue
 
print("완료입니다.")
cs

 

 

 

 

BASIC 풀이를 전부 했습니다!!

'reverse engineering > CodeEngn' 카테고리의 다른 글

코드엔진 - advance 2  (0) 2021.02.04
코드엔진 - advance 1  (0) 2021.01.04
코드엔진 - basic 19  (0) 2020.10.18
코드엔진 - basic 18  (0) 2020.10.17
코드엔진 - basic 17  (2) 2020.10.10
Comments