먼저 1234라고 입력을 해보니 mal cracker!!!라고 나오고 메시지 창이 뜬다.


옳은 시리얼 값이 아닌거 같다.



문자열을 찾아보니 옳을 때 출력될 것으로 보이는 문자열은 보이지 않고 옳지 않을때 출력되는 문자열만 보여서 일단 중단점을 걸어준다.



다시 실행을 해보니 중단점을 건 곳에서 한번 멈추고 윗부분을 분석해보니 딱히 단서가 될만한 것을 찾지 못했으나



조금 더 윗부분을 보니 strcmp함수를 호출하는 부분이 보인다. 이 부분에 중단점을 걸고



다시 실행을 시켜보니 내가 입력한 1234  특정값을 비교한다.



맞았다고 한다.


'문제 > CodeEngn_Advance' 카테고리의 다른 글

CodeEngn Advance 07  (0) 2017.01.10
CodeEngn Advance 06  (0) 2017.01.10
CodeEngn Advance 04  (0) 2017.01.10
CodeEngn Advance 03  (0) 2017.01.10
CodeEngn Advance 02  (0) 2017.01.10


먼저 문자열들을 살펴보니 아무것도 없어서 이상하다 생각했다.



코드가 깨져있는것을 확인하고 제대로 코드를 다시 가져왔다.



그리고 다시 문자열들을 살펴보니 invalid serial이라고 내가 옳지않은 시리얼을 입력했을 때 출력되는 문자열을 확인해서 


중단점을 걸고 그 코드 주변으로 가서 살펴보았다.



위를 보니 인자 값 두개를 strcmp하여 타당한지 아닌지를 검증하는 부분이 있다


내가 입력한 값과 name에 의하여 생성된 시리얼 값이라고 생각했다.



nameCodeEngn 시리얼에는 무작위로 값을 넣고



중단점을 걸어보니 생성된 시리얼 값이 나왔다.



시리얼이 옳다고 나온다.




'문제 > CodeEngn_Advance' 카테고리의 다른 글

CodeEngn Advance 06  (0) 2017.01.10
CodeEngn Advance 05  (0) 2017.01.10
CodeEngn Advance 03  (0) 2017.01.10
CodeEngn Advance 02  (0) 2017.01.10
CodeEngn Advance 01  (0) 2017.01.10


먼저 문자열들을 보니 성공했을 때와 실패했을 때 출력할 것으로 보이는 문자열들을 보았다. 이 부분에 중단점을 걸고



이름은 CodeEngn을 시리얼에는 무작위로 대입을 하고 실행을 시키니



중단점에서 프로그램이 멈추고 윗부분을 보니 내가 입력한 값과 시리얼 값을 비교해서 무슨 성공과 실패에 대한 메시지를 결정한다.



디버깅을 하면서 찾은 시리얼 값으로 체크를 해보니 성공했다고 나온다.


'문제 > CodeEngn_Advance' 카테고리의 다른 글

CodeEngn Advance 06  (0) 2017.01.10
CodeEngn Advance 05  (0) 2017.01.10
CodeEngn Advance 04  (0) 2017.01.10
CodeEngn Advance 02  (0) 2017.01.10
CodeEngn Advance 01  (0) 2017.01.10


실행해보니 패스워드를 입력해서 맞지 않으면 바로 실행이 멈춘다


문자열을 검색해보니 패스워드가 맞을 때 출력될 것으로 보이는 문자열들도 보이지 않는다.



여기 함수 호출 하는 부분은 입력받는 것으로 추정된다.



1234로 입력을 했다.



입력을 한 후 함수들을 몇개 호출하는데 그중 의심되는 함수를 찾아 보니 비교문이 있다


Eax에서 한바이트씩 가져와 16진수와 비교를 한다.




16진수들을 아스키코드로 바꾸면 어떠한 문자열이 된다.



입력을 하니 패스워드가 맞다고 메시지 창이 뜬다.



WELL DONE! 이라는 문자열을 찾을 수 없었던 이유는 16진수를 하나하나 넣어 messagebox함수를 호출하기 때문이였다.


'문제 > CodeEngn_Advance' 카테고리의 다른 글

CodeEngn Advance 06  (0) 2017.01.10
CodeEngn Advance 05  (0) 2017.01.10
CodeEngn Advance 04  (0) 2017.01.10
CodeEngn Advance 03  (0) 2017.01.10
CodeEngn Advance 01  (0) 2017.01.10


먼저upx 패킹이 되어있어 언패킹을 하였다.



코드엔진 베이직 19번에서 풀었던 문제와 유사하여 일단 timeGetTime함수에 모두 중단점을 걸었다.



그리고 디버깅 할때마다 안티디버깅이 되있어 eax 0으로 바꿔주며 풀었다.



첫번째 timeGetTime 함수를 호출하고



두번째 함수를 호출해서




두번째 함수의 리턴 값에서 첫번째 함수 리턴값을 빼주어 eax에 저장한후 ebx+4와 비교한다


ebx+4보다 작다면 계속 timeGetTime함수를 호출하며 무한루프를 돈다


ebx+4초 후에 프로그램이 종료된다


'문제 > CodeEngn_Advance' 카테고리의 다른 글

CodeEngn Advance 06  (0) 2017.01.10
CodeEngn Advance 05  (0) 2017.01.10
CodeEngn Advance 04  (0) 2017.01.10
CodeEngn Advance 03  (0) 2017.01.10
CodeEngn Advance 02  (0) 2017.01.10


먼저 프로그램을 올리디버거로 열어보았을 때 createfile함수를 통해서 crackme3.key라는 파일명을 가진 파일을 가져오는 것을 볼 수 있다


그래서 파일을 만들고 재실행 시켜보았다.



그랬더니 바로 밑에서 또 readfile함수를 호출하는데 호출후 비교를 한다


4021a0에 있는 값은 함수를 호출하기 전 푸시했던 파라미터 값 파일의 바이트 수를 의미한다


즉 파일의 길이는 16진수로 12여야 한다.



abcdefghijklmnopqr이렇게 18자리를 집어넣고 실행을 해보니 어떤 함수가 호출된 후 뒤의 4자리 빼고는 앞자리가 전부 바뀌었다.


또한 opqr전까지 CodeEngn이 들어갈 자리에 들어가 있는 모습을 볼 수 있다.



함수를 보니 bl41부터 시작이고 esi에는 cracme3.key파일에 입력한 값이 들어가 있음을 볼 수 있었다


그리고 반복문은 bl4f가 될때까지 총 14번 반복된다


그러면서 41부터 1씩 증가 하면서 내가 입력한 값과 xor연산이 되며 저장되는 것을 볼 수 있다


그래서 내가 입력한 값과 41 xor연산해서 C가 되도록 해서 CodeEngn이 되게 한후 n다음에 NULL이 되도록하고 나머지 5자리는 아무거나 채워 넣으면 될 것 이다.



이제 CodeEngn이 되도록 출력만 하면 되는데 al값이 1이 아니여서 메시지박스가 뜨지 않는다.


Al1이 되도록 하려고 위를 분석해보니



이부분에서 eax4020f9에 있는 값이 같다면 al1로 만들어 준다.


Eax는 아스키코드로 opqr이므로 crackme3.key파일의 마지막4자리임을 알 수 있다


Crackme3.key파일의 마지막 네자리를 little-endian이므로 ?? ?? ?? ??로 바꾸어 주면 된다.





'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 19  (0) 2017.01.10
CodeEngn Basic 18  (0) 2017.01.10
CodeEngn Basic 17  (0) 2017.01.10
CodeEngn Basic 16  (0) 2017.01.10
CodeEngn Basic 15  (0) 2017.01.10


먼저 코드를 쭉쭉 넘겨보다 보면 isDebuggerPresent함수로 안티디버깅한다


그래서 디버깅 할 때마다 eax0으로 바꿔주면서 디버깅을 했다



함수 목록들을 보다가 시간 관련된 함수가 나와서 조사를 해보니 윈도우가 시작된 순간부터 현재까지 시간을 반환해 준다. 리턴값은 600001.



이 부분에서 두번 함수를 호출한다.



두번째로 호출한 함수의 값에서 첫번째로 호출한 함수의 값을 빼면 시간이 나온다


그 시간을 ebx+4에 있는 값과 비교 하는데 그보다 작으면 다시 반복한다


다시 timegettime함수를 호출하여 제일 처음에 호출된 함수의 리턴값을 빼면 다시 시간이 나올 것 이다


두 값의 차는 프로그램이 실행된 후로 현재까지의 시간을 나타냅니다


그 차이가 ebx+4보다 크면 프로그램이 종료된다


답 나왔다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 20  (0) 2017.01.10
CodeEngn Basic 18  (0) 2017.01.10
CodeEngn Basic 17  (0) 2017.01.10
CodeEngn Basic 16  (0) 2017.01.10
CodeEngn Basic 15  (0) 2017.01.10


먼저 이름을 CodeEngn이라고 하고 시리얼 번호는 1234로 해두었다.



그리고 시리얼 값이 옳다는 메시지 박스를 출력하는 부분으로 가기 위한 점프문을 보니 eax이어야 점프를 한다


윗부분을 보니 내가 입력한 1234와 어떤 문자열을 비교한다.


둘이 같다면 eax 0이 될 것이므로 시리얼 값을 찾았다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 20  (0) 2017.01.10
CodeEngn Basic 19  (0) 2017.01.10
CodeEngn Basic 17  (0) 2017.01.10
CodeEngn Basic 16  (0) 2017.01.10
CodeEngn Basic 15  (0) 2017.01.10


일단 힌트에서는 name값은 1자리인데 실행파일에서는 3자리 이하이면 필터링을 하고 있다.


그래서 올리디버거를 통해 cmp eax,3 cmp eax,1로 바꾸어 필터링이 안걸리도록 파일을 변경하였다.


그 다음에 name을 입력하면 serial이 만들어 지는데 알고리즘을 분석하지 않고 숫자 또는 알파벳 이라고 했기 때문에 


0~9,a~z,A~Z을 수작업으로 대입하여 KEY값을 찾게 되었다


분명히 이렇게 푸는게 아닌데 왜이렇게 풀었는지 모르겠다. 할거없을때 다시 해봐야겠다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 19  (0) 2017.01.10
CodeEngn Basic 18  (0) 2017.01.10
CodeEngn Basic 16  (0) 2017.01.10
CodeEngn Basic 15  (0) 2017.01.10
CodeEngn Basic 14  (0) 2017.01.10


먼저 이름에 CodeEngn을 입력하고 시리얼 값을 모르기 때문에 1234라고 입력을 했다.



Good job 을 출력하는 부분으로 가기위해선 cmp문으로 eax ebp-3c의 값을 비교하는데 eax는 내가 입력한 값이라는 것을 알 수 있다.



Ebp-3c의 부분은 28ff0c의 값인데 dword이므로 4byte만 비교하면 된다


Little-endian 이므로 답 나왔다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 18  (0) 2017.01.10
CodeEngn Basic 17  (0) 2017.01.10
CodeEngn Basic 15  (0) 2017.01.10
CodeEngn Basic 14  (0) 2017.01.10
CodeEngn Basic 13  (0) 2017.01.10

+ Recent posts