DINGA DINGA
article thumbnail
728x90

1. 버퍼 오버플로우란?

- 버퍼: 지정된 크기의 메모리 공간

- 버퍼 오버플로우: 버퍼가 허용할 수 있는 양의 데이터보다 더 많은 값이 저장되어 버퍼가 넘치는 취약점

- 발생하는 위치에 따라 스택 버퍼 오버플로우, 힙 오버플로우로 나뉨

- 스택 버퍼 오버플로우: 지역 변수가 할당되는 스택 메모리에서 오버플로우가 발생하는 경우

 

- 버퍼 A가 8바이트, 버퍼 B가 8바이트일 때 16바이트의 데이터가 버퍼 A에 복사되면 이 데이터의 뒷부분은 B에 쓰여짐 (버퍼 오버플로우). 이는 프로그램의 Undefined Behavior를 이끌어냄.

- 만약 데이터 영역 B에 나중에 호출될 함수 포인터를 저장하고 있다면 이 값을 "AAAAAAAA"와 같은 데이터로 덮었을 때 Segmentation Fault를 발생시킴. 이를 악용해 공격.

 

2. 스택 버퍼 오버플로우 - ex1

stack-1.c

- stack-1.c는 16바이트 버퍼 buf를 스택에 할당한 후 gets함수를 통해 데이터를 입력 받아 그대로 출력하는 코드

- gets함수에는 별도의 길이 제한이 없으므로 16바이트가 넘는 데이터를 입력하면 스택 버퍼 오버플로우 발생

 

3. 스택 버퍼 오버플로우 - ex2

stack-2.c

- 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

- stack-3.c의 main함수는 24바이트 크기의 버퍼 buf를 할당함. scanf함수를 통해 size 변수에 값을 입력받고, size만큼 buf에 데이터를 입력받음.

- 고정된 크기의 버퍼보다 더 긴 데이터를 입력받아 스택 버퍼 오버플로우가 발생함.

 

5. 스택 버퍼 오버플로우 - ex4

stack-4.c

- stack-4.c는 32바이트 크기 buf를 초기화한 후 데이터를 31바이트 입력받고, sprintf함수를 통해 문자열을 저장한 뒤 출력하는 코드

- read함수에서 받는 입력이 32바이트를 넘진 않지만, sprintf함수를 통해 버퍼에 값을 쓸 때 "Your Input is: " 문자열을 추가하는 것을 고려하면 buf에 31바이트를 꽉 채웠을 때 총 길이가 32바이트를 넘음.

 

728x90

'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