OEP로 가 한줄씩 실행시켜보면 CreateFileA함수에서 CRACKME3.KEY파일을 여는 것을 볼 수 있다.
파일사이즈가 0x12인지 체크하고 들어있는 값을 00402008버퍼에 저장한다. 크기가 같지 않다면 00401037로 점프하고 아니면 00401311함수를 실행한다.
함수를 설명하자면 크랙미3.키 파일에는 0123456789ABCDEFGH가 있었는데 루프를 다돌고 함수 종료후 버퍼에 남아있는 값을 보면 뒤에 네자리는 그대로 있고 앞에 14자리가 바뀌어 있다. 어떠한 과정인가 알아보면...
1.XOR ECX,ECX와 XOR EAX,EAX를 통해 레지스터값을 0으로 초기화 해준다음
2.ESI에 문자열 시작 주소를 넣고 한글자씩 빼와 BL(41)과 XOR 연산을 해준다.
3.AL값을 다시 빼온 그자리에 넣어주고 INC ESI와 INC BL을 한다.
4.EAX가 담고있는 값을 4020F9에 저장한다.
5.AL과 0을 비교하여 같다면 루프문을 빠져나가고 아니면 CL을 +1한다.
6.BL과 4F를 비교한뒤 같다면 루프문을 빠져나가고 다르다면 루프문을 다시 수행한다(0040131B부터).
루프문을 다 빠져나왔다면 마지막으로 402149의 주소에 ECX값을 저장한뒤 RETURN한다.
대문자 E와 0x45의 xor연산은 0이기때문에 루프에서 벗어난다. 그렇기 때문에 ngn의 변환 값을 알 수 없게 되었는데..
아래와 같이 0으로 앞 5자리를 채우고 ngn을 입력해주면 28 20 26값이 나온다.
CodeEngn은 차례대로 아래와 같은 값이 나온다는 사실을 알 수 있었다.
41 42 43 44 45 46 47 48은 차례대로 BL의 값.
마지막 네자리문자와 4020F9가 담고있는 값과 비교하기 때문에 리틀엔디언 방식으로 넣어준다.
Offset 08번째의 값 49는 xor연산후 0이 되기때문에 문자열이 CodeEngn까지만 나오게 한다.
'Reversing > CodeEngn RCE Basic' 카테고리의 다른 글
19.코드엔진 Basic19 (0) | 2018.01.24 |
---|---|
18.코드엔진 Basic18 (0) | 2018.01.23 |
17.코드엔진 Basic17 (0) | 2018.01.21 |
16.코드엔진 Basic16 (0) | 2018.01.21 |
15.코드엔진 Basic15 (0) | 2018.01.20 |