정적분석 : PE파일 구조, 스택, 힙
https://learn.dreamhack.io/209#1
로그인 | Dreamhack
dreamhack.io
공부는 이곳에서 했다. 이미 알고 있는 지식도 같이 정리했다.
전체적인 틀
PE HEADER와 PE BODY(SECTION)으로 구분되는데 세부적으로 살펴보면
PE HEADER
PE HEADER -> IMAGE_DOS_HEADER MS-DOS Stub Program IMAGE_NT_HEADERS SECTION HEADER -> .text .data .rdata등 섹션에 대한 정보가 들어있다. |
PE BODY
SECTION -> .text .data .rdata등 여러개의 섹션이있다. |
SECTION에 세부적으로 알아보자.
.text setion
실행코드가 들어가는 부분이다. x64dbg로 F8을 눌러가며 실행시키는 부분이 아마 .text section?
읽기 권한 정적분석을 통해 각 섹션마다 권한을 확인하는 방법도 알아보자. 이전에 공부한 것 같지만 기억이 안난다.
.data section
프로그램이 컴파일 될 때 미리 생성해둔 전역변수가 들어간다.
아마 지역 변수도 이곳에서 생성되고 사라질 것으로 추정된다. 내일 확인해보자.
지역 변수는 스택에 저장된다.
읽기/쓰기 권한
.rdata section
프로그램이 컴파일 될 때 미리 생성해둔 전역상수가 들어간다.
예를 들면 C언어에서 #define으로 정의된 변수나
const int a = 100; <- const로 선언되면 a의 값은 고정되므로 전역상수이다.
그리고 char *a = "abcd"; <- 이것또한 전역상수가 된다. a가 상수 문자열로 취급됨.
이전에는 .idata section에 DLL함수나 외부 함수들이 저장되었지만 현재는 .rdata section에 저장된다.
읽기 권한
.bss section
.edata
.idata section
.rsrc section
스택
윈도우즈의 프로세스는 각 쓰레드마다 스택을 가지고 있다고 한다. <- 이 말 이해 잘 안 됨. 쓰레드에 대해 알아보자.
스택은 지역변수나 리턴할 함수의 주소를 주로 저장한다.
x64dbg로 리버싱을 하면서 자주 보았는데 프로그램을 실행하면서 함수를 만나면 스택프레임을 형성할 때 스택은 아래로 자란다. 즉 낮은 주소로 확장된다. 그리고 함수 내에서 변수를 선언할 때마다 RSP는 증가한다.
읽기/쓰기 권한
힙
동적으로 할당된 변수로부터 데이터를 받는다고만 알고 있었다.
용도가 다양하다고 한다. 모든 종류의 데이터가 저장될 수도 있다.
비교적 스택보다 큰 데이터를 저장할 수 있다.
실행 중 동적으로 할당된 데이터를 저장한다. malloc(), calloc() 등
전역적으로 접근이 가능하다.
힙이 사용되는 걸 본 적이 없어서 머리 속에 잘 정리가 안 된다.
읽기/쓰기 권한 상황에 따라 실행 권한도 가짐.