반응형
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)과 같은 경계 검사 구문을 추가
반응형
'Security' 카테고리의 다른 글
[systemhacking] format string bug (0) | 2021.11.17 |
---|---|
[systemhacking] Off-by-one (0) | 2021.11.11 |
[systemhacking] 버퍼 오버플로우 (0) | 2021.11.10 |
[Webhacking] [client-side advanced] Exploit Techniques - CSS Injection (0) | 2021.11.03 |
[Webhacking] [client-side advanced] Exploit Techniques - Dom Clobbering (0) | 2021.11.03 |