1. 버퍼 오버플로우란?
- 버퍼: 지정된 크기의 메모리 공간
- 버퍼 오버플로우: 버퍼가 허용할 수 있는 양의 데이터보다 더 많은 값이 저장되어 버퍼가 넘치는 취약점
- 발생하는 위치에 따라 스택 버퍼 오버플로우, 힙 오버플로우로 나뉨
- 스택 버퍼 오버플로우: 지역 변수가 할당되는 스택 메모리에서 오버플로우가 발생하는 경우
- 버퍼 A가 8바이트, 버퍼 B가 8바이트일 때 16바이트의 데이터가 버퍼 A에 복사되면 이 데이터의 뒷부분은 B에 쓰여짐 (버퍼 오버플로우). 이는 프로그램의 Undefined Behavior를 이끌어냄.
- 만약 데이터 영역 B에 나중에 호출될 함수 포인터를 저장하고 있다면 이 값을 "AAAAAAAA"와 같은 데이터로 덮었을 때 Segmentation Fault를 발생시킴. 이를 악용해 공격.
2. 스택 버퍼 오버플로우 - ex1
- stack-1.c는 16바이트 버퍼 buf를 스택에 할당한 후 gets함수를 통해 데이터를 입력 받아 그대로 출력하는 코드
- gets함수에는 별도의 길이 제한이 없으므로 16바이트가 넘는 데이터를 입력하면 스택 버퍼 오버플로우 발생
3. 스택 버퍼 오버플로우 - ex2
- stack-2.c의 main함수는 argv[1]을 check함수의 인자로 전달 후 리턴 값을 받아옴. 리턴 값이 0이 아니라면 "Hello Admin!"을, 0이라면 "Access Denied!"라는 문자열을 출력함.
- check함수에서는 16바이트 크기의 temp 버퍼에 입력받은 패스워드를 복사 후 "SECRET_PASSWORD" 문자열과 비교함. 문자열이 같다면 auth 변수를 1로 설정하고 auth를 리턴함.
- 그러나 strncpy함수를 통해 temp 버퍼를 복사할 떼, temp의 크기인 16바이트가 아닌 인자로 전달된 password 문자열의 길이만큼을 복사함. 따라서 argv[1]에 16바이트가 넘는 문자열을 전달한다면 길이 제한 없이 문자열이 복사되어 스택 버퍼 오버플로우가 발생.
- temp 버퍼 뒤에 auth 값이 존재하므로, 오버플로우가 발생해 공격자의 데이터가 auth 값을 바꾼다면 auth가 0이 아닌 다른 값이 될 수 있음. 이 경우 if(check_auth(argv[1]))문은 항상 참을 반환.
4. 스택 버퍼 오버플로우 - ex3
- stack-3.c의 main함수는 24바이트 크기의 버퍼 buf를 할당함. scanf함수를 통해 size 변수에 값을 입력받고, size만큼 buf에 데이터를 입력받음.
- 고정된 크기의 버퍼보다 더 긴 데이터를 입력받아 스택 버퍼 오버플로우가 발생함.
5. 스택 버퍼 오버플로우 - ex4
- stack-4.c는 32바이트 크기 buf를 초기화한 후 데이터를 31바이트 입력받고, sprintf함수를 통해 문자열을 저장한 뒤 출력하는 코드
- read함수에서 받는 입력이 32바이트를 넘진 않지만, sprintf함수를 통해 버퍼에 값을 쓸 때 "Your Input is: " 문자열을 추가하는 것을 고려하면 buf에 31바이트를 꽉 채웠을 때 총 길이가 32바이트를 넘음.
'SYSTEM > 개념 정리' 카테고리의 다른 글
[Dream hack] Linux Exploitation & Mitigation Part 1 中 Return Address Overwrite & NOP Sled (0) | 2021.03.04 |
---|---|
BOF 정리 (2) (0) | 2021.02.24 |
BOF 정리 (1) (0) | 2021.02.21 |
리눅스 기초 명령어(2) (0) | 2021.02.19 |
리눅스 기초 명령어 (0) | 2021.02.15 |