Reversing

[코드엔진] basic 17

BIGFROG 2020. 2. 19. 19:45

Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가
힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고..
정답인증은 Name의 MD5 해쉬값(대문자)

 

peid로 봤을때 일단은 델파이로 만들어진 프로그램.

 

 

일단 답이 한 자리라고 했는데
한자리 넣으면 more chars..문자열 나온다.
이를 패치해주고 다시 올리디버거로 띄움.

 

한 자리니까 그냥 a~z, A~Z, 0~9를 다 넣어서 확인할 수도 있긴 한데,

제대로 풀어보자.

시리얼 생성 규칙을 확인해야 한다.

 

Name : A라고 설정하고 시리얼 규칙을 파악해보자. 

스택에 공간을 만든다. 
ECX=7인데 push 0 을 두 번씩 한다. 
스택에 총 14개 공간을 만든다. 

IMUL이 나오는 루틴 분석. 
ESI에 A값인 41을 넣는다. 
ADD ESI, EDX로  
41+0 = 41 
IMUL ESI, ESI, 772 = 1E3F2 
EDX에 ESI 값을 넣는다. 
IMUL EDX, ESI = 92DB10C4 
ADD ESI, EDX = 92DCF4B6  
OR ESI, ESI = 92DCF4B6 (변하지않음) 
IMUL ESI, ESI, 474 = FFF1BA78  
ADD ESI, ESI = FFE374F0   
MOV EDX, ESI = FFE374F0       
여기서 FFE3이 키 값의 첫 번째가 된다.

대충 어떤 루틴인지 알았으니 쉽게쉽게

코드를 짜서 얻어내보자.

 

파이썬이 편할 것 같아서 파이썬으로 짰다.

#CodeEngn basic 17

str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
chr = list(str)

for i in range (len(chr)):
    #print(chr[i])
    esi = ord(chr[i])
    edx = 0
    esi = esi+edx
    esi = esi * 0x772
    edx = esi
    edx = edx*esi
    esi = esi+edx
    esi = esi * 0x474
    esi = esi+esi
    #print(hex(esi))

    result = list(hex(esi))
   # print(result[-8:])
    if (result[-8] == 'b'):
       print(chr[i])
       print(result[-8:])
    

 

키 값의 처음 부분과 일치하는건 F뿐이다.

따라서 F문자를 md5로 encrypt시키면 flag를 얻을 수 있다.

 

 

'Reversing' 카테고리의 다른 글

[코드엔진] basic 19  (0) 2020.02.24
[코드엔진] basic 18  (0) 2020.02.24
[코드엔진] basic 16  (0) 2020.02.19
[코드엔진] basic 15  (0) 2020.02.18
[코드엔진] basic 14  (0) 2020.02.18