취약점 유발의 시초: 배열 (ex.. array[k])
--> 프로세스는 &array [k] = array + k*sizeof(element) 로 주소만 계산하여 씀.
이때 따로 검사하는 검사문이 존재하지 않기 때문에 개발자가 직접 검사하는 경우가 아닌 경우 OOB 발생하는 상황들
1. 인덱스 값이 음수가 될 경우
2. 배열의 길이를 벗어나 더 큰 k값을 가질 때
발생 가능한 취약점 구분 OOB Read(AAR), OOB Write(AAW)
첫 번째로 소개할 "OOB Read"
OOB_Read 란 임의의 주소를 읽는 것으로 AAR 이라고도 불리며 다음과 같은 조건을 만족해야 한다.
1. 당연하지만 OOB 가 가능해야 한다.
2. 읽으려는 변수와 배열의 오프셋을 알아야 한다.
char Key[256] = "Kon0v3";
char *A = Key;
char *oob[4] = {0, };
puts(oob[-1]);
다음가 같을 때 puts는 주소 값을 받고 char와 char* 모두 포인터 취급당하기 때문에 oob->oob's addr 이 된다.
그래서 &oob[-1] = oob + sizeof(char*)*-1이 된다.
"OOB Write"
OOB_Write란 임의의 주소에 쓰기를 하는 것이다. AAW라고도 불리며 다음과 같은 조건을 만족해야 한다.
1. OOB 가 가능해야 한다.
2. 읽으려는 변수와 배열의 오프셋을 알아야 한다.
char Key[256] = "";
char key = "";
Key[257] = "A";
if(key) puts("Goods");
다음과 같을 때 key의 값이 Key[257]로 &Key[257] == key 가 되어 "Goods"를 출력한다. 물론 실제 컴파일 시 컴파일러마다의 특성을 따라 offset이 달라지니 유의 바람.
'Pwnable > Tech' 카테고리의 다른 글
FSB 란 무엇인가 (0) | 2023.02.18 |
---|---|
house of lore 간단 설명 (0) | 2023.01.30 |
SHA - Master Canary (0) | 2022.02.11 |
SHA - SECCOMP(Sandbox), Bypass SECCOMP (0) | 2022.02.10 |
FSB 에 대해 (0) | 2022.02.07 |