#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

+ Recent posts