STAGE 5-2
Memory Corruption: Stack Buffer Overflow
스택 버퍼 오버플로우는 매우 역사가 오래된 취약점이며, 현재 실시간으로 다수 소프트웨어에서 발견되고 있는 현재진행형인 취약점이다.
목표
- 스택 버퍼 오버플로우의 원인 알기
- 스택 버퍼 오버플로우로 인해 발생하는 보안 문제 알기
주의점
- 스택 오버플로우 ≠ 스택 버퍼 오버플로우
- 스택 오버플로우: 한정된 크기의 메모리 안에서 스택 영역이 너무 많이 확장되어 발생하는 버그
- 스택 버퍼 오버플로우: 스택에 위치한 버퍼에 버퍼의 크기보다 많은 데이터가 입력되어 발생하는 버그
스택 버퍼 오버플로우와 악용 경우수
1. 버퍼 오버플로우
스택 버퍼 오버플로우란, 스택의 버퍼에서 발생하는 오버플로우
Q. 버퍼란 무엇이고, 오버플로우란 무엇일까?
버퍼:
- “데이터가 목적지로 이동되기 전에 보관되는 임시 저장소”
- 현대에는 “데이터가 저장될 수 있는 모든 단위”
- 지역 변수에 할당된 메모리 영역은 ‘스택 버퍼’
- 힙에 할당된 메모리 영역은 ‘힙 버퍼’라고 부르는 것과 같다.
버퍼 오버플로우:
- 버퍼가 넘치는 것: 지정된 버퍼 크기보다 큰 데이터가 입력되어 발생한다.
- “버퍼”, 즉 어떤 변수든 데이터든 담기도록 할당된 메모리 영역의 크기를 뛰어넘는 데이터를 인풋했을 떄 발생한다.
- 일반적으로 버퍼는 메모리상에 연속해서 할당되어 있기 때문에, 어떤 버퍼에서의 오버플로우는 뒤에 있는 버퍼들의 값이 조작되게 할 수 있다.
- 그 어떤 메모리 영역에서 발생하더라도 매우 심각한 보안 위협으로 이어진다.
스택 버퍼 오버플로우:
- 스택 영역에서 할당한 버퍼가 오버플로우되는 것.
2. 중요 데이터 변조
- BOF 발생 버퍼 뒤에 중요한 데이터가 있다면, 해당 데이터가 변조됨으로써 문제가 발생할 수 있다.
- 표현식의 변조
- 통신 주소 변조
- …etc
예제를 분석하며 BOF의 감을 잡아 보자. 사실 나는 저번에 풀었던 문제 정도를 예상하고 에이 똑같은 이야긴가~ 하며 방심했는데, 전혀 아니었다. 설명을 읽고 뒤통수를 한 대 맞은 기분이었기 때문에, 나와 비슷한 초보자 분들도 이건 꼭 보셨으면 좋겠다.
원래 main 함수가 따로 있는데, 가장 중요한 check_auth 함수만 잘라서 가져왔다. 여기에서 집중해볼 것은, temp[16]과 strncpy(temp, password, strlen(password))이다. strncpy 자체가 BOF에 취약한 함수인 데다가 temp[16]은 16바이트로 크기가 정해진 배열이다.
즉, strncpy를 돌릴 때 16바이트를 초과하는 문자열을 전달한다면 temp 지역 변수를 담는 스택의 버퍼가 overflow 되면서 바로 그 밑에 할당된 auth 지역 변수의 데이터가 오염될 수 있다는 것이다.
위 취약점을 이용해 실제 관리자 비밀번호가 아닌 아무 데이터나 입력하면서 auth 버퍼의 데이터가 1로 변경되도록 변조한다면 인증을 통과할 수 있을 것이다.
3. 데이터 유출
- C언어의 경우 문자열의 종결은 NULL byte로 표현되고, 스택에서 데이터를 읽어올 때 NULL byte 전까지 읽어옴
- 즉, 어떤 버퍼에 오버플로우를 일으킴 → 다른 버퍼와의 사이에 있는 NULL byte 모두 제거 → 해당 버퍼의 데이터 유출 가능
- Stack Canary를 이런 식으로 덮어씌워서 다음 버퍼의 데이터가 유출되게끔 할 수 있겠다!
4. 실행 흐름 조작
- 새로운 스택 프레임을 생성할 때, 이전 스택 프레임의 맨 꼭대기에 리턴 주소를 저장한다는 사실을 악용
- [새로운 스택 프레임: 지역 변수들…]
- [새로운 스택 프레임: SFP(이전 스택 프레임의 함수에서 사용하던 스택의 바닥 주소)]
- [옛날 스택 프레임: Return Address]
- 순이라는 걸 잊지 말자!
- 스택 버퍼 오버플로우를 일으켜, 리턴 주소를 조작해 원하는 프로세스가 실행되게끔 함