물마중

[리버스_0x04] 함께 공부하는 Reversing_5 본문

Reverse Engineering/Reversing 이론 설명

[리버스_0x04] 함께 공부하는 Reversing_5

zweistar2 2011. 1. 18. 01:03
작성자: Dear. Tom
편집자: 엔시스(sis@sis.pe.kr)
출   처: 보안인닷컴 팀 블로그[http://boanin.tistory.com]



1. Abstract
 
이번강의는 3강의 연장선으로, 앞에서 분석해 본 RegisterMe.exe의 변형 버젼인
RegisterMe.Oops.exe를 분석해 보고자 한다.

이전에 간단히 학습한 PE Header에 대한 내용이 다시 언급 될 것이다.
 
 
 
2. tools and target
 
- Tool : OllyDbg
 
 
 
3. Analyze
 

먼저 이 프로그램을 Olly로 불러온다. 그러면 다음과 같은 에러메시지가 보일 것이다.

 

확인 버튼을 누르면, 이전에 봤던 정상적인 프로그램이 뜨지는 않고, 그냥 종료되어 버린다.

 

그리고 덤프창에도 아무런 값들이 보이지 않는다. 어떻게 된 것일까? 실제로 이런것이 Olly에서 자주 보여지는 화면은 아니다. 그리고 Olly는 crashing으로 부터 자신을 보호하기 위해 EP 대신에 시스템 BP(BreakPoint)에 의해 멈추고 있다. 하지만 이 문제는 쉽게 해결 할 수 있을 것이다. 
 

 
3. the use of plugins
 
물론, 간단히 ollyadvanced.dll 이라는 플러그인을 통해 대부분의 이런 문제를 피할 수 있다.
하지만 우리의 목표인 PE Header구조를 학습하기 위하여 직접 값들을 수정해보면서 풀이를 해보겠다.
 
 
 
4. Solving the RegisterMe.Oops
 
 
 
 

우선, EP(== 00400000 + 1000 -> 00401000)로 이동한다.

 

 

 더블클릭 혹은 F2를 눌러 BP(BreakPoin)로 설정한다. (만약, 에러메시지가 나온다면 그냥 확인 버튼을 누른다.)

  

 
우리가 설정한 BP에서 멈출 것이다.



 
어떤 바이러스들은 안티 디버그 트릭으로 PE Header의 값들을 조작하기도 한다.
조작하는 법과 이유는 이후의 내용에서 모두 알 수 있을 것이다.

 

 


여긴 오직 PE Header 밖에 없다. 섹션들은 어디로 갔을까?
이전에 우리는 code, data 등을 포함하는 섹션을 보지 않았었나??
그리고 이 헤더의 사이즈는 무려 5000h..보통의 헤더는 1000h라고 말하지 않았던가?

실제로 그냥 이 파일을 실행해보면, 결과는 제대로 동작하지만, olly는 혼란스러워 한다.


 

이상한 부분과 수정해야 할 값을 정리해보면 다음과 같이 NumberOfRvaAndSizes를 제외하고 사이즈 값을 크게 늘려놓은 것을 복원하는 것뿐이다. 

             상수

현재 설정 되어 있는 값

정상적인 값

최종 수정 값
(by Little Endian)

SizeOfCode

40000400

400

00 04 00 00

SizeOfInitializedData

40000A00

A00

00 0A 00 00

BaseOfCode

40001000

1000

00 10 00 00

BaseOfData

40002000

2000

00 20 00 00

NumberOfRvaAndSizes

40000004

10

10 00 00 00

Export Table Address

00500000

0

00 00 00 00

Export Table Size

00050000

0

00 00 00 00

NumberOfRvaAndSizes는 옵셔널 헤더의 디렉터리 엔트리 개수로 일반적으로 10h이며, 이 값을 변경함으로써 올리디버거가 오작동하게 만들 수 있다고 알려져있다.

 

덤프 창에서 값을 수정해보자. 다시한번 강조하지만, 모든 값들은 리틀엔디안 방식으로 되어있다.


 

값들은 위에 나와있는 표에서 제시한 값으로 변경하면 된다.


   

변경된 부분은 저장한다.
우클릭 -> copy to excutable file -> 우클릭 -> save file

 

 
5. testing
 
패치한 프로그램을 재시작해보자.
우리는 즉각 EP 영역에 도달하며, 더이상 오류에 관한 메시지가 보이지 않는다. 또한, opcode가 덤프 창에 보인다.

메모리모듈을 다시한번 확인해보자! 정상적으로 모든 섹션을 볼 수 있다.
그리고 이전에는 사이즈가 5000이었는데 지금은 정상적으로 1000으로 돌아와있다.

그리고 실행해보자!

 

6. conclusing 
 
오류 메시지를 제거하는 방법을 배웠다. 물론, 더 쉬운 다른 방법들이 존재할 것이다.
하지만, 이번 강의의 목적은 리버서에게 꼭 필요한  PE Header에 관한 기본적인 지식들을 제공하는 것이었다.
부디, 모두가 쉽게 이해했기를 바라며 이번 장을 마치도록 하겠다.