Self-Improvement

[DreamHack] Off-by-one 기초 학습 본문

리버싱 기초/DreamHack

[DreamHack] Off-by-one 기초 학습

JoGeun 2020. 7. 21. 18:09

Off-by-one 취약점은 경계 검사에서 하나의 오차가 있을 때 발생하는 취약점으로 버퍼의 경계 계산 혹은 반복문의 횟수 계산 시 "<" 대신 "<="을 쓰거나, 0부터 시작하는 인덱스를 고려하지 못할 때 발생한다!!

 

소스코드 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
void copy_buf(char *buf, int sz) {
    char temp[16];
    
    for(i = 0; i <= sz; i++)
        temp[i] = buf[i];
}
int main(void) {
    char buf[16];
    
    read(0, buf, 16);
    copy_buf(buf, sizeof(buf));
}
cs

read() 함수에서 16바이트를 입력 받고 있는 부분까지는 정상적인 코드이다.

하지만 copy_buf로 buf의 주소와 크기 16바이트를 넘겨주고 for문에서 문제점이 발생하게 된다.

for문에서 0부터 시작해서 "<= sz(16)" 만큼 반복이 되는데 결국은 0~16까지 총 17번의 횟수가 진행되어 마지막엔 temp[16] = buf [16]; 으로 off-by-one 취약점이 발생하게 된다. 

 

예제로 보면 쉬워 보이지만 다른 형식으로 마주하게 되면 어려울 수 있을 것 같다.