#About


Author : ReWrit


Korean :

Name이 CodeEngn일 때 Serial을 구하시오


English :
Find the Serial when the Name is CodeEngn




#Contents


해당 문제는 Name 값에 따라 달라지는 Serial 값을, Name 값이 CodeEngn일 때의 Serial 값을 구하는 것이 목표이다




#Solution


[그림 1] - 실행화면


16.exe를 실행하면 위와 같은 UI가 나오며, 네임과 패스워드를 입력하자 Wrong password!라고 출력되는 것을 확인할 수 있다


[그림 2] - C++ Programming


PEiD로 확인했을 때, Dev C++로 프로그래밍 되어 있는 것을 확인할 수 있으며, 간단한 C나 C++ 코딩을 한다면 

비쥬얼 스튜디오도 괜찮지만 Dev C++을 추천한다 고등학교 시절에 써봤는데 되게 가벼웠기에 ㅇㅇ..


아무튼 분석을 위해 디버거로 열고 해당 프로그램에 사용 된 문자열을 추출했더니 아래와 같다


[그림 3] - 문자열 추출


추출 된 문자열 중 시리얼 키 값 인증과 가장 관련 있어보이는 아스키 값 "Good Job!"이 해당하는 메모리주소 근처에서 하나의 분기문을 확인할 수 있었다


[그림 4] - 분기문 JNZ


004015A2에 있는 코드가 실행되면서 분기하는 곳을 따라가보았더니 아래와 같이 확인할 수 있었다


[그림 5] - 분기문 Tracing


004015A2에 있는 분기문은 "Good Job!"을 출력하는 코드를 뛰어 넘어, 0040163C로 이동하며,

코드를 타고 쭉 내려갔을 때, "Wrong password!"라는 메시지를 출력한다


따라서 004015A2의 분기문의 조건이 JNZ (Jump Not Zero) 일 때, "Wrong password!" 메시지를 출력하는 주소로 이동하기 때문에,

Zero Flag에 1을 채워주는 과정을 진행하게되면 "Good Job!" 메시지를 출력하는 곳으로 이동할 수 있다


Zero Flag를 1로 채우기 위해서는, 아래 그림에 해당하는 분기문 위의 비교 값이 같아야 한다


[그림 6] - 비교문 CMP


CMP 명령에서 비교하는 EAX 값과, [EBP-3C]의 4바이트 값을 확인하기 위해 해당 CMP 명령 구문에 bp를 걸고 값 입력을 진행해 보았다


[그림 7] - 값 입력


[그림 8] - 레지스터 EAX 값 변화


CMP 명령 구문에 bp를 걸고 [그림 7]과 같이 값을 입력했더니 EAX의 값이 사용자 입력 값으로 변해 있었다 ( 256 = 0x100 )


따라서 CMP 명령에서 사용되는 EAX는 사용자 입력 값임을 알 수 있었고, CMP 명령의 나머지 인자가 의미하는 값만 찾으면 된다


나머지 인자가 의미하는 값은 [EBP -3C] 주소부터 4바이트 값을 읽어들이는 것이기 때문에 


[그림 8]의 레지스터 창에 적힌 EBP 값 0028FF48에서 0000003C 만큼 뺀 0028FF0C로 이동


물론 계산은 계산기에게 맡김~ㅎ


[그림 9] - 계산기 사용


위 그림은 [EBP -3C]의 값을 계산한 것이며, 잠깐의 단축키 설명을 위해 그림을 삽입했고, 설명은

이 글의 끝에 하도록 하고 원래 문제 풀이 과정으로 넘어가겠다


[그림 10] - Jump to 28FF0C


단축키 Ctrl + G를 이용해 28FF0C를 입력해 주게 되면, 아래와 같이 메모리 주소 0028FF0C로 이동하게 되며 4바이트 값을 확인할 수 있다


[그림 11] - [EBP-3C] 4바이트 값 확인


4바이트 값은 리틀엔디언으로 표현, 0xE4C60D97이다


따라서 [그림 6]의 비교문 CMP의 인자인 DWORD PTR SS:[EBP-3C]가 의미하는 값은 0xE4C60D97이며,

사용자 입력 값인 EAX와 같은 값이 되기 위해서는 10진수로 입력해야 한다


10진수 입력 값은 3838184855이며, 아래와 같이 패스워드에 넣어 주었을 때, Good Job!이 출력 됨을 확인할 수 있다


[그림 12] - 인증




#단축키


평소, 시간 단축과 번거로움을 없애기 위한 단축키를 중요시 하기 때문에 설명을 진행함~_~


[ Ctrl + R ]


[ Alt + 1 ]


[ Alt + 2 ]


[ Alt + 3 ]


[ F5 ]


[ F6 ]


[ F7 ]


[ F8 ]


F5 - F6 - F7 - F8 키를 통한 16 , 10 , 8 , 2 진수 변환 가능


  

'Wargame' 카테고리의 다른 글

CodeEngn Basic 18  (0) 2017.10.17
CodeEngn Basic 17  (0) 2017.10.17
CodeEngn Basic 15  (0) 2017.10.12
CodeEngn Basic 14  (0) 2017.10.11
CodeEngn Basic 13  (0) 2017.10.11

+ Recent posts