Background : PIE

곽무경·2022년 7월 5일
0

System Hacking

목록 보기
18/27

ASLR코드 영역에도 적용되게 해주는 기술

리눅스에서 ELF실행 파일공유 프로젝트 두 가지가 존재한다.

  • 실행 파일 : 일반적인 실행 파일
  • 공유 오브젝트 : libc.so와 같은 라이브러리 파일

PIC

Position-Independent-Code
재배치가 가능하도록 (메모리의 어느 주소에 적재되어도 코드의 의미가 훼손되지 않도록)
설계된 코드
gcc는 PIC 컴파일을 지원한다.

#include <stdio.h>
char *data = "Hello World!";
int main() {
  printf("%s", data);
  return 0;
}
  • pic가 적용되지 않은 바이너리

    printf의 %p 문자열을 절대 주소 0x402011로 참조하고 있다.
  • pic가 적용된 바이너리

    문자열의 주소를 rip+0xec3 로 참조한다.

PIE

Position-Independent Executable
무작위 주소에 매핑돼도 실행 가능한 실행 파일
PIE가 적용되면 모든 주소가 실행마다 변하게 된다.

PIE 우회

PIE 가 적용된 바이너리는 실해오딜 때마다 데이터가 다른 주소에 적재된다.
코드 영역의 가젯을 사용하거나, 데이터 영역에 접근하려면 적재된 주소를 알아야 한다.
PIE 베이스 or 코드 베이스
코드 베이스를 구하려면 라이브러리의 베이스 주소를 구할 때 처럼
코드 영역의 임의 주소를 읽고, 그 주소에서 오프셋을 빼야 한다.

Partial Overwrite

반환 주소의 일부 바이트만 덮는 공격
일반적으로 함수의 반환주소는 호출 함수(Caller)의 내부를 가리킨다.

코드 영역의 주소도 하위 12비트 값은 항상 같다.
사용하려는 코드 가젯의 주소가 반환 주소와 하위 한 바이트만 다르다면,
이 값만 덮어서 원하는 코드를 실행시킬 수 있다.

0개의 댓글