진박사의 일상

[컴보] 12강 - 포인터 본문

프로그래밍/공부

[컴보] 12강 - 포인터

진박사. 2021. 12. 6. 16:44

Pointer subterfuge(포인터 속임수) == 포인터 값 변경

- 데이터 주소값이 변경되면 공격자가 원하는 코드가 실행되도록 바꿀 수 있음.

 

Data Locations

- 버퍼오버플로우로 포인터 덮어씌우기 가능 : 방지 (upper bound, lower bound, Hi, Lo, special marker(null같은) 제한)

- 공격 가능 조건 : (1) 함수/데이터 포인터가 동일 세그먼트에 할당 or (2) 메모리 주소보다 낮은 위치에 존재 (3) 바운드체킹x

 

Data declaration & Process memory organization

UNIX의 메모리는 여러 세그먼트로 나뉨. 실행 가능은 data영역과 BSS영역

- data 세그먼트는 초기화된 전역변수랑 상수 포함 / BSS 영역은 초기화되지 않은 전역변수 포함

변수별 할당 위치

- 같은 세그먼트에 버퍼오버플로우 취약점과 함수 포인터가 있어야 공격 가능

 

데이터 포인터

- 동적할당 구조체, call-by-reference인 함수 매개변수, 배열, 데이터 구조 등

 

함수를 그냥 호출하는 것과 함수 포인터로 실행하는 경우의 차이점

함수 포인터로 접근 시에는 한 단계를 더 거치므로 거기서 포인터 주소의 변경으로 다른 함수가 실행되게 할 수 있다.

정적 호출은 문제 없지만 함수 포인터를 이용한 간접 참조로 인한 호출은 간접 주소가 덮어씌워질 수 있다.

 

Global Offset Table(GOT)

- 라이브러리 함수의 주소를 알아내기 위한 테이블. 윈도우는 안전, 리눅스는 공격가능 - 리눅스의 실행 가능 함수 포맷은 (Executable and Linking Format(ELF)) - GOT를 가지고 있음

- 라이브러리 함수에 대한 절대주소를 가지고 있음.(프로그램에 독립적임), 라이브러리 함수는 프로그램의  GOT에 동적으로 연결(Run-Time Linker) -> 그 이후부터는 Linker를 거치지 않고 GOT를 확인하여 실제 주소를 참고함. -> GOT를 수정할 수 있다면 공격자가 원하는 함수를 호출 가능

-> GOT의 주소는 고정되어있음 / ELF 실행파일의 GOT 주소도 고정 / (objdump -dynamic-reloc xx 명령어 사용시 GOT를 dump 가능) -> 수정이 가능하다면 공격자가 원하는 함수를 실행 가능

exit함수는 모든 프로그램에서 반드시 사용 -> 이 주소를 바꾸면 프로그램 종료시 원하는 함수로 공격 가능

- 윈도우에서는 ELF와 비슷한 Portable Executable(PE) file format 사용 -> GOT 대신 imported DLL인 Import Address Table(IAT)를 사용 -> IAT는 쓰기 제한이 걸려있음 -> 변경 불가하므로 윈도우에서는 공격 불가

 

.dtors Section

- .drots Section에 GCC에 의해 생성되는 함수 포인터를 덮어씌울 수 있음. -> 객체 생성/파괴 시 발생하는 constructor랑 desctructor 함수 덮어씌우기 - main 전에 constructor, main 이후에 destructor

- .dtors에 있는 destructor의 주소를 바꾸면 공격자 원하는 코드 실행 가능

- 공격자의 장점 : .dtors는 항상 메모리에 매핑 / 단점 : 쉘코드를 삽입할 정확한 위치 찾기 어려움.

 

Virtual Pointers (C++)

- Virtual Functions : 클래스의 멤버 함수 (virtual 키워드 사용) - 자바의 abstract 메서드같은거 - 자식 클래스가 override

- 파생 클래스는 부모 클래스의 base pointer를 할당해서 함수 호출

C++은ㅇ virtual function의 pointer를 Virtual Function Table(VFBL)에 가지고 있음. 포인터 주소를 바꿀 수 있으면 공격 가능

- VTBL의 함수 포인터를 덮어씌우거나 VTBL 자체를 다른 VTBL로 바꿔치기

VTBL 자체를 바꿔치기 하거나 VTBL의 VPTR가 다른 함수를 가리키도록 덮어씌우거나

atexit() & on_exit()

- atexit()는 프로그램 종료시 실행할 함수를 지정 가능 - 최대 32개의 함수를 등록할 수 있음.

- on_exit()은 SunOS에서 비슷한 역할을 하는 함수

Exception Handling

- try catch finally

- exception handler가 stack frame에 저장됨 -> stack overflow 발생시 exception 발생시의 이동 위치를 바꿀 수 있음.

 

Migitation Strategies

- 소스코드에서 취약점 제거 + 런타임에서도 막고

- stack canaries, W XOR X 전략, Encode/decode function pointers

 

Encode/decode function pointers

- function pointer를 암호화/복호화 하기 -> 공격자가 원하는 코드로 이동 불가능

 

'프로그래밍 > 공부' 카테고리의 다른 글

[데베시] 12강  (0) 2021.12.07
생일 문제(Birthday Paradox) - Python  (0) 2021.12.06
[데베시] 10강  (0) 2021.11.24
[데베시] 9장 복잡한 SQL  (0) 2021.11.20
[컴보] 10장 - Buffer Overflow  (0) 2021.11.15