본문 바로가기

High Level Technique/Reversing

IMAGE_SECTION_HEADER



각 Section에 대한 이름을 비롯해 시작 주소와 사이즈 등의 정보를 관리하는 구조체 입니다.





I


Name

 섹션이 이름을 나타내는 멤버입니다.. 이 이름으로 섹션의 성격을 파악해서는 안 됩니다. 이유는 이 값이 NULL일 수도 있고 이름이 같다고 같은 속성을 갖는 것이 아니며  C언어처럼 NULL로 끝나는 것  도 아니고 ASCII 값만 와야한다는 제한도 없습니다. 섹션의 속성을 파악하기 위해서 Characteristics멤버를 참조해야 합니다.

 

    .text: 실행되는 코드들

    .data: 초기화된 전역변수를 담고 있는 읽고 쓰기가 가능한 섹션

    .rdtata: 읽기 전용 데이터 섹션, 문자열 표현이나 C++/com 가상 함수 테이블

    .bss: 초기화되지 않은 전역 변수들을 위한 섹션

    .idata: 다른 DLL로부터 가져다 쓰는 함수들의 정보. IMAGE_IMPORT_DESCRIPTOR의 배열로 이루어져 있다.

    .edata: 다른 모듈이 이 파일을 사용할 때 사용하도록 해놓은 함수리스트.

 




VirtualAddress

메모리에 올려진 후에 해당 섹션의 어느 주소에 위치하는지의 RVA주소 값으로 가지고 있다.

, 메모리에서 해당 섹션의 위치를 나타낸다.

이 값은 IMAGE_OPTIONAL_HEADERSectionAlignment의 배수 값을 갖는다. ImageBase를 기준으로 하는 RVA 이라는 것에 주의한다.

 




SizeOfRawData

파일에서 섹션이 차지하는 크기를 나타낸다. 해당 섹션의 빈 공간이 얼마나 있는가를 위해서 반드시 필요한데, 프로그램 이 실행할 코드들을 채우고 난 나머지 영역(빈 공간)을 내 뜻대로 조작할 수 있게 되기 때문이다.

이 때 빈공간이 생기는 이유는 FileAlignment의 배수로 공간을 할당하기 때문이다.

 




PointerToRawData

파일에서 섹션이 시작하는 위치 값이다. IMAGE_OPTIONAL_HEADERFileAlignment의 배수 값을 갖는다.




Characteristics

섹션에 대한 속성정보를 플래그로 가지고 있다. 이 속성 값을 변경함으로써 쓰기가 금지된 섹션에 쓰거나 쓸 수 있는 섹션이 쓰기를 금지 시킬 수도 있다.



 

만약 Characteristics의 값이 0x06000020이라면 0x00000020(코드영역)으로 0x04000000(읽기), 0x02000000(쓰기)가 가능하다는 의미이다. 이 값은 0x04000000 OR 0x02000000 OR 0x00000020를 하면 된다. (OR연산)