본문 바로가기

카테고리 없음

[Dreamhack] PIE & RELRO - 티스토리

먼저 PIE는 Position - Independent Executable의 약자로 위치 독립적인 실행 파일이란 뜻이다

 

 

 

즉, 무작위 주소에 매핑되어도 실행 가능한 파일이란 말이다 -> 공유 오브젝프 파일의 파일 형태를 가짐

 

 

 

PIC는 Position - Independent Code의 약자로서 위치 독립적인 코드이다

 

 

 

즉, 어느 주소에 있어도 의미가 훼손 되지 않는 코드이며 PIE는 PIC이다 

 

 

 

PIC는 무작위 주소에 매핑 되므로 주소를 참조할 때 상대주소 (rip을 기준으로 거리 계산 값)를 사용해서 주소를 참조하고

 

PIC가 아닌 코드는 절대주소 (해당 값의 메모리 내 절대적인 주소 값)을 직접 참조해서 사용한다

pic 예제 코드

 

pic가 적용되지 않은 코드이다

 

 

 

%s 문자열을 참조할 때 '0x4005a1'이라는 메모리 내 절대 주소를 사용하는 것을 볼 수 있다

 

 

 

pic가 적용된 코드이다

 

 

 

%s 문자열을 rip - 0xa2라는 주소로 rip기준 상대주소를 활용해 참조하고 있다

 

 

pic적용 -> 메모리 내 무작위 주소로 매핑

 

 

파일 정보를 확인해 보면 pic가 적용된 pic 파일은 공유 라이브러리 파일 형식이고

 

 

pic가 적용되지 않은 no_pic파일은 그냥 실행 파일인 것을 확인 가능하다

 

 

 

 

RELRO 실습을 위한 예제 코드이다 

 

 

자신의 메모리 맵을 출력해주는 코드이다

 

 

 

 

 

 

파일 실행 결과를 보면 prelro 실행 파일에서 쓰기 권한은 00601000 ~ 00602000 영역에 할당된 것을 볼 수 있다.

 

 

해당 파일의 헤더 정보를 보면 쓰기 가능한 영역에는 .got.plt, .data, .bss영역이 할당 되어 있다

 

 

 

 

** 스택과 힙은 프로그램 실행 중에 동적으로 늘어나기 때문에 명시가 안됨

** 또한 실행파일과 라이브러리는 각각 독립된 메모리 영역을 사용함, bss영역이 각각 따로 존재

 

 

 

FULL RELRO가 적용된 바이너리

 

 

 

PIE가 적용되어 바이너리가 계속 다른 곳에 매핑되는 것을 볼 수 있다

 

 

 

offset을 비교해보면 got 영역에는 이번에 쓰기 권한이 없는 것을 확인할 수 있다.

 

 

FULL RELRO파일 헤더 정보 확인 시 offset 형태로 나온 이유는 무작위 매핑 되기 때문에 아직 결정되지 않은 메모리 주소여서 그런 것 같다

 

FULL RELRO 시 -> data, bss 영역만 쓰기 가능
Got도 읽기 전용이됨 -> 따라서 프로세스 로딩 시
모든 함수 주소가 바인딩되고, 함수 첫 호출 시에도
바로 GOT테이블 참조 후 실행함

 

 

결론

: Partial RELRO의 경우 got overwrite 가능, FULL RELRO의 경우 got overwrite 불가능 -> hook overwrite