버퍼 오버플로우는 할당된 버퍼의 영역을 넘어서는 데이터를 입력해서 다른 데이터를 오염시키는 것을 말한다. 버퍼 오버플로우가 발상하는 영역에 따라 지칭하는 명이 다른데, 스택에서 일어나는 경우 스택 버퍼 오버플로우라고 하고 힙 영역에서 일어나는 경우 힙 버퍼 오버플로우라고 한다.
보통 버퍼 오버플로우 취약점은 프로그래머가 버퍼의 길이에 대한 가정을 올바르지 않게 하여 발생한다. 길이 제한이 없는 API 함수들을 사용하거나 버퍼의 크기보다 입력받는 데이터의 길이가 더 크게 될 때 자주 일어나는 실수다.
아래는 버퍼 오버플로우를 발생시키기 위한 실습이다.
- Ex1
// stack-1.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char buf[16];
gets(buf);
printf("%s", buf);
}
- Ex2
// stack-2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_auth(char *password) {
int auth = 0;
char temp[16];
strncpy(temp, password, strlen(password));
if(!strcmp(temp, "SECRET_PASSWORD"))
auth = 1;
return auth;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: ./stack-1 ADMIN_PASSWORD\n");
exit(-1);
}
if (check_auth(argv[1]))
printf("Hello Admin!\n");
else
printf("Access Denied!\n");
}
이 코드의 check_auth() 함수에서 strncpy 부분은 password의 길이만큼 password를 temp에 복사한다. temp는 16바이트이기 때문에 password에 16바이트 이상의 데이터가 저장되면 버퍼 오버플로우가 발생될 것이다. temp버퍼 뒤에는 auth버퍼가 이어져있다. auth는 password의 참과 거짓을 확인하는 영역으로 버퍼 오버플로우를 발생시키면 auth의 값을 조작할 수 있다.
아래는 이것에 대한 실습이다.
- Ex3
// stack-3.c
#include <stdio.h>
#include <unistd.h>
int main(void) {
char win[4];
int size;
char buf[24];
scanf("%d", &size);
read(0, buf, size);
if (!strncmp(win, "ABCD", 4)){
printf("Theori{-----------redacted---------}");
}
}
실습2에서는 길이 검증이 없는 함수를 사용해 버퍼 오버플로우가 발생했고, 실습3에서는 버퍼의 크기보더 더 긴 데이터를 입력 받아 버퍼 오버플로우가 발생합니다.
아래는 해당 내용에 대한 실습이다.
- Ex4
// stack-4.c
#include <stdio.h>
int main(void) {
char buf[32] = {0, };
read(0, buf, 31);
sprintf(buf, "Your Input is: %s\n", buf);
puts(buf);
}
위 코드에서 read 함수로 buf에 31바이트까지만 입력 받아 버퍼가 넘치진 않지만, sprintf() 함수로 "Your Input is: " 해당 문자열까지 앞부분에 저장해야 하므로 17바이트를 넘어서는 데이터를 입력받으면 버퍼 오버플로우가 발생한다.
아래는 해당 내용의 실습이다.
이처럼 버퍼 오버플로우는 프로그래머가 길이에 대한 검증을 정확히 수행하지 못 할 때 발생한다. 만약 공격 벡터로부터 데이터를 입력받고 이를 버퍼에 저장하는 코드가 있다면 이를 유심히 살펴볼 필요가 있다. 데이터를 버퍼에 입력받을 때는 입력받은 데이터가 버퍼의 범위를 초과하지 않는지 항상 정확히 검사해야 한다. 만약 길이를 명시하는 함수를 사용한다면, 명시된 길이가 버퍼의 크기를 넘을 수 있는지를 검토해야 한다.
'Study > System Hacking' 카테고리의 다른 글
[dreamhack] Linux Exploitation1 & Minigation Part 1 / Return Address Overwrite & NOP Sled (0) | 2021.01.27 |
---|---|
[LOB] gate -> gremlin (0) | 2021.01.24 |
[OverTheWire] bandit / Level 6 -> Level 10 (0) | 2021.01.14 |
[달고나] 정리: 끝까지 (0) | 2021.01.13 |
[OverTheWire] bandit / Level 0 -> Level 5 (0) | 2021.01.10 |