#About


Author : Xsp!d3r


Korean :

Name이 CodeEngn일 때 Serial은 무엇인가


English :

Find the Serial when the Name is CodeEngn.




#Contents


해당 문제는 Name 값에 따라 달라지는 Serial 값을 구하는 것을 목표로 한다




#Solution


[그림 1] - 실행 화면


18.exe의 실행화면이며 Serial 값에 임의의 값을 넣고 체크하면 아래와 같은 에러 메시지를 확인할 수 있다


[그림 2] - 에러 메시지


분석을 위해 디버거로 열고 조금만 위 아래로 스크롤 하다보면 아래와 같은 화면을 확인할 수 있다


[그림 3] - 분기문 JE


004011F6을 보면 분기문이 존재하며 해당 라인의 결과에 따라 성공/실패 메시지가 출력된다 따라서 해당 분기문에서

사용되는  조건이 어디로부터 오는 것인지 확인 하는 과정을 거치게 되면 문제가 해결될 것 같다


004011F4에서 OR EAX, EAX 명령을 수행하는데 있어 레지스터 EAX는 함수의 리턴 값을 담는

용도로 쓰이기 때문에 바로 윗 라인에 사용되는 함수 lstrcmpiA의 리턴 값일 것이다


lstrcmpiA 함수는 두 문자열을 비교한 결과를 리턴하며 무엇을 비교하는지 알기 위해 004011EF에 bp를 걸고 임의의 값을 입력하는 과정을 진행해보았다


[그림 4] - 임의의 값 입력


[그림 5] - 입력 값 확인


위 과정을 통해 Serial에 임의로 입력해준 256이라는 값이 String1에 저장되며, String2와 비교 한 결과 값을 리턴함을 알 수 있다


따라서 String1과 String2의 값이 같아야 성공 메시지가 출력되는 구문으로 분기하게되며, 사용자 입력 값이 었던

String1의 값을 06162370056B6AC0으로 입력해준다면 아래와 같이 성공 메시지를 확인할 수 있다


[그림 6] - 올바른 시리얼 값 입력


[그림 7] - 크랙


'Wargame' 카테고리의 다른 글

CodeEngn Basic 20  (0) 2017.10.23
CodeEngn Basic 19  (0) 2017.10.19
CodeEngn Basic 17  (0) 2017.10.17
CodeEngn Basic 16  (0) 2017.10.13
CodeEngn Basic 15  (0) 2017.10.12

#About


Author : WarRock


Korean :

Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가

힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고..

정답인증은 Name의 MD5 해쉬값(대문자)


English :

What is Name when the Key is BEDA-2F56-BC4F4368-8A71-870B

Hint : The name is 1 letter and it could be either alphabetic or numeric.

Verify your solution with the MD5 value of the Name.




#Contents


키 값에 따라 달라지는 네임 값을 구하는 것을 목표로 함




#Solution


[그림 1] - 실행 화면


 17.exe 를 실행했을 때, Name과 Key 값을 입력하는 창을 확인할 수 있으며 주어진 문제에서 고정 키 값을 사용할 때 Name을

구하는 문제이므로, Name란에는 임의의 값과 Key란에는 고정 키 값을 넣어주고 Check it!을 누르면 아래와 같은 메시지를 볼 수 있다. 

( Name란에 문자의 길이가 3 글자 이상이면 Check it! 버튼이 먹히지 않음 )


[그림 2] - 키 박스 메시지


더 많은 문자를 입력하라는 메시지라는 정보만 출력되며, 디버거로 열기전 패킹여부를 PEiD로 확인한 결과는 아래와 같다


[그림 3] - Delphi Programming


패킹은 되어 있지 않고 단지 델파이 프로그래밍 되었기에 별도의 언패킹 과정을 하지 않고 디버깅을 진행하면 된다


[그림 4] - 아스키 값 추출


위 그림은 메시지에서 출력된 메시지가 저장되어 있는 값을 찾기 위해 아스키 값만 추출한 것이며,

정답과 관련되어 보이는 값들 또한 같이 확인할 수 있었다


다시, 해당 문제는 Key 값이 "BEDA-2F56-BC4F4368-8A71-870B"일 때의 1자리 값의 Name을 구하는 것인데 [그림 2]에서 확인할 수 있듯 Name에 

값 하나만 넣어주게 되면 Please Enter more Chars...라는 메시지가 출력되기에 이를 확인하기 위해, 위 그림에서 확인할 수 있는 주소 0045BB29로 이동했다


[그림 5] - 비교 구문


0045BB29로 이동했더니 두 줄 위의 코드에서 비교 구문을 확인할 수 있었고 이는 [그림 2]에서 확인할 수 있었듯,

Name란에 입력된 글자 수를 제어하는 구문으로 추측된다


따라서 해당 주소 0045BB24에 bp를 걸고 임의의 값을 입력한 뒤의 EAX 값을 확인 해보았다


[그림 6] - 임의의 값 입력


[그림 7] - EAX 값 확인


위 과정에서 알 수 있듯, Name에 입력한 값의 길이가 EAX의 값으로 들어감을 확인할 수 있고, 해당 문제는 1 글자일 때므로 아래와 같이 코드 패치를 진행


[그림 8] - 코드 수정


코드를 수정해 준 뒤, 아래의 옵션을 통해 바이너리 패치 본을 만들어 준다


[그림 9] - 코드 패치


[그림 10] - 패치 본


Name이 한 글자임을 감안해 브루트포싱을 통해 임의의 값을 입력하다보면 아래와 같이 F에서 Well done! 메시지를 확인할 수 있다


[그림 11] - Brute Forcing을 통한 Name 값 확인


[그림 12] - 인증

'Wargame' 카테고리의 다른 글

CodeEngn Basic 19  (0) 2017.10.19
CodeEngn Basic 18  (0) 2017.10.17
CodeEngn Basic 16  (0) 2017.10.13
CodeEngn Basic 15  (0) 2017.10.12
CodeEngn Basic 14  (0) 2017.10.11

#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