Korea 
StolenByte를 구하시오 
Ex) 75156A0068352040 

English 
Find the StolenByte 
Ex) 75156A0068352040 

 

이 문제는 굉장히 헤맸다. ㅠㅠ

Stolen byte의 의미가 따로 있는지 모르고 있었다;;

그래서 파일의 크기를 맞춰 주려고 했는데… 그 파일의 크기가 Stolen Byte인 줄 알았다;;

자주 봐왔던 유형이다. UPX로 패킹 되어있는…

바로 OEP를 봤더니

어라 평소와는 다르게 이상한 곳에서 멈췄다.. 그리고 PUSH를 하는 것을 볼 수 있었다.

처음에는 저것을 전혀 신경 쓰지 않았다. 하지만 그게 내 큰 잘못이었다. ㅠㅠ

 

OEP를 찾아서 들어가보면 NOP이 굉장히 많다;; 뭐야?? 이상한데?? 그리고 아래 함수에는 GetFileSize가 존재하며 조금만 조작하면 나에게 "키 찾았어 라고 알려줬다" 파일 크기는 16byte였는데 난 그게 맞는 답인 줄 알고 왜 안되지;; 하다가 stolen 바이트를 검색하고는….. orz 상태로 빠져 있었다.

이 문제에서 가장 중요한 것은 stolen byte였다. 그게 무엇인지부터 보자.

 

http://blog.naver.com/jjysrh?Redirect=Log&logNo=60061439813

 

이곳을 참고 했으니 방문해 보시라.

정리하자면 패커가 보호된 프로그램의 코드의 윗 부분을 이동 시킵니다. 이 부분의 명령어는 이동된 곳이나 할당 받은 메모리 공간에서 실행되는데 만약 프로세서의 메모리를 덤프 했을 때 Stolen Byte를 복구 하지 못한다면 덤프된 실행파일은 작동하지 않는다. 글을 잘 읽고 생각해 보면 패커가 프로그램의 흐름을 어렵게 하기 위해서 작업을 하는 것 같다. 나중에 분석이 어렵게 하기 위해??

다행히 이 문제는 굉장히 단순해서 Stolen Byte를 쉽게 복구할 수 있다.

일단 Stolen Byte를 제대로 복구 못했을 경우를 보자.

위 그림과 같이 글씨가 다 깨지고 난리가 난다. 이 프로그램은 글씨만 깨지고 다른 것은 다 되지만 다른 프로그램의 경우도 그럴 것이라는 것을 장담할 수 없다.

자 그럼 Stolen Byte를 복구 해 보자.

우리가 복구해야 할 곳은 위에 노란색으로 채워진 14바이트 이다. Push 0부터 Push ~~까지 인데 저곳을 복사해서 OEP에 붙여 넣자.

 

위 처럼 붙여 넣으면 된다. 사실 아까 보면 엔트리 포인트가 0040100C 였는데 사실은 00401000이다. 그래서 저대로 저장을 하고 다시 DUMP를 뜨고 OEP를 복구하면 프로그램이 원래대로 뜨는 것을 볼 수 있다.

 

OEP를 1000으로 바꾸고 덤프를 뜨자.

그리고 ImportREC로 OEP를 바꿔서 넣으면

짜잔 아래 처럼 문자열이 깨지지 않고 뜨게 된다.

이 문제의 답은?? 진작 나왔제ㅋ

'Security > Reversing' 카테고리의 다른 글

CodeEngn 11  (0) 2010.04.12
CodeEngn 10  (0) 2010.04.12
CodeEngn 08  (0) 2010.04.12
CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12

+ Recent posts