맨위로

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

Challenges : Basic 11 


Author : abex

Korean : 

OEP를 찾으시오. Ex) 00401000 / Stolenbyte 를 찾으시오. Ex) FF35CA204000E84D000000 

정답인증은 OEP+ Stolenbyte 

Ex ) 00401000FF35CA204000E84D000000 

English : 

Find the OEP. Ex) 00401000 / Find the Stolenbyte. Ex) FF35CA204000E84D000000 

The solution should be in this format : OEP + Serial 

Ex ) 00401000FF35CA204000E84D000000 

문제를 보니 이번 문제 또한 패킹되어 있다는 것을 알수있습니다. 패킹을 풀기위해서 패킹에 대한 정보를 얻어야되기 때문에 PEiD를 통해서 프로그램을 열어보도록 하겠습니다. 

PEiD를 통해서 확인해보니 UPX로 패킹되어 있다는것을 확인할수 있습니다. UPX 를 간단하게 언패킹할수 있지만 Stolen Byte 가 존재하므로 언패킹을 하더라도 오류가 나타날것입니다. 오류를 해결하기 위해서는 StolenByte 를 찾아야 하므로 올리디버거를 통해 찾아보도록 하겠습니다.

이전 10번 문제에서 사용했었던 ESP 주소에 BP를 설정하는 방식을 이용해서 OEP 분기 전으로 이동해보겠습니다.

 (자세한 내용은 http://stih.tistory.com/68 참조) 

이동을 하니 아래와 같이 POPAD 아래에 12Byte 가 StolenByte 라는것을 쉽게 알수있습니다. 

이후에 0040100C 주소로 점프하는것을 보니 0040100C 주소가 OEP 라는것도 알수있습니다. 확인을 위해서 이동해보니 아래와 같이 메시지 박스 함수를 출력하는것을 볼수있습니다. 살펴보니 MessageBoxA 함수에 몇가지 값들(StolenByte)값들이 비어있는것을 확인할수있습니다.

Ctrl + e 를 통해서 비어있는 값들을 입력해주니 아래와 같이 원래의 코드로 언패킹된것을 확인할수있습니다. 여기서 훔쳐진 코드를 입력해주었기 때문에 OEP 주소도 변경되어 집니다. 즉 OEP 주소는 00401000 이 됩니다. 

올리덤프를 이용해서 덤프해주면 정상적으로 언패킹된것을 확인할수 있습니다.


사실 이번문제는 09번 문제와 같은문제이기 때문에 자세한 설명을 하지 않았습니다. 좀더 자세한 설명을 보시려면 다음 주소의 글을 읽어주시기 바랍니다. (http://stih.tistory.com/67)



Posted by STIH

댓글을 달아 주세요