ASLR
이 코드 영역에도 적용되게 해주는 기술
리눅스에서
ELF
는 실행 파일과 공유 프로젝트 두 가지가 존재한다.
- 실행 파일 : 일반적인 실행 파일
- 공유 오브젝트 :
libc.so
와 같은 라이브러리 파일
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
로 참조한다.
Position-Independent Executable
무작위 주소에 매핑돼도 실행 가능한 실행 파일
PIE
가 적용되면 모든 주소가 실행마다 변하게 된다.PIE 우회
PIE
가 적용된 바이너리는 실해오딜 때마다 데이터가 다른 주소에 적재된다.
코드 영역의 가젯을 사용하거나, 데이터 영역에 접근하려면 적재된 주소를 알아야 한다.
→ PIE 베이스 or 코드 베이스
코드 베이스를 구하려면 라이브러리의 베이스 주소를 구할 때 처럼
코드 영역의 임의 주소를 읽고, 그 주소에서 오프셋을 빼야 한다.Partial Overwrite
반환 주소의 일부 바이트만 덮는 공격
일반적으로 함수의 반환주소는 호출 함수(Caller)의 내부를 가리킨다.코드 영역의 주소도 하위 12비트 값은 항상 같다.
사용하려는 코드 가젯의 주소가 반환 주소와 하위 한 바이트만 다르다면,
이 값만 덮어서 원하는 코드를 실행시킬 수 있다.