#About


Author : uBc - bRiANbuSY


Korean :

Name이 CodeEngn 일때 Serial을 구하시오


English :

Find the Serial when the Name is CodeEngn




#Contents


Name 값에 따라 달라지는 Serial 키 값을 찾는 것을 목표로 한다




#Solution


[그림 1] - 실행화면


15.exe를 실행했을 때 UI이며 네임 값에 코드엔진과 시리얼 값에 임의의 값을 적어 주었을 때 아래와 같은 에러 메시지를 확인할 수 있다


[그림 2] - 에러 메시지


출력된 메시지를 통해 시리얼 값은 정수형으로 입력해주어야 한다는 사실을 알 수 있었다


[그림 3] - Delphi Programming


패킹여부의 확인을 위해 PEiD로 보았더니 패킹은 되어있지 않았고, 델파이로 제작된 것을 확인할 수 있었다


디버거로 열어 준 뒤, 해당 프로그램에서 사용 된 문자열을 추출했더니 아래와 같이 프로그램의 

시리얼 값의 인증과 관련있어 보이는 아스키 값을 확인할 수 있었다


[그림 4] - 문자열 추출


해당 주소로 이동했더니 역시나, 해당 주소로 이동하는 분기문을 확인할 수 있었다


[그림 5] - 분기문 JNZ


분기문을 살펴보니 ZeroFlag가 0되어야 하는 즉, 00458831에서 EAX 값과 45B844에 담긴 값이 같다면 크랙 성공 문구를 출력시키는 코드임을 알 수 있었다


이번 문제의 핵심이 되는 코드주소인 00458831에 있는 EAX 값과 45B844에 담긴 값을 찾기 위해  bp를 00458837에 걸고 아래와 같이 값을 입력해주었다


[그림 6] - 값 입력


위와 같이 값을 입력해 주었더니 아래와 같이 레지스터 EAX 값에 담기는 것을 확인할 수 있었다


[그림 7] - EAX


위와 같이 EAX 레지스터에 사용자가 입력한 값이 담기는 것을 확인 후, 00458831에서 참조하는 주소 45B844에 있는

4바이트 값을 확인하기 위해 단축키 Ctrl + G를 통해 이동해 주었더니 아래와 같이 확인할 수 있었다


[그림 8] - 4바이트 값


리틀엔디언으로 읽어야 하므로 해당 값은 0x00006160이며 10진수로 표기하면 24928이다


따라서 사용자 입력 값과 비교하는 값은 24928이며, 입력 값과 일치하다면 크랙에 성공했다는 메시지를 출력하는 코드로

이동하기에 [그림 6]에서 넣어 주었던 시리얼 값 256이 아닌, 24928을 넣고 체크하게 되면, 아래와 같이 문제 해결 완료


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


[그림 10] - 크랙



'Wargame' 카테고리의 다른 글

CodeEngn Basic 17  (0) 2017.10.17
CodeEngn Basic 16  (0) 2017.10.13
CodeEngn Basic 14  (0) 2017.10.11
CodeEngn Basic 13  (0) 2017.10.11
CodeEngn Basic 12  (0) 2017.10.08

#About


Author : BENGALY


Korean :

Name이 CodeEngn 일때 Serial을 구하시오

(이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요)

Ex) 11111


English :

Find the Serial when the Name of CodeEngn

(This problem has several answers, and the answer should be a 5 digit number. Brute forcing is required.)

Ex) 11111




#Contents


Name의 값과 길이에 따라 달라지는 Serial 값을 어셈블리코드를 통한 이해를 목표로 한다




#Solution


[그림 1] - 실행화면


14.exe의 UI이며, 임의의 값을 넣고 체크 시, 아래와 같은 에러 메시지를 확인할 수 있다


[그림 2] - 에러메시지


늘 보아왔듯 올바른 시리얼키를 구하기 위해 디버거로 열기 전, 패킹여부를 확인해 보았다


[그림 3] - UPX 패킹


UPX로 패킹되어 있었으며, 패킹의 주목적은 코드의 암호화라고 앞서 언급했었지만(http://croas.tistory.com/22) UPX 같은 경우는 압축이 주목적인 패킹 방식이다


언패킹을 위해서는 프로그램을 사용해도 되지만, 이번엔 UPX가 마지막에 위치한 분기문이 OEP라는 특징을 이용해 언패킹을 진행 했다


[그림 4] - BreakPoint > 00438C8F


위와 같이 00438C8F에 bp를 걸어 준 뒤, Step-Over를 통해 한 단계 넘어가게 되면 아래와 같이 OEP로 이동한 것을 확인할 수 있다


[그림 5] - OEP로 분기


위와 같이 OEP로 분기 후, 계속 문제를 풀기 위한 작업을 진행하다보니, 계속 [그림 4]의 JMP구문으로 가서 

OEP로 이동해야 하는 번거로움 때문에 프로그램을 통해 아래와 같이 언패킹을 진행했다


[그림 6] - UPX 언패킹


[그림 7] - OEP


언패킹을 진행하고 디버거로 열게되면 위와 같이 함수 사용에 필요한 인자와 함수명이 [그림 5]와는 달리

깔끔하게 확인할 수 있다는 점을 발견했고 앞으로 가능한 프로그램을 써서 언패킹을 진행하기로 마음먹었다..ㅎ


시리얼키를 찾기 위해, 해당 프로그램에 사용 된 문자열들을 확인했더니 아래와 같이 확인할 수 있었다


[그림 8] - ASCII Value


특히, 시리얼키와 근접할 만한 아스키 값인 "Good Job, I Wish You the Very Best"이 있는 주소로 이동 했다


[그림 9] - JNZ


00401345로 이동했더니, 역시나 조금 윗줄 코드에 분기문이 있음을 확인할 수 있었고, 0040133A의 CMP 명령을 통해 EAX값과 ESI를 비교함을 알 수 있었다


비교하는 EAX 값과 ESI 값은 최종적으로 어떻게 담긴 값인지 알기 위해 분기문 가장 근처에 있는 함수인 lstrlenA에 bp를 걸고 분석을 진행했다


[그림 10] - lstrlenA 함수


값 입력 박스에 아래와 같이 값을 넣고, 004012FB를 실행 시켰더니 아래와 같은 결과를 확인할 수 있었다


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


[그림 12] - 리턴 값 확인


lstrlenA 함수는 입력 문자의 길이를 리턴하는 함수로, [그림 11]에서 입력해준 CodeEngn의 길이가 8임을 통해 EAX에 리턴 값으로 8이 들어간 것을 확인가능


확인 후, Step-Over를 통해 한 단계씩 실행 시키고 시키다 보면, 반복루틴이 있음을 알 수 있고 해당 코드들에 대한 주석은 아래와 같다


[그림 13] - 코드 주석


결국 위 코드의 주석이 의미하는 바는, lstrlenA 함수에서 받아온 name의 길이 값 만큼 반복루틴이 진행되며 0040133C에서 EAX와 ESI값을 비교하는 것이다


[그림 14] - 레지스터 값 확인


결국 레지스터 값을 확인해보게 되면 EAX는 사용자 입력 값이며(256=0x100), ESI는 76193(76193=0x129A1)가 된다


따라서 아래와 같이 사용자 입력 값에 76193을 적어주게 되면 시리얼키의 인증을 확인할 수 있다


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


[그림 16] - 인증


참조 : http://stih.tistory.com/72

'Wargame' 카테고리의 다른 글

CodeEngn Basic 16  (0) 2017.10.13
CodeEngn Basic 15  (0) 2017.10.12
CodeEngn Basic 13  (0) 2017.10.11
CodeEngn Basic 12  (0) 2017.10.08
CodeEngn Basic 11  (0) 2017.10.08


#About


Author : Basse 2002


Korean :

정답은 무엇인가


English :

Find the answer




#Contents


Disassemble과 Decompile 차이의 이해와 C# 코드의 이해를 통한 코드 수정으로 암호화 된 값을 복호화 시키는 것을 목표로 한다




#Solution


[그림 1] - 실행화면


위 그림은 13.exe의 실행화면이며, 올바른 패스워드를 입력할 때까지 "Bad Luck! Try again!"을 외치는 것을 반복한다


문제도 간결하고 패스워드만 찾으면 되는 건가 하며 디버거로 열었을 때, 아래와 같은 에러를 확인할 수 있다


[그림 2] - 에러 메시지


디버거로 열지 못하는 파일이라면 어떤 "것"으로 짜여진 것인지 확인을 위해 PEiD를 사용했다


[그림 3] - C# Programming


위 그림을 보면 .NET 기반의 C# 프로그래밍이 되어 있음을 알 수 있다


 검색을 통해 C#은 디버거와 같은 디스어셈블리어로는 열리지 않고, 디컴파일러가 따로 필요함을 알 수 있었고

JetBrains의 "dotPeek"라는 프로그램에서 C# 디컴파일을 지원함을 알 수 있었다


https://www.jetbrains.com/decompiler/


[그림 4] - main


dotPeek를 실행시키고 프로그램의 main을 열어보면 평문을 솔트 값, 해쉬 알고리즘 MD5 등과 함께 암호화 하는 것을 확인할 수 있으며

주목해야할 부분은 반복문 while 위의 코드인 Decrypt 함수의 반환 값이 str에 저장되며, str은 while 문 안에서 사용자 입력과 비교를 한다


따라서 str에 저장 된 값이 복호화 된 평문이며 아래와 같이 조금의 코드 수정을 통해 평문을 얻을 수 있다


[그림 5] - C# 코드수정


비쥬얼 스튜디오를 통해 C# 코드를 암호화된 값이 아닌, 복호화 된 값이 나오게 끔 수정 해준 뒤, 리빌드를 진행했다


[그림 6] - Rebuild


리빌드를 진행하면 위 프로그램이 생성된 것을 확인할 수 있으며, 실행시키게 되면 문제에서 요구하는 정답인, 복호화 된 값을 확인할 수 있다


[그림 7] - Decoded Value



'Wargame' 카테고리의 다른 글

CodeEngn Basic 15  (0) 2017.10.12
CodeEngn Basic 14  (0) 2017.10.11
CodeEngn Basic 12  (0) 2017.10.08
CodeEngn Basic 11  (0) 2017.10.08
CodeEngn Basic 10  (2) 2017.10.02

+ Recent posts