[P4C 4기] 8주차 과제 Out Of bounds
Out Of Bounds
배열의 범위를 벗어난 메모리에 접근할 수 있는 취약점 입니다. 개발자가 인덱스에 대한 검사를 제대로 하지 않으면 발생하는 취약점으로 임의의 주소 읽기, 임의 주소 쓰기로 이어질 수 있습니다.
배열은 연속된 메모리 공간을 가지며 배열의 크기는 각 요소가 가지는 자료형 크기에 각 요소의 개수를 곱한 값입니다.
배열 등의 요소를 참조할 때 인덱스 값이 음수거나 배열의 길이를 벗어날 때 발생합니다.
개발자가 인덱스 범위에 대한 검사를 명시적으로 프로그래밍 하지 않으면, 프로세스는 앞서 배운 식을 따라 요소의 주소를 계산할 뿐 계산한 주소가 배열의 범 위 안에 있는지 검사하지 않습니다.
배열 참조에 사용되는 인덱스를 임의의 값으로 설정할 수 있다면 배열의 주소로부터 특정 오프셋에 있는 메모리의 값을 참조할 수 있습니다.
이를 배열의 범위를 벗어나는 참조라 하여 Out of Bounds라고 부릅니다.
실습 1

[그림 1]과 같이 arr길이는 10입니다. 하지만 arr의 길이보다 작은 -1, 또는 큰 100을 인덱스로 지정하였을 때의 결과는 다음과 같습니다.
출력1)
arr의 시작 주소는 0xbffff230입니다.
arr의 처음 주소인 arr[0]의 주소는 다음과 같습니다. 0xbffff230 + 4*0 = 0xbffff230
arr의 마지막 주소인 arr[9]의 주소는 다음과 같습니다. 0xbffff230 + 4*9 = 0xbffff254
출력2)
arr[-1]의 주소는 0xbffff230 + 4*-1 = 0xbffff22c 입니다.
arr[100]의 주소는 0xbffff230 + 4*100 = 0xbffff3c0 입니다.
출력2)의 예시로 arr배열의 인덱스를 통해 다른 주소에 접근할 수 있는 것을 확인할 수 있습니다.
실습 2
Out Of Bounds의 또 다른 예시로 docs 배열에 문자열 5개를 저장 후 입력 값을 인덱스로 하여 docs 배열의 요소를 출력하는 프로그램입니다.
read_secret함수를 통해 secret.txt의 문자열들을 받아와 secret 배열에 저장한 뒤 Out Of Bounds를 이용하여 출력해볼 예정입니다.
입력값 -1을 인덱스로 하여 docs의 값을 출력합니다.
1-1 = 0, 5 - 1 = 4
0과 4 모두 docs 배열에서 사용할 수 있는 인덱스입니다.
docs는 5개의 요소들을 가져 최대 인덱스가 4입니다. 하지만 6이 입력되어 docs에 인덱스 5의 값을 출력하게 되는데 이때 secret.txt를 출력하게 됩니다.
그 이유는 다음과 같습니다.
arr[0] -> 0xbffff1dc + 4*0 = 0xbfff1dc -> 'one'가 존재하는 주소
arr[1] -> 0xbffff1dc + 4*1 = 0xbfff1e0 -> 'two'가 존재하는 주소
arr[2] -> 0xbffff1dc + 4*2 = 0xbfff1e4 -> 'three'가 존재하는 주소
arr[3] -> 0xbffff1dc + 4*3 = 0xbfff1e8 -> 'four'가 존재하는 주소
arr[4] -> 0xbffff1dc + 4*4 = 0xbfff1ec -> 'five'가 존재하는 주소
arr[5] -> 0xbffff1dc + 4*5 = 0xbfff1f0 -> 'secret.txt'의 문자열을 저장한 주소
위의 단계를 거쳐 secret.txt의 값을 출력할 수 있게 됩니다.
출처
https://dreamhack.io/lecture/courses/115
Memory Corruption: Out of Bounds
TBD이번 코스에서는 OOB 취약점이 발생하는 코드의 유형과 OOB를 공격해서 얻을 수 있는 효과에 대해 살펴보겠습니다.
dreamhack.io