일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 딥러닝 공부
- 흰날개해오라기
- 참새목
- django
- AI역량평가
- 가마우지과
- 참새과
- 백로과
- 비둘기목
- keras
- SimpleCraft
- 직박구리과
- 한국의새
- 오리과
- 딱다구리과
- python3
- AI전략게임
- 한국의 새
- 맑은소리 스피치학원
- Python
- structured_array
- ADsP
- 비둘기과
- 계수정렬
- 딥러닝공부
- 기러기목
- 솔딱새과
- IBK기업은행 인턴
- Birthday paradox
- 생일문제
- Today
- Total
진박사의 일상
[컴보] 12강 - 포인터 본문
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 가능) -> 수정이 가능하다면 공격자가 원하는 함수를 실행 가능

- 윈도우에서는 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로 바꿔치기

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 |