top of page
33.jpg
55.jpg

KAIST부설 한국과학영재학교 온라인 과학매거진 코스모스

  • 블랙 페이스 북 아이콘
  • 블랙 인스 타 그램 아이콘

Buffer Overflow

저번 기사의 SQL Injection에 이어 이번 기사에서는 버퍼 오버플로우(Buffer Overflow, BOF)를 소개하려고 합니다.저번 기사에서 ‘해킹, 생각보다 단순한데?’라고 느끼셨다면 이번 기사에는 ‘해킹 너무 어려운데?’라고 느낄 것입니다. 제가 BOF에 대해 처음 배울 때도 정말 어렵다는 생각을 했었습니다.


뭐, 그래도 개념은 간단하니 함께 알아가 봅시다.


BOF 첫걸음

여러분이 생각하는 해킹은 어떤 것인가요? 저는 해킹의 핵심은 다른 사람의 컴퓨터나 웹사이트에 들어가서 그 컴퓨터를 이용해서 원하는 것을 얻어내는 것이라고 생각합니다.


이런 불법적인 행동을 막기 위해서 컴퓨터 회사는 이용자를 구분하고, 이용자에 따라 ‘권한’을 구분합니다. 어떤 사용자이냐에 따라 아무런 권한이 없을 수도 있고, 파일을 열어보기만 할 수도 있고, 읽고 쓰는 것이 허용될 수도 있고, 파일을 실행할 권한이 있을 수도 있습니다. 여러 권한들이 있지만, 뭐니뭐니해도 가장 중요한 권한은 관리자 권한입니다. 슈퍼유저(superuser), 또는 루트(root)라고도 불리는 관리자 권한은 모든 방면에서 컴퓨터를 제어할 수 있습니다. 파일 생성, 열기, 쓰기, 실행, 제거뿐만 아니라 컴퓨터 설정 변경, 디스크 파티션 변경, 심지어는 컴퓨터 전원까지 끌 수 있습니다.


평상시 우리의 컴퓨터는 관리자 계정을 사용하지 않습니다. 하지만 프로그램을 설치해야 할 때 프로그램 설치 마법사 exe파일이 컴퓨터의 (C:)디스크에 접근해서 파일을 추가해야 하기 때문에 관리자 권한이 필요해져서 다음과 같은 창을 띄우며 이 프로그램을 믿고 관리자 권한을 넘겨줘도 되는지 물어봅니다.

이 앱이 디바이스를 변경할 수 있도록 허용하시겠어요?

이런 방식으로 사용자 계정을 왔다갔다하게 하면 번거롭지만 바이러스와 악성 프로그램의 공격을 막을 수 있습니다.


정말?

네, 그럴 리가 없죠. 권한이 분리되어서 아무 것도 하지 못한다면, 관리자 계정을 뺏으면 되죠! 일반 유저, 또는 아무 권한이 없는 상태에서 시작하더라도 시스템에 취약점이 존재한다면 관리자 권한을 탈취할 수 있습니다.


관리자 권한을 탈취할 때 많이 쓰여지는 방법이 이번 기사의 주제인 버퍼 오버플로우(Buffer Overflow)입니다. 버퍼 오버플로우는 지정된 메모리 크기보다 더 큰 값을 입력해서 명령 코드가 들어있는 메모리를 침투해서 원하는 명령이 실행되도록 합니다. 함수에 인자를 입력할 수 있는 권한만 있으면 관리자 권한까지 탈취할 수 있는 것이지요.


그 과정을 자세하게 알아봅시다.

버퍼 오버플로우

위의 프로그램이 실행될 때 컴퓨터는 스택을 생성해서 명령 코드가 들어있는 RET, base pointer인 RBP를 생성합니다.

Overflow.c

이 때 16 byte char 배열 buf를 생성하므로 스택에 16 byte짜리 변수가 들어가게 됩니다. 이 코드에 사용된 strcpy는 메모리 크기를 확인하지 않고 변수를 배정한다는 치명적인 약점을 갖고 있습니다. 이 점 때문에 32byte를 입력하면 명령 코드가 들어있는 RET에 접근할 수 있으므로 여기에 관리자 계정을 탈취하는 코드를 입력하면 권한을 탈취할 수 있습니다!


실제로 해봅시다

저는 컴퓨터에 Linux OS를 설치할 정도로 정보과학에 진심은 아니기에, WSL Linux Ubuntu를 사용했습니다. nano overflow.c 명령어를 이용해 buffer overflow를 일으키는 코드를 써줍시다. 이것을 gcc 컴파일러로 컴파일하고 다시 gdb로 컴파일된 파일을 디버깅합시다. 시각화를 위해 github에서 pwndbg를 clone해서 디버깅합시다.

gdb overflow

디버그 결과를 보면 RET에 ‘SSSSSSSS’가 들어가면서 segmentation 오류가 발생하는 것을 알 수 있습니다. 여기서 RET에 ‘SSSSSSSS’ 대신에 공격 코드를 넣을 수 있다면 컴퓨터가 RET에 들어있는 코드를 실행할 때 공격 코드가 실행될 것입니다.


무슨 말인지 모르겠죠?

Linux에 대해 잘 아는 사람이 아니라면 자연스런 현상입니다. SQL Injection 때 로그인 창에 글자 몇 개만 입력하면 되던 것에 비하면 확실히 복잡하고 어려워졌습니다.


하지만, 실전에서 해커들은 사이트나 시스템을 해킹하기 위해서라면 Injection, Buffer Overflow 뿐만 아니라 모든 가능한 취약점을 테스트해보아야 합니다. 요즘 대부분의 기관과 사이트들은 기본적인 보안 프로그램을 장착하고 있어서 일반적인 방법은 잘 통하지 않기 때문이죠. 저도 이 실습이 성공할 때까지 엄청나게 긴 시간이 걸렸지만, 실제 해커들은 훨씬 더 긴 시간을 들여서 더욱 복잡한 방법으로 보안을 우회할 것입니다.


사실 방금 한 실습은 buffer overflow의 아주 작은 부분일 뿐, 실제 상황에서 사용되는 BOF는 훨씬 복잡합니다.

BOF 해킹 과정에 대한 인포그래픽

실제 해킹에서는 공격자의 IP를 숨겨야 하므로 초반 작업도 복잡하고, 로그가 남는 것을 최소화하기 위해서 이 시스템에 BOF 취약점을 가지는지 확인한 뒤 에야 공격을 할 수 있기 때문에 절차가 복잡한 것입니다.


후기

SQL Injection 기사를 쓰고 바로 다음에 떠오른 해킹 기법이 BOF(Buffer Overflow)였습니다. 저번에 공부했던 SQL Injection은 너무나도 단순해서 ‘버퍼 오버플로우도 할 만하지 않을까?’라는 생각에 도전해보았는데, 개념이 복잡해서 상당히 고전했습니다. 그나마 리눅스를 전에 다뤄본 적이 있어서 쉽게 예제를 만들고, 분석할 수 있었습니다. 제 기사만 가지고는 buffer overflow를 완전히 이해하기 힘들 것이니, 구글에 ‘buffer overflow practice’라고 검색해서 더 연습해보세요!


 

박찬 | Mathematics & Computer Sci. | 지식더하기


참고자료

[1] https://steflan-security.com/complete-guide-to-stack-buffer-overflow-oscp/

[2] https://www.youtube.com

[3] https://en.wikipedia.org/wiki/Buffer_overflow


첨부 이미지 출처

[1] https://iteastory.com/227

[2] https://steflan-security.com/complete-guide-to-stack-buffer-overflow-oscp/


ⓒ KAIST부설 한국과학영재학교 온라인 과학매거진 KOSMOS

조회수 126회댓글 0개

최근 게시물

전체 보기
bottom of page