[Dreamhack] Out of bounds: 1 - Description

securitykss·2023년 1월 17일
0

Pwnable 강의(dreamhack)

목록 보기
24/58

이글은 https://dreamhack.io/lecture/courses/115 을 토대로 작성된 글입니다.

1. Introduction

C언어에서 배열을 들어본 적이 있을 것이다.

이때 배열은 같은 자료형의 요소(Element)들로 구성되어 있고,

각 요소의 위치를 인덱스(Index)라고 한다.

만약 프로그램을 작성할 때, 배열에서 인덱스를 벗어나게 작성해서 컴파일을 돌릴 경우, 컴파일러가 경고를 띄워준다. 하지만 그렇지 않으면, Out of bounds(OOB)의 먹잇감이 된다.

2. Out of bounds

2.1 배열의 속성

배열이 포함하는 요소의 개수를 배열의 길이(Length)라고 한다.

배열 각 요소의 주소는 배열의 주소, 요소의 인덱스, 요소 자료형의 크기를 이용하여 계산된다.

2.2 Out of bounds

OOB는 요소를 참조할 때, 인덱스 값이 음수이거나 배열의 길이를 벗어날 때 발생된다.

따라서 만약 사용자가 배열 참조에 사용되는 인덱스를 임의 값으로 설정할 수 있다면, 배열의 주소로부터 특정 오프셋에 있는 메모리 값을 참조할 수 있다.

2.3 PoC

// Name: oob.c
// Compile: gcc -o oob oob.c

#include <stdio.h>

int main() {

  int arr[10];
  printf("In Bound: \n");
  printf("arr: %p\n", arr);
  printf("arr[0]: %p\n\n", &arr[0]);

  printf("Out of Bounds: \n");
  printf("arr[-1]: %p\n", &arr[-1]);
  printf("arr[100]: %p\n", &arr[100]);

  return 0;

}

실행 결과

arr[0]와 arr[100]의 주소 차이가 0x7ffebc778c90 - 0x7ffebc778b00 = 0x190 = 100 x 4 이다.

이렇게 주소차이를 알 수 있고, 임의 주소를 읽기 혹은 참조해서 악용될 수 있다.

마치며

배열의 길이: 배열이 포함하는 요소의 개수

배열의 크기: 배열의 길이 X 요소의 크기

배열의 참조: 배열의 주소, 요소의 크기, 인덱스를 활용하여 참조할 요소의 주소를 계산함. 이 과정에서, 계산된 주소가 배열의 범위를 벗어나는지 검사하지 않으므로 out of bounds 취약점이 발생할 수 있음.

Out of Bounds(OOB): 배열의 범위를 벗어난 메모리에 접근할 수 있는 취약점. 개발자가 인덱스에 대한 검사를 제대로 하지 않으면 발생함. 임의 주소 읽기, 임의 주소 쓰기로 이어질 수 있음.

Reference

https://dreamhack.io/lecture/courses/115

profile
보안 공부를 하는 학생입니다.

0개의 댓글