먼저 프로그램을 올리디버거로 열어보았을 때 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


먼저 시리얼 값을 모르기 때문에 이름에만 CodeEngn이라고 쓰고 시리얼 값에는 1111을 입력했다.



cmp 문에서 eax 45b844에 있는 값이 같다면 cracked라고 뜨고 다르다면 try again! 이라고 뜬다


그런데 eax는 내가 입력한 값이라는 것을 알게 되었다. 그러면 45b844에 있는 값을 찾으면 되는데

 


답 나왔다.


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

CodeEngn Basic 17  (0) 2017.01.10
CodeEngn Basic 16  (0) 2017.01.10
CodeEngn Basic 14  (0) 2017.01.10
CodeEngn Basic 13  (0) 2017.01.10
CodeEngn Basic 12  (0) 2017.01.10


먼저 upx pack 되어있는 실행파일을 unpack해준다.




아이디에 CodeEngn을 입력하고 시리얼 값에는 12345를 넣어준다.



시리얼이 옳다고 출력되는 부분으로 점프하기 위해서는 eax esi가 같아야 한다.



Eax는 내가 입력한 12345가 있고 esi에는 시리얼값이 들어있다.


왜 정답이 여러 개가 나올수 있는지 모르겠고 brute force공격이 왜 필요한지 모르겠다.


아마도 시리얼을 만들어 내는 루틴이 있을거 같은데 이미 풀었으므로 나중에 할거없을때 분석해봐야겠다.


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

CodeEngn Basic 16  (0) 2017.01.10
CodeEngn Basic 15  (0) 2017.01.10
CodeEngn Basic 13  (0) 2017.01.10
CodeEngn Basic 12  (0) 2017.01.10
CodeEngn Basic 11  (0) 2017.01.10


먼저 peid로 열어보니 c#으로 만들어진 파일임을 알 수 있다


c#은 디컴파일이 가능하고 디컴파일을 해주는 툴은 reflector이다.



소스를 모두 볼 수 있게 되었고 plainText라는 변수에 저장된 값과 내가 입력한 값을 비교한 뒤에 같으면 정답이라고 출력한다.


코드를 수정해 비교하는 값인 plainText를 출력해 보았다.



답 나왔다.

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

CodeEngn Basic 15  (0) 2017.01.10
CodeEngn Basic 14  (0) 2017.01.10
CodeEngn Basic 12  (0) 2017.01.10
CodeEngn Basic 11  (0) 2017.01.10
CodeEngn Basic 10  (0) 2017.01.10


eax에는 입력값이 들어간다


그런데 eax 0x7a2896bf와 비교해서 같다면 congratulation 이라고 출력을 한다


그러면 key값은 0x7a2896bf 십진수로 2049480383이 된다


그리고 key값을 입력한후 메시지 창이 뜰 때 메시지 박스에 키값이 출력이 되도록 하려면 congratulation자리에 키값이 들어가면 될 것이다.



hex editer로 보았을 때 키값 10자리와 마지막에 null문자를 포함해서 0x???~0x???영역에 overwrite하면 된다.

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

CodeEngn Basic 14  (0) 2017.01.10
CodeEngn Basic 13  (0) 2017.01.10
CodeEngn Basic 11  (0) 2017.01.10
CodeEngn Basic 10  (0) 2017.01.10
CodeEngn Basic 09  (0) 2017.01.10


Popad 이후의 코드를 보면 푸시를 세 번 해주고 그 후에 점프하는 모습을 볼 수 있다.


 stolenbyte는 푸시되는 명령어들의 16진수 값이라 할 수 있고 oep는 점프하는 주소에서 stolenbyte의 크기를 뺀 주소가 oep가 된다.



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

CodeEngn Basic 13  (0) 2017.01.10
CodeEngn Basic 12  (0) 2017.01.10
CodeEngn Basic 10  (0) 2017.01.10
CodeEngn Basic 09  (0) 2017.01.10
CodeEngn Basic 08  (0) 2017.01.10

+ Recent posts