Wahr/Falsch
문제
독일어 원문
Ein Off-by-One-Fehler verschiebt eine Schleifen- oder Array/Index-Grenze um genau 1.
한국어 해석
off-by-one은 loop/index 경계가 정확히 1 어긋난 오류다.
Wahr/Falsch 즉시 채점
선택 후 즉시 개념 함정을 확인하세요.
단계별 힌트
막혔을 때만 한 단계씩 여세요. 정답을 바로 읽는 것보다 기억을 꺼내는 시간이 중요합니다.
- 첫 힌트: `<=`와 `<`를 혼동해 한 번 더 또는 덜 반복하거나 배열 경계를 한 칸 넘는 전형적인 오류다.
- Wahr로 표시한다.
- `<=`와 `<`를 혼동해 한 번 더 또는 덜 반복하거나 배열 경계를 한 칸 넘는 전형적인 오류다.
- 함정: 작은 숫자 차이라 영향도 작다고 생각하지 않는다.
- 후속 점검: 길이 n 배열의 마지막 유효 index는?
채점 기준으로 내 답안 점검하기
- Wahr로 표시한다.
- `<=`와 `<`를 혼동해 한 번 더 또는 덜 반복하거나 배열 경계를 한 칸 넘는 전형적인 오류다.
답안 슬롯 자가 점검 — 실제로 말하거나 쓴 항목만 체크하세요.
0/2 slots
정답과 핵심 해설 확인하기
Wahr. `<=`와 `<`를 혼동해 한 번 더 또는 덜 반복하거나 배열 경계를 한 칸 넘는 전형적인 오류다.
- Wahr로 표시한다.
- `<=`와 `<`를 혼동해 한 번 더 또는 덜 반복하거나 배열 경계를 한 칸 넘는 전형적인 오류다.
Wahr
개념부터 다시 보는 상세 풀이
BEGINNER LESSON
Off-by-One: 단 한 칸의 차이가 배열 밖 쓰기가 되는 과정
ZERO-BASE START
정말 아무것도 모른다고 가정하고 시작합니다
전문 용어를 알고 있다고 가정하지 않습니다. 먼저 일상적인 장면을 보고, 그 장면의 사람과 행동에 실제 보안 용어를 하나씩 붙인 뒤, 시스템에서 일어나는 순서를 따라갑니다.
기초 개념 01
C의 buffer와 length 없는 sprintf
1타 강사식 시작: 이름은 잠시 가리고 장면부터 봅시다
10칸짜리 서랍에 30개 물건을 밀어 넣으면 옆 서랍의 물건까지 밀어내는 것과 같다. C는 자동으로 벽을 만들어 막아 주지 않는다.
지금은 이 비유를 완벽히 외울 필요가 없습니다. 누가 무엇을 가지고 있고, 무엇을 하려 하며, 어느 지점에서 문제가 생기는지만 찾으면 됩니다.
이제 실제 용어를 하나씩 붙여 봅시다
C의 char array는 정해진 크기의 연속된 memory 공간이다. Buffer에 들어갈 문자열 길이를 확인하지 않고 sprintf로 쓰면 경계를 넘어 인접 memory를 덮을 수 있다. 이를 buffer overflow라고 하며 crash, data corruption, 경우에 따라 code execution으로 이어질 수 있다. snprintf는 최대 길이를 받지만 반환값과 null termination 조건도 확인해야 한다.
TERMS FROM ZERO
전문 용어를 한 단어씩 풀기
아래 단어는 이미 안다고 가정하지 않습니다. 먼저 쉬운 뜻을 읽고, 본문에서 같은 단어가 나오면 이 정의로 다시 바꾸어 읽으세요.
Buffer
프로그램이 byte나 문자를 잠시 저장하도록 확보한 연속 memory 공간입니다.
Boundary / Bounds
Buffer가 합법적으로 사용할 수 있는 시작과 끝 범위입니다.
Null terminator
C 문자열의 끝을 표시하는 값 `\0`으로, 저장 공간 1바이트를 차지합니다.
Stack frame
한 함수 호출의 local variable, 저장된 register, return 관련 정보가 놓이는 stack 영역입니다.
Buffer overflow
확보한 buffer 범위를 넘어 write하여 인접 memory를 손상시키는 오류입니다.
프로그램이나 프로토콜 안에서는 다음 순서로 움직입니다.
- 목적지 buffer 크기를 확인한다.
- 공격자가 제어하는 문자열의 최대 길이를 확인한다.
- Format 후 필요한 길이가 buffer보다 큰지 계산한다.
- Bounded API와 반환값 검사, 명시적 길이 검증을 적용한다.
왜 여기서 많이 틀릴까요?
sprintf의 format string이 고정되어 있어도 출력 전체 길이가 제한되지 않으면 overflow가 생길 수 있다.
조건을 생략하거나 서로 다른 기능을 같은 것으로 취급했는지 확인하세요. 정답 문장을 외우는 것보다 틀린 이유를 말할 수 있어야 변형 문제를 풀 수 있습니다.
핵심부터 말하면 Wahr. Off-by-One은 loop 횟수나 배열 경계가 의도보다 정확히 한 번 또는 한 칸 어긋난 오류입니다.
이 글에서 익힐 것
배열 길이와 마지막 유효 index가 다른 이유를 이해한다.
`<`와 `<=`의 한 글자 차이를 실제 반복 횟수로 계산한다.
한 바이트 오류도 control data를 손상할 수 있음을 이해한다.
먼저 알아야 할 개념
길이가 5인 배열의 칸은 0, 1, 2, 3, 4입니다. ‘5개’라는 개수와 ‘마지막 번호 4’를 섞으면 off-by-one이 생깁니다.
예제로 확인하기
상황 설정
`char box[5]; for (i = 0; i <= 5; i++) box[i] = 'A';`를 한 줄씩 실행합니다.
풀이 순서
i=0,1,2,3,4일 때는 box의 다섯 유효 칸에 씁니다.
조건이 `i <= 5`이므로 i=5일 때도 loop가 한 번 더 실행됩니다.
`box[5]`는 여섯 번째 칸이며 배열 밖입니다.
올바른 경계는 보통 `i < 5`입니다. 그러면 i=5에서 멈춥니다.
문자열이라면 마지막 `\0` 공간까지 별도로 계산해야 합니다.
해설
경계가 정확히 한 칸 또는 반복이 한 번 어긋났으므로 전형적인 off-by-one입니다.
정답까지 사고 과정
배열 길이 n을 확인합니다.
유효 index가 0부터 n-1임을 적습니다.
loop가 마지막으로 사용하는 index를 계산합니다.
그 차이가 정확히 1이면 off-by-one으로 설명합니다.
시험장에서는 이렇게 쓰기
최소 답안
Wahr.
안전한 두 문장 답안
Wahr. Ein Off-by-One-Fehler überschreitet oder unterschreitet eine Schleifen- bzw. Arraygrenze um genau eins, etwa durch `i <= n` statt `i < n`.
자주 틀리는 지점
한 칸만 넘으므로 보안 영향도 항상 작다고 생각하기
배열 길이 n의 마지막 index를 n이라고 쓰기
모든 boundary error를 off-by-one이라고 부르기
한 줄로 기억하기
길이 n이면 마지막 칸은 n이 아니라 n-1.
스스로 확인하기
길이 8 배열의 마지막 유효 index는?
`i <= 7`은 길이 8 배열을 순회할 때 몇 번 실행되는가?
이 문제가 어려운 이유
짧은 문제 문장 ‘off-by-one은 loop/index 경계가 정확히 1 어긋난 오류다.’ 안에 정의, 조건, 처리 순서가 압축되어 있습니다. 아래 예시에서는 이를 한 단계씩 펼쳐 확인합니다.
AI 구두시험용 프롬프트
한 문항만 풀어라. 먼저 정답을 열지 말고 90초 안에 답안을 말한 뒤, css-ws2025-26-seceng-mc-003의 채점 프레임으로 스스로 채점하라. 문제: off-by-one은 loop/index 경계가 정확히 1 어긋난 오류다.
학습 기록