Reversing/Code Engine

Code Engine Basic 6

IT_Try 2018. 10. 12. 08:28

언팩 후, OEP와 시리얼을 찾으라고 합니다. 프로그램을 실행시켜보겠습니다.




아무 키나 입력 Check Serial을 눌러봅시다.



이렇게 잘못된 등록키라고 Error창이 뜹니다




우선 OEP의 개념에 대해서 알아봅시다. OEPOriginal Entry Point로 실제 프로그램의 시작 위치를 이야기합니다. 그렇다면 먼저 PEID로 프로그램의 정보를 얻어봅시다




UPX패킹 돼 있음을 확인 할 수 있습니다

언패킹 한 후 올리디버그를 통해 파일을 열어봅시다.



성공적으로 언팩이 되었습니다. 프로그램의 시작은 00401360으로 시작합니다. 그러면 이 00401360이 이 프로그램의 OEP가 됩니다.

 

Wrong 메시지를 찾기 위해 5번에서 했던 것처럼 문자열을 찾아봅시다

오른쪽 마우스 -> Search For -> All referenced text strings를 클릭합니다.



Wrong 메시지가 보인다. 더블클릭을 통해서 들어가도록 합니다.



코드를 보다 보면 성공문과 에러 문이 나옵니다. JNZ위에 조건문이 있지요. 조건문을 살펴보면 TEST EAX, EAX라고 되어있습니다. TEST문은 우리가 그전까지 한 번도 보지 못했던 조건문입니다. TEST EAX, EAXbreak를 걸고 코드를 실행해보도록 하겠습니다.



시리얼 값을 123을 넣고 실행시켜 TEST코드까지 왔을 때EAX의 값은 1입니다. 일단 TEST라는 조건문에 대해서 자세히 알아보도록 합시다.

 

TEST : 첫 번째 Operand와 두 번째 OperandAND연산을 한다. 0이 아닌 값이 나오면 ZF0으로 설정하고 반대로 연 산값0이 나오면 ZF1로 설정한다.

 

현재 EAX의 값이 1인걸로 봐서는 ZF1이 나올 수밖에 없습니다. 우리는 ZF0으로 바꿔야 합니다. 그러려면 EAX0으로 만들어줘야 하지요. EAX는 함수의 반환 값이 저장되는 레지스터입니다. 주변 코드들을 살펴보면



바로 위에 00401073주소에서 이상함 함수를 CALL하고 있습니다. F7을 사용해서 함수 안에 들어갑시다.


 

코드 해석을 해보자면

 

 

1. EDXECX에 어떤 값을 넣는다.

2. EDX3AND연산한다. ZF0이면 JNZ를 실행하지 않는다.

3. EAX에 어떤 값을 넣는다.

4. ALECX를 비교한다. ZF0이면 JNZ를 실행하지 않는다.

5. ALALOR연산

(OR연산은 각 비트가 모두 0이면 결과가 0이고 모두 0이 아니면 결과가 1이 된다.)

6. AHECX+1을 비교, ZF0이면 JNZ를 실행하지 않는다.

7. AHAHOR연산

8. ALECX+2를 비교, ZF0이면 JNZ를 실행하지 않는다.

9. ALALOR연산

10. AHECX+3을 비교, ZF0이면 JNZ를 실행하지 않는다.

 

 

결국 EAX0이 됩니다.

간단하게 정리하자면 ECXEDX에 집중하면 됩니다.

 


ECX는 우리가 넣었던 시리얼 값이EDX는 어떤 문자열인 것 같습니다. 정리하면

AD46DFS547시리얼 값을 넣게 되면

 


이렇게 성공했다는 창이 뜨게 됩니다.

그러므로 이번 6번 문제의 OEP = 00401360, 시리얼 값 = AD46DFS547 입니다.