IT하는 참새

PE 05 본문

PE구조

PE 05

pshot 2017. 9. 2. 23:46

오늘의 목표:

 

서론:

 

프로그램이 실행되었다 -> 메모리에 올라갔다 -> 그럼 메모리상의 주소를 쓴다(VA)

 

우리는 여태까지 File형태로.. Offset인가 뭔지하는거로.. 주소를 찾아서 값을 읽었는데??

 

본론:

 

메모리상의 주소를 File형태에서의 Offset(RAW)로 변환하는 방법을 알아보자!

(그럼 편할듯 ㅇㅇ)

 

 

이걸 전문용어로 RVA to RAW 라고 합니다. (뭔가 있어보임)

 

다시 용어정리

 

VA = 가상메모리의 절대주소 (메모리 올라갔을때임)

RVA = 가상메모리의 상대주소 (메모리 올라갔을때임)

RAW(Offset) = File형태에서의 주소 (File 형태에서임)

 

VA = ImageBase + RVA라고 했었습니다.

 

됐고 변환하는 방법이나 봅시다.

 

1. RVA가 속해있는 Section을 찾아봅니다 (물론 PE View로 찾을거에요)

2. RAW = RVA - (Section의 RVA) + (Section의 Pointer to Raw Data)

 

저 과정을 거치면 나옵니다.

 

이거 제가한번 해보겠습니다.

-----------------------------

시나리오 시작

 

메모리상에서 ImageBase가 01000000으로 잡혔습니다.

 

 

내가 분석하고자하는 코드가 01005845주소라네요?

 

여기서 RVA를 구하면? 5845죠 네 맞아요

 

전 시간에 배운 Section을 생각해봅시다.

비슷한 성격의 코드들을 Section에 나누어서 넣는다고 했습니다.

 

그러면 이 RVA주소를 가진 코드도 어떤 성격에 따라서 어딘가의 Section에 저장되있을겁니다.

그걸 찾아야해요! PE View를 통해서 알아보겠습니다.

 

 

왼쪽에 보니까 Section들이 여러개 있네요.

 

그중에 .text Section Header에 가보았습니다.

이놈은 RVA가 1000이군요

즉 메모리에 올라가면 01001000부터 시작한다는 뜻이에요!!

근데 어디까지인지 모르겠어요. 그니까 두번째 Section인 .data로 가봅시다

 

 

 

두번째 Section은 RVA가 C000이네요.

 

---------------------------------------------------------------------------------------------------------추가설명 시작

 

그.렇.다.면! .text Section은 01001000 ~ 0100BFFF 까지입니다.

ImageBase 빼보면 RVA로 1000~BFFF까지 차지하고 있네요!

확인해봅시다. 배운거 써먹어야 안까먹고 기억에 남죠...

 

단순히 .text Section의 시작주소에서 .text Section의 크기를 더해주면 BFFF가 나오길 빌어봅시다

(우리는 지금 메모리에 올라갔을때를 가정하고있으니 Virtual Size를 더해줘야 겠죠?)

01001000+A6FC = 0100B6FC ?????         0100BFFF    안나오는데요?

 

여기서 하나 빼먹은 개념이 있습니다. 전에 말했던 SectionAlignment, FileAlignment 얘네들!

 

SectionAlignment : 메모리에 올라갔을때의 Section의 최소단위(배수)

FileAlignment: 파일상태에서의 Section의 최소단위(배수)

 

이랬죠... 이제 감이 올겁니다.

그럼 얘네는 어디에 기술되어 있었죠?? IMAGE_OPTIONAL_HEADER 구조체에 있었습니다.

 

다시한번 이 프로그램의 IMAGE_OPTIONAL_HEADER를 보겠습니다.

 

SectionAlignment : 1000

FileAlignment : 200

이래요

 

그럼 다시생각해봅시다

 

우리는 ImageBase = 01000000에서 .text Section의 RVA를 더했더니 01001000이 되었고,

아까 위에서 5845라는 RVA값이 어디 Section에 속해있는지 알기위해

먼저 .text Section이 어디까지 차지하고 있는지 알아가던 중 size를 더했더니

다음 Section의 시작주소와 일치하지 않았습니다.

 

그 때 이렇게 더했었죠

 

01001000+A6FC = 0100B6FC 이렇게 나왔습니다.

 

Section이 메모리에 올라갔을때의 크기가 A6FC라고 나와있었다고 이걸 그대로 더해버렸어요!

SectionAlignment를 고려하지 않았습니다.

고려하면 어떻게되죠?? A6FC를 최소단위 1000으로 표현한다면?? 네 B000이 됩니다.

(이유는 정말 쉽기때문에 생략)

 

다시 더해봅시다

01001000+B000= 0100C000 드디어 원하는 값이 나왔어요... .data Section의 시작주소와 일치함

 

추가설명 끝

---------------------------------------------------------------------------------------------------------

 

그럼 우리가찾는 RVA값인 5845얘는 .text Section에 포함되어 있다는걸 알아냈습니다.

 

이걸 RAW로 바꿔보겠습니다. 거의 다 왔네요

 

5845 - (해당 Section의 RVA) + (해당 Section의 File형태일때의 시작주소)

5845 - 1000 + 400 = 4C45

 

즉 메모리에 올라가있는 5845라는값을 조사해보고 싶어서 File Offset(RAW)로 바꾼결과 : 4C45

 

그럼 4C45 Offset가서 찾아보면 되는겁니다.

 

RVA to RAW 기법이였습니다.

 

-끝-

 

---------------------------------------------------------------------------------------------------------

 

다음이야기:

 

조금 새로운 개념이 나옵니다. dll의 맛보기 랄까

하지만 매우 중요한개념입니다.

프로그램과 dll의 관계라고도 할 수 있습니다.

'PE구조' 카테고리의 다른 글

PE 04  (0) 2017.09.02
PE 03  (0) 2017.09.02
PE 02  (0) 2017.09.02
PE 01  (0) 2017.09.02
PE구조 시작하기전에  (0) 2017.09.02