맨위로

이 글은 코드엔진(http://codeengn.com/) 에서 제공하는 리버스 엔지니어링 관련 다양한 문제들을 풀어보면서 리버스 엔지니어링을 공부하는 목적으로 작성되었습니다. 이글을 작성하는 필자도 리버스 엔지니어링에 흥미를 가지고 공부하는 입장이므로 잘못된 내용이 있을수도 있습니다. 잘못된 내용이 있다면 댓글이나 방명록에 알려주세요 :)

Challenges : Basic 10 


Author : ArturDents

Korean : 

OEP를 구한 후 "등록성공"으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE 

EX) 00400000EB03 

English : 

After finding the OEP, find the OPCODE of the branch instruction going to the "goodboy routine" 

The solution should be in this format : OEP + Serial 

EX) 00400000EB03 

문제를 보아하니 패킹되어 있는 프로그램을 언패킹해서 푸는 문제 같군요. 일단 언패킹을 하려면 패킹에 관한 정보를 얻어야 되기 때문에 PEiD를 통해서 열어보도록 하겠습니다. PEiD 를 통해서 열어보니 ASPack 으로 패킹되어있다는것을 알수있습니다.

자주 등장하던 UPX가 아니라서 당황스러울수 있지만 ASPack 또한 UPX와 비슷한 형태이기 때문에 쉽게 언패킹 할수 있습니다. 문제에서 처음나왔으니 자동화 툴을 이용한 언패킹을 하지 않고 레지스터를 이용한 언패킹을 해보도록 하겠습니다.

레지스터를 이용한 언패킹을 하기위해서는 패킹의 원리에 대해 간단하게 알아볼 필요가 있습니다. 정확하게 말하자면 패킹이 풀리는 원리를 알아보는것입니다. 

크게 보면 패킹은 아래와 같은 원리를 이용해서 풀리게됩니다.

 PUSHAD 명령어를 통해 

레지스터를 스택에 쌓는다.

정상 코드 

메모리에 복구

POPAD 명령어를 통해 

레지스터값들을 복구

 OEP로 분기

위의 원리에 따르면 PUSHAD 로 레지스터값들을 스택에 저장해놓고 원본코드가 다복구되면 메모리에 POPAD를 통해서 다시 레지스터 값을 참조하게 될것입니다. 바로 이점을 이용해서 PUSHAD 후에 ESP 값을 접근하는 지점(POPAD 명령어를 통한 접근)에 BP를 설정해놓으면 쉽게 OEP 분기점 전으로 이동할수 있을것입니다. 

먼저 PUSHAD 에서 ESP 값을 구해야 되기 떄문에 F8을 이용해서 ESP 값을 확인해보도록 하겠습니다.

확인결과 ESP 주소는 0012FF6C 라는것을 알수있습니다. 이제 여기에 BP를 걸어놓고 실행하면 OEP 분기 전으로 이동할수 있을것입니다. (왼쪽 아래의 ESP 관련 주소가 안나오고 다른주소가 나온다면 오른쪽 상단의 레지스터영역에서 ESP 의 오른쪽 마우스 클릭후 Follow in Dump 해주시면됩니다.)

BreakPoint -> Hardware On Access -> Dword 를 통해서 스택에 저장된 4Byte 값에 BP를 설정하도록 하겠습니다. 설정후에 F9 을 이용해서 실행시켜주면 아래와 같이 004564F2 주소에서 멈추는것을 확인할수있습니다.

위의 그림을 보면알수 있듯이 JNZ 구문에 의해 분기가 일어난후 특정주소(00445834)를 PUSH 하는것을 알수있습니다. 이렇게 JNZ 이후에 특정주소를 PUSH 하는경우 JMP 구문과 동일하게 스택에 저장된 주소로 이동하게됩니다. 즉 위와 같은경우에는 00445834 (OEP 주소)로 이동하게됩니다. 

이동해보니 디버거가 OPCODE를 인식하지 못하고 있다. 위와 같은 경우는 덤프를 해주면 정상적으로 인식한다. 올리덤프를 이용해서 덤프시킨후 프로그램을 열어보면 아래와 같이 정상적으로 인식하는것을 볼수있습니다. (덤프 과정은 이전 문제에서 다루었으니 생략하도록 하겠습니다.)

이제 OEP 주소는 찾았으니 등록성공으로 가는 분기점을 찾아보도록 하겠습니다. Search For - All Referenced Text Strings 을이용해서 살펴보니 "Registered ... Well done!" 라는 문자열이 눈에 들어온다. 

이 주소로 이동해서 살펴보면 조건분기점을 확인할수 있을것이다. 이동해서 보니 아래와 같이 조건분기점을 확인할수 있습니다.

즉, 분기점의 OPCODE 는 75 55 입니다.


참고자료

  • http://sinun.tistory.com/121


Posted by STIH

댓글을 달아 주세요