https://dreamhack.io/lecture/courses/60
Memory Corruption: Stack Buffer Overflow
스택 버퍼 오버플로우의 개념을 살펴보고, 이로 인해 발생할 수 있는 보안 위협을 인터렉티브 모듈을 이용하여 학습합니다.
dreamhack.io
스택 오버플로우 : 스택 영역이 너무 많이 확장되어서 발생하는 버그
스택 버퍼 오버플로우 : 스택에 위치한 버퍼에 버퍼의 크기보다 많은 데이터가 입력되어 발생하는 버그를 뜻함
버퍼 오버플로우
버퍼 : 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소
데이터의 처리속도가 다른 두 장치가 있을 때, 둘 사이에 오가는 데이터를 임시로 저장해 두는 장소 (완충 역할)
버퍼 오버플로우 : 버퍼가 넘치는 것을 의미
int로 선언한 지역 변수는 4바이트의 크기를 갖고, 10개의 원소를 갖는 char배열은 10바이트의 크기를 가짐
ex) 10바이트 크기의 버퍼에 20바이트 크기의 데이터가 들어가게 되면 오버플로우가 발생함
버퍼 오버플로우가 위험한 이유 : 일반적으로 버퍼는 메모리 상에 연속해서 할당되어 있으므로,
버퍼에서 오버플로우가 발생하면 뒤에 있는 버퍼들의 값이 조작될 위험이 있음
중요 데이터 변조 예시
// Name: sbof_auth.c
// Compile: gcc -o sbof_auth sbof_auth.c -fno-stack-protector
#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: ./sbof_auth ADMIN_PASSWORD\n");
exit(-1);
}
if (check_auth(argv[1]))
printf("Hello Admin!\n");
else
printf("Access Denied!\n");
}
main()함수는 argv[1]을 check_auth함수의 인자로 전달한 후 반환값을 받아옴
반환값이 0이 아니라면 Hello Admin!을 출력하고, 0이라면 Access Denied를 출력함
check_auth()에서는 16바이트 크기의 temp 버퍼에 입력받은 패스워드를 복사한 후,
SECRET_PASSWORD 문자열과 비교하여 문자열이 같다면 auth를 1로 설정하고 반환함
check_auth()에서 strncpy함수를 통해 temp 버퍼를 복사할 때,
temp의 크기인 16바이트가 아닌 인자로 전달된 password의 크기만큼 복사하여 전달함
= argv[1]에 16바이트가 넘는 문자열을 전달하면 넘치는 길이 만큼까지 복사되어서 스택 오버플로우 발생
auth는 temp 버퍼의 뒤에 존재하므로 temp에 오버플로우 발생하면 auth값도 임의로 변경 가능해짐
C언어에서 정상적인 문자열은 NULL Byte(\x00)으로 끝나고,
표준 문자열 출력 함수들은 널바이트를 문자열의 끝으로 인식함
어떤 버퍼에 오버플로우를 발생시켜서 다른 버퍼와의 사이에 있는 널바이트를 모두 제거하면,
해당 버퍼를 출력시켜서 다른 버퍼의 데이터를 읽을 수 있음
= 각종 보호기법을 우회하는데 사용할 수 있음
데이터 유출
실행 흐름 조작
'INTERLUDE ✦ > 2022 SYSTEM STUDY' 카테고리의 다른 글
[ DreamHack ] Return Address Overwrite-2 (0) | 2022.11.15 |
---|---|
[ DreamHack ] Return Address Overwrite (0) | 2022.11.08 |
[ DreamHack ] ShellCode (0) | 2022.11.03 |
[ DreamHack ] Shell_basic 풀이 (0) | 2022.11.01 |
[ DreamHack ] pwndbg 실습 (0) | 2022.10.04 |