IT하는 참새
PE 05 본문
오늘의 목표:
서론:
프로그램이 실행되었다 -> 메모리에 올라갔다 -> 그럼 메모리상의 주소를 쓴다(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의 관계라고도 할 수 있습니다.