[linux] 4. PIE에 대하여

두비니

·

2020. 11. 27. 06:38

 


PIE

Position Independent Execution

Linux Memory Protection - 4


 

 

 

1. What is PIE?

 

리눅스 보호기법의 마지막, PIE입니다. 우선 PIE는 Position Independent Execution의 약자로, 해석하면 "위치 독립 실행"이라는 뜻입니다. 그럼 파일이 위치 독립적으로 실행되면 어떤 일이 생기는지 봅시다.

 

결론적으로 PIE 보호기법이 적용되면 실행할 때마다 바이너리의 주소가 랜덤화 됩니다. 무슨 말인지 잘 모르겠다구요? 아래 캡쳐본을 봅시다.

 

 

다음과 같이 스택을 제외한 바이너리의 주소까지도 offset만을 가지고 있고, 실행시 바뀌게 됩니다. 실습으로 직접 해보는 걸로 합시다.

 +) 당연히 gdb-peda의 checksec로 확인 가능합니다.

  

 

2. Training

 

이번에도 Canary때부터 썼던 예제를 변경하여 사용하도록 하겠습니다.

코드를 저렇게 작성한 이유는 다양한 함수를 호출해서 차이점을 확인해보기 위함입니다.

 

#include <stdio.h>
#include <stdlib.h>

/*

	*PIE OFF*
	gcc -m32 -mpreferred-stack-boundary=2 pie.c -o pieOFF
	*PIE ON*
	gcc -m32 -mpreferred-stack-boundary=2 -fPIE -pie pie.c -o pieON

*/

int main()
{
	char buf[256];

	puts("Hello");
	printf("addr : %p\n", buf);
	gets(buf);
	system("ls -al");

	return 0;
}

 

컴파일 옵션에 대한 설명입니다.

 

  • -m32 : 32비트로 컴파일
  • -mpreferred-stack-boundary=2 : 스택 간 더미 없애는 옵션
  • -fno-stack-protector : canary를 끄는 옵션
  • -fPIE -pie : PIE 보호기법을 끄는 명령어

 

우선 pieOFF부터 분석해봅시다.

 

 

일반 실행파일의 경우 정해진 주소에 코드가 위치합니다. 또한 puts, printf, gets등 함수의 plt도 고정된 주소(0x0804~)에 있는 것을 확인할 수 있습니다. 실제로 여러번 실행하더라도 같은 주소에 있는 것을 확인할 수 있습니다.

초~중급 문제들은 모두 PIE가 걸려있지 않기 때문에 이 화면이 더 익숙하다고 느끼는 사람들도 많을 것 같습니다.

 

그럼 이제 pie가 적용된 파일을 봅시다.

 

 

이전 파일보다 바뀐 점은 쉽게 확인할 수 있습니다. 주소가 눈에 띄게 줄어든 것을 볼 수 있습니다. 함수들의 주소들이 0x1000을 넘어가지 않는 것을 볼 수 있습니다. 아 그냥 원래 주소가 그럴 수도 있는거 아니냐구요? 그럼 실행을 시켜봅시다.

 

 

다음은 단순히 main함수의 시작에 breakpoint를 걸어두고 실행 뒤 main함수를 다시 확인한 결과입니다. 바뀐 것을 확인할 수 있죠? 조금 더 원리에 기반해서 설명을 하자면, code영역의 시작이 0x56555000로 잡힌것입니다! 이건 어떻게 아냐구요?

 

vmmap으로영

 

 

3. Exploit Technique?

 

PIE도 ASLR과 비슷한 맥락의 exploit이 이루어 집니다. PIE자체도 바이너리 영역까지 수준에서의 ASLR이라고 생각하면 되니까요.

 

즉, 프로그램이 실행 중에 있을 때 PIE base를 leak할 수 있다면, 그를 기반으로 함수들에 대한 offset을 구하여 exploit을 진행해주면 됩니다. 생각보다 간단하져? 

 

 

마무리하도록 하겠습니다.

 

 

 


 

0. Abstract : dokhakdubini.tistory.com/297

 

[linux] 메모리 보호기법 - abstract

이번주는 메모리 보호기법에 대해서 서술해보려고 합니다. 일단 메모리 보호기법 자체에 대한 정의를 알아봅시다. 메모리 보호는 컴퓨터 메모리의 사용을 제어하는 방법이며 모든 운영 체제에

dokhakdubini.tistory.com

 

1. ASLR(Address Space Layout Randomization) : dokhakdubini.tistory.com/298

 

[linux] ASLR(Adress Space Layout Randomization)에 대하여

ASLR Address Space Layout Randomization 1. What is ASLR? 자 오늘은 리눅스 메모리 보호기법 첫 번째 입니다. ASLR에 대해서 배워 볼 건데요, 일단 ASLR이란 Address Space Layout Randomization의 줄임말입니..

dokhakdubini.tistory.com

2. Canary : dokhakdubini.tistory.com/299

 

[linux] Canary에 대하여

Canary Linux Memory Protection - 2 1. What is Canary? **Stack Smashing Detected** 빼앵앵애ㅐㅇ애에에ㅔㅔㄱ Canary기법이란 'buffer와 SFP(Stack Frame Pointer) 사이에 buffer overflow를 탐지하기 위한 임..

dokhakdubini.tistory.com

3. NX(with DEP) : dokhakdubini.tistory.com/300

 

[linux] 3. NX(with DEP)에 대하여

NX(with DEP) Non-Executable / Data Execution Protection Linux Memory Protection - 3 1. What is NX/DEP? NX와 DEP는 둘 다 같은 개념의 보호기법으로 각각 Non executable과 Data Execution Protection의 약..

dokhakdubini.tistory.com

4. PIE<---- You are HERE

5. ASCII ARMOR