본문 바로가기
Pwnable/Techniques

PIE

by Anatis 2021. 12. 29.

PIC와 PIE

PIC

리눅스에서 ELF 실행 파일(Executable)과 공유 오브젝트(Shared Object, SO)로 두 가지가 존재한다. 실행 파일은 addr 처럼 일반적인 실행 파일이 해당하고, 공유 오브젝트는 libc.so와 같은 라이브러리 파일이 해당한다.

 

공유 오브젝트는 기본적으로 재배치(Relocation)가 가능하도록 설계되어 있다. 이는 메모리의 어느 주소에 적재되어도 코드의 의미가 훼손되지 않음을 의미한다. 이를 Position-Independent Code(PIC)라고 한다.

 

// Name: pic.c
// Compile: gcc -o pic pic.c
//        : gcc -o no_pic pic.c -fno-pic -no-pie

#include <stdio.h>

char *data = "Hello World!";

int main()
{
    printf("%s", data);
    return 0;
}

no_pic의 main 함수를 보면 main+14에서 %s문자열을 printf에 전달할땐 절대 주소로 문자열을 참조한다.

 

pic는 문자열의 주소를 rip+0xa2로 참조하고 있다.

 

바이너리가 매핑되는 주소가 바뀌면 0x4005a1에 있던 데이터도 함께 이동하므로 no_pic의 코드는 제대로 실행되지 못한다. 하지만 pic의 코드는 rip를 기준으로 데이터를 상대 참조하기 때문에 바이너리가 무작위 주소에 매핑돼도 제대로 실행될 수 있다.

 

PIE

Position-Independent Executable(PIE)은 무작위 주소에 매핑돼도 실행 가능한 실행 파일을 뜻한다. ASLR이 도입되기 전에는 실행 파일을 무작위 주소에 매핑할 필요가 없었다. 이 때문에 리눅스에서 실행 파일 형식은 재배치를 고려하지 않았다. ASLR이 도입되고 실행 파일도 무작위 주소에 매핑될 수 있게 하기 위해 공유 오브젝트를 실행 파일로 사용해 재배치가 가능하게 했다.

 

PIE 우회

코드 베이스 구하기

코드 베이스 구하는법은 ROP를할 때 libc base 주소를 구하는 과정과 크게 다르지 않다.

 

Partial Overwrite

코드 베이스를 구하기 어려울때 반환 주소의 일부 바이트만 덮는 공격을 고려해볼 수도 있다. 이러한 공격을 Partial Overwrite라고 한다.

 

일반적으로 함수의 반환 주소는 호출 함수(Caller)의 내부를 가리킨다. 특정 함수의 호출 관계는 정적 분석 또는 동적 분석으로 쉽게 확읺라 수 있다. ASLR의 특성 상, 코드 영역의 주소도 하위 12비트 값은 항상 같다. 사용하려는 코드 가젯의 주소가 반환 주소와 하위 한바이트만 다르면, 이 값만 덮어서 원하는 코드를 실행시킬 수 있다.

'Pwnable > Techniques' 카테고리의 다른 글

RELRO  (0) 2021.12.29
RELRO  (0) 2021.12.29
Exploit Tech: Return Oriented Programming  (0) 2021.12.27
Exploit Tech: Return to Library  (0) 2021.12.24
Library - Static & Dynamic Link  (0) 2021.12.23

댓글