일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Javascript
- HTML
- Python
- 웹페이지 만들기
- 파이썬
- 백준
- 자료구조 복습
- BOJ Python
- Sookmyung Information Security Study
- WarGame
- lob
- hackctf
- 풀이
- 머신러닝
- c++
- C언어
- hackerrank
- siss
- XSS Game
- PHP 웹페이지 만들기
- 숙명여자대학교 정보보안 동아리
- c
- BOJ
- CSS
- 숙명여자대학교 정보보안동아리
- SWEA
- 생활코딩
- 기계학습
- The Loard of BOF
- 드림핵
- Today
- Total
혜랑's STORY
[System Hacking STAGE 7] Background: PIE 본문
[System Hacking STAGE 7] Background: PIE
hyerang0125 2022. 2. 6. 21:32
시작하며
ASLR이 적용되며 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등이 무작위 주소에 매핑되므로, 공격자가 이 영역들을 공격에 활용하기 어려워졌다. 그런데 코드 영역의 주소는 고정되어 있기 때문에 공격자는 고정된 주소의 코드 가젯을 활용하여 ROP를 수행할 수 있었다.
이번에 다룰 Position-Idependent Executable(PIE)은 ASLR이 코드 영역에도 적용되게 해주는 기술이다. 이 기술은 엄밀하게 말하자면 보호 기법은 아니지만 ASLR과 맞물려 공격을 더욱 어렵게 만들었기에 보호 기법이라 소개되기도 한다.
Mitigation: NX & ASLR에서 사용한 예제 코드를 실행한 결과이다.
PIC와 PIE
- PIC
리눅스에서 ELF는 실행 파일(Executable)과 공유 오브젝트(Shared Object, SO)로 두 가지가 존재한다. 실행 파일은 addr처럼 일반적인 실행 파일이 해당하고, 공유 오브젝트는 libc.so와 같은 라이브러리 파일이 해당된다.
공유 오브젝트는 기본적으로 재배치(Relocation)이 가능하도록 설계되어 있다. 재배치가 가능하다는 것은 메모리의 어느 주소에 적재되어도 코드의 의미가 훼손되지 않음을 의미하는데, 컴퓨터 과학에서는 이런 성질을 만족하는 코드를 Prosition-Independent Code(PIC)라고 부른다.
gcc는 PIC 컴파일을 지원한다. 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;
}
"%s" 문자열을 printf에 전달하는 방식이 조금 다르다.
pic 적용 x
0x4005a1이라는 절대적인 주소로 문자열을 참조
pic 적용
문자열의 주소를 rip + 0xa2로 참조
즉, no_pic는 바이너리가 매핑되는 주소가 바뀌면 0x4005a1에 있던 데이터도 함께 이동하므로 코드가 정상적으로 실행이 불가능하지만, pic의 경우 rip를 기준으로 데이터를 상대 참조(Relatice Addressing)하기 때문에 바이너리가 무작위 주소에 매핑돼도 제대로 실행될 수 있다.
- PIE
Position-Independent Executable(PIE)은 무작위 주소에 매핑돼도 실행 가능한 실행 파일을 뜻한다. ASLR 도입 이후 실행 파일의 형식을 변경하지 않고 원래 재배치가 가능했던 공유 오브젝트를 실행 파일로 사용한다.
실제로 리눅스의 기본 실행 파일 중 하나인 /bin/ls는 공유 오브젝트 형식을 띄고 있다.
- PIE on ASLR
PIE는 재배치가 가능하므로, ASLR이 적용된 시스템에서는 실행 파일도 무작위 주소에 적재된다. 위에서 사용한 예제를 이번에는 PIE를 적용하여 컴파일하고 실행 결과를 살펴보자.
PIE가 적용되자 main 함수(코드 영역)의 주소가 매 실행마다 바뀌고 있다.
PIE 우회
1. 코드 베이스 구하기
ASLR 환경에서 PIE가 적용된 바이너리는 실행될 때 마다 다른 주소에 적재된다. 그래서 코드 영역의 가젯을 사용하거나, 데이터 영역에 접근하려면 바이너리가 적재된 주소를 알아야 한다. 이 주소를 PIE 베이스, 또는 코드 베이스라고 부른다. 코드 베이스를 구하려면 라이브러리의 베이스 주소를 구할 때 처럼 코드 영역의 임의 주소를 읽고, 그 주소에서 오프셋을 빼야한다.
2. Partial Overwrite
코드 베이스를 구하기 어렵다면 반환 주소의 일부 바이트만 덮는 공격을 고려해볼 수 있다. 이러한 공격 기법을 Partial Overwrite이라 부른다. 일반적으로 함수의 반환 주소는 호출 함수(Caller)의 내부를 가리킨다. 특정 함수의 호출 관계는 정적 분석 또는 동적 분석으로 쉽게 확인할 수 있으므로, 공격자는 반환 주소를 예측할 수 있다.
ASLR의 특성 상, 코드 영역의 주소도 하위 12비트 값은 항상 같다. 따라서 사용하려는 코드 가젯의 주소가 반환 주소와 하위 한 바이트만 다르다면, 이 값만 덮어서 원하는 코드를 실행시킬 수 있다. 그러나 만약 두 바이트 이상이 다른 주소로 실행 흐름을 옮기고자 한다면, ASLR로 뒤섞이는 주소를 맞춰야 하므로 브루트포싱이 필요하며, 공격이 확률에 따라 성공하게 된다.
'무지성 공부방 > Dreamhack SystemHacking' 카테고리의 다른 글
[System Hacking STAGE 7] Exploit Tech: Hook Overwrite (0) | 2022.02.09 |
---|---|
[System Hacking STAGE 7] Background: RELRO (0) | 2022.02.09 |
[System Hacking STAGE 6] basic_rop_x86 (0) | 2022.02.06 |
[System Hacking STAGE 6] basic_rop_x64 (0) | 2022.02.06 |
[System Hacking STAGE 6] Exploit Tech: Return Oriented Programming (0) | 2022.02.06 |