[동아리] A반 2차 2일 과제 (2024.03.13)
- 섭씨 화씨 온도변환기
- scanf() 함수 취약점
섭씨 화씨 온도 변환기
#include <stdio.h>
int main(void) {
printf("온도 변환기\n");
printf("1. 섭씨를 화씨로 변환\n");
printf("2. 화씨를 섭씨로 변환\n");
int select;
printf("선택하세요: ");
scanf("%d", &select);
if (select == 1) {
float celsius;
printf("섭씨 온도를 입력하세요: ");
scanf("%f", &celsius);
printf("화씨 온도: %.2f", celsius * (9.0/5.0) + 32);
}
else if (select == 2) {
float fahren;
printf("화씨 온도를 입력하세요: ");
scanf("%f", &fahren);
printf("섭씨 온도: %.2f", (fahren - 32) * 5.0/9.0);
}
else {
printf("올바른 옵션을 선택하세요.");
}
return 0;
}
1. 사용자에게 섭씨를 화씨로 변경할 것인지, 화씨를 섭씨로 변경할 것인지 선택할 수 있도록 하기
2. 옵션 선택 후 float 입력값을 받아 변환된 온도를 출력
3. 사용자가 지정된 옵션 외의 다른 값을 입력할 경우 오류 메세지 출력
(화씨 온도) = ((섭씨 온도) * 9/5) + 32
(섭씨 온도) = ((화씨 온도) - 32) * 5/9
%f가 아닌 %.2f를 사용하여 소수점 아래 둘째 자리까지만 출력하도록 했다.
scanf( ) 함수 취약점
Visual Studio 등의 컴파일러에서 아무런 설정값 없이 scanf() 함수를 사용하면 오류와 함께 빌드가 진행되지 않는 경우가 있다.
이때 scanf() 대신 scanf_s() 또는 fscanf() 등을 사용하면 오류 없이 성공적으로 프로그램을 빌드할 수 있는데 그 이유는 scanf() 함수에는 버퍼 오버플로우라는 취약점이 존재하기 때문이다.
컴퓨터에는 데이터를 주고 받을 때 임시적으로 데이터를 보관하는 임시 데이터 저장소인 버퍼를 가지고 있다.
사용자가 프로그램에 비정상적으로 큰 데이터를 입력했을 때 입력값이 버퍼를 넘어가서 다른 메모리 영역에 영향을 주는 것을 버퍼 오버플로우(Buffer Overflow, BOF)라고 한다.
이것이 문제가 되는 이유는 버퍼 바깥의 메모리 공간에 데이터 값들을 덮어씌우기 때문인데 이를 통해서 다른 메모리 주소로 접근하여 프로그램이 의도하지 않은 작업을 수행하도록 하거나 악성 코드를 덮어씌울 수도 있기 때문이다.
scanf()는 입력값의 길이를 검증하지 않기 때문에 쉽게 버퍼 오버플로우에 노출될 수 있다.
scanf() 함수는 아주 오래 전 등장한 함수이고, 취약점 또한 매우 유명하기 때문에 대처 방안은 예전부터 존재해왔다.
그렇기 때문에 컴파일러는 scanf() 함수의 사용을 권장하지 않는 경우가 많고 일부 컴파일러에서는 자체적으로 scanf() 함수에서 입력을 받을 때 검증 작업을 거치기도 한다.
이 취약점은 scanf 뿐만 아니라 gets(), strcpy() 등의 입력값을 받는 함수에서도 나타난다.
'Programming > C' 카테고리의 다른 글
[C언어] strlen(), fgets(), strcat(), strncpy() 함수 (0) | 2024.03.20 |
---|---|
[C언어] 마름모 별 찍기, 정수 거꾸로 변환, 소수 판별, 포인터 개념 (0) | 2024.03.15 |
[C언어] 연산자 우선 순위, 컴파일, 진법 변환, 선언 (0) | 2024.03.12 |
[C언어] 삼항, 쉼표, sizeof, 포인터 연산자 (0) | 2022.05.04 |
[C언어] 논리 연산자와 비트 연산자 (0) | 2022.05.02 |
댓글