Self-Improvement

[DreamHack] Out Of Boundary 기초 학습 본문

리버싱 기초/DreamHack

[DreamHack] Out Of Boundary 기초 학습

JoGeun 2020. 7. 15. 10:09

[dreamhack] 에서 모르는 용어나 단어가 보여 정리하고자 쓴다.

 

OOB(Out Of Boundary)

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

 

소스코드 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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("Vulner{-----------redeacted---------}");
    }
}
cs

소스코드에서 buf의 길이는 10이고 buf의 인덱스로 사용될 수 있는 값은 0~9의 정수만 가능합니다.

그러나 코드에서는 이 index의 범위에 대한 별도의 경계 검사하는 부분이 존재하지 않아 올바르지 않은 값을 사용하면 buf의 영역 밖에 있는 값에 접근할 수 있다.

 

GDB로 main에서 "win == 31337"을 비교하는 부분을 찾아본다.

win은 rbp-0x4에 있으며 idx에 9, buf[9]에 123을 넣어보고 스택의 위치를 확인해본다.

스택 = buf | idx | win | rbp

 

idx에 10을 넣어보고 확인해본다. buf와 idx 값이 이상하게? 달라졌음을 알 수 있다.

하지만 win 영역에까지 write 할 수 없었다.

 

idx에 11을 넣어보고 다시 확인해본다. rbp-0x4에 buf에서 입력한 값 "123"이 입력되었다.

0~9 범위 밖에서 하나씩 플러스 될때마다 buf의 위치가 SPF에 가까이 가는것 같다. 맞는지는 몰르겠다.

 

최종적으로는 idx에 11을 입력한후 buf에서는 31337을 하면 win의 값을 수정할 수 있다.

rbp-0x4의 값이 0x7a69(31337)이 되었다.

 


소스코드 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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{-----------redeacted---------}");
    }
}
cs

소스코드 1에서 추가되어진게 idx의 값 검증을 위해 "idx % 10"을 사용하고 있다.

하지만 이 부분도 idx에 음수값을 넣으면 우회를 할 수 있게 된다.

드림핵에서는 -1로 해도 되었지만 실제 Kali에서 해보니 잘 안되었다. 흐음

 


 

소스코드 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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{-----------redeacted---------}");
    }
}
cs

IF문이 추가되어 음수값에 대한 검증이 존재하게 된다.

풀이는... 2^32 값을 넣으면 된다는데 아직 이해를 잘 못하였다...