Self-Improvement
[DreamHack] Out Of Boundary 기초 학습 본문
[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 값을 넣으면 된다는데 아직 이해를 잘 못하였다...
'리버싱 기초 > DreamHack' 카테고리의 다른 글
[DreamHack] 정수의 범위 (0) | 2020.07.22 |
---|---|
[DreamHack] Off-by-one 기초 학습 (0) | 2020.07.21 |
[DreamHack] basic_exploitation_001 풀이 (0) | 2020.07.14 |
[DreamHack] Welcome 풀이?(풀이가아닌 풀이) (0) | 2020.07.14 |
[DreamHack] basic_heap_overflow 풀이 (4) | 2020.07.14 |