[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로 잡힌것입니다! 이건 어떻게 아냐구요?
3. Exploit Technique?
PIE도 ASLR과 비슷한 맥락의 exploit이 이루어 집니다. PIE자체도 바이너리 영역까지 수준에서의 ASLR이라고 생각하면 되니까요.
즉, 프로그램이 실행 중에 있을 때 PIE base를 leak할 수 있다면, 그를 기반으로 함수들에 대한 offset을 구하여 exploit을 진행해주면 됩니다. 생각보다 간단하져?
마무리하도록 하겠습니다.
0. Abstract : dokhakdubini.tistory.com/297
1. ASLR(Address Space Layout Randomization) : dokhakdubini.tistory.com/298
2. Canary : dokhakdubini.tistory.com/299
3. NX(with DEP) : dokhakdubini.tistory.com/300
4. PIE<---- You are HERE
5. ASCII ARMOR
'Coding_Algorithm > Operating System' 카테고리의 다른 글
[Kernel] System Call에 대하여 (0) | 2021.04.02 |
---|---|
[운영체제] 실습 1회차 필기 (0) | 2021.04.01 |
[linux] 3. NX(with DEP)에 대하여 (0) | 2020.10.13 |
[linux] 2. Canary에 대하여 (0) | 2020.10.13 |
[linux] 1. ASLR(Adress Space Layout Randomization)에 대하여 (0) | 2020.10.11 |