본문 바로가기

Security

[systemhacking] Out of Boundary

반응형

Out of boundary는 버퍼의 길이 범위를 벗어나는 인덱스에 접근할 때 발생하는 취약점.

 

#include <stdio.h>
int main(void) {
    int win;
    int idx;
    int buf[10];
    
    printf("Which index? ");
    scanf("%d", &idx);
    printf("Value: ");
    scanf("%d", &buf[idx]);
    printf("idx: %d, value: %d\n", idx, buf[idx]);
    if(win == 31337){
        printf("Theori{-----------redacted---------}");
    }
}

win 4byte 깔리고 idx 4byte buf 40byte 스택에 쌓임

win 값을 31337로 만들기 위해 인덱스 11에 접근하여 값 수정


#include <stdio.h>
int main(void) {
    int idx;
    int buf[10];
    int win;
    
    printf("Which index? ");
    scanf("%d", &idx);
    
    idx = idx % 10;
    printf("Value: ");
    scanf("%d", &buf[idx]);
    printf("idx: %d, value: %d\n", idx, buf[idx]);
    if(win == 31337){
        printf("Theori{-----------redacted---------}");
    }
}

idx = idx % 10 으로 OOB 막을 수 있을까??

OOB 발생 여부 확인할 때는 버퍼의 인덱스로 사용할 수 있는 올바른 값의 범위와 버퍼의 인덱스가 될 수 있는 모든 값의 범위를 비교하면 됨.

하지만 만약 C언어에서 피연산자가 음수라면? 연산 결과가 음수가됨.

따라서 범위는 -9 ~ 9

 


//oob-3.c
#include <stdio.h>
int main(void) {
    int idx;
    int buf[10];
    int dummy[7];
    int win;
    printf("Which index? ");
    scanf("%d", &idx);
    
    if(idx < 0)
        idx = -idx;
    idx = idx % 10; // No more OOB!@!#!
    printf("Value: ");
    scanf("%d", &buf[idx]);
    printf("idx: %d, value: %d\n", idx, buf[idx]);
    if(win == 31337){
        printf("Theori{-----------redacted---------}");
    }
}

음수도 차단했음. 이럴 경우에 어떻게 OOB를 만들까?

비트의 음수 처리 -> 2의 보수 (보수를 취해서 + 1)

int는 32비트. 만약 10000000.....00000000 (int의 최소값) -2**31

여기에 음수를 취한다면?

0111111....111111111 로 보수를 취한 뒤 +1 로 다시 100000000...00000000 으로 원상복귀됨.

따라서 음수가 음수로 남아있음

음수 인덱스에 대해서 %10을 취해서 -8의 값을 얻음 int 2개의 바이트 영역을 뛰어넘는 인덱스 

방지를 위해서 

if(idx < 0 || idx >= 10)과 같은 경계 검사 구문을 추가
반응형