버퍼 오버플로 & 포맷 스트링 공격
버퍼 오버플로는 프로그램이 실행될 때 입력받는 값이 버퍼를 가득 채우다 못해 넘쳐흘러 버퍼 이후의 공간을 침범하는 현상을 말한다. 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점이다. 데이터의 길이에 대한 불명확한 정의를 악용한 덮어쓰기로 인해 발생한다. 컴퓨터 보안과 프로그래밍에서 이는 프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하여 벗어난 데이터는 인접 메모리를 덮어 쓰게 되는데 손상 받은 데이터가 중요한 데이터일 경우 프로그램에 큰 영향을 미치게 된다.
버퍼 오버플로를 일으키는 기본적인 예시는 문자열에 할당된 메모리 용량보다 더 큰 공간을 할당했을 때이다. 예를 들면 8바이트 문자열을 넣을 수 있는 버퍼가 존재한다고 가정하자. 그리고 이 메모리 공간 뒤에는 컴퓨터를 동작하는데 중요한 기능을 수행하는 코드가 존재한다고 생각해보자. 우리는 이 8비트 공간에 8개의 문자만 입력할 수 있다. 그런데 이보다 더 길이가 긴 문자열을 임의로 입력해서 넣으면 중요한 기능을 수행하는 코드가 영향을 받게 되어 제대로 된 기능을 수행하지 못하는 상황이 발생한다.
버퍼 오버플로는 1973년 C 언어의 데이터 무결성 문제로 처음 등장했는데 처음에는 해킹의 공격 문제가 아니라 단순한 프로그램상의 문제로 인식되었다. 하지만 1988년 모리스 웜이 버퍼 오버플로를 이용했다는 것이 알려지면서 문제인식이 강화되었다. 그리고 1997년 프랙에 알렙 원이라는 잡지에서 Smashing the stack for fun and profit 이라는 문서를 게재하면서 널리 알려졌다.
포맷 스트링 공격은 버퍼 오버플로와 다르게 데이터 형태에 대한 불명확한 정의로 인한 문제이다. 포맷 스트링이라고 하는 것은 일반적으로 사용자로부터 입력을 받아들이거나 결과를 출력하기 위하여 사용하는 형식이다. C언어를 사용한다면 printf()라는 함수를 사용할 때 숫자, 문자 등등 형태에 따라 %d, %c, %x 등을 사용하는데 이를 포맷 스트링이라고 한다. 데이터의 형태를 알아볼 수 있게 해주는 역할을 하는 것이 포맷 스트링인데 이를 바꾸는 것이 포맷 스트링 공격이라고 할 수 있다.
예를 들면 %s를 사용하게 되면 해당하는 데이터의 문자열에 대해서 출력을 하게 된다. 하지만 이에 대해 임의적으로 %x라는 포맷 스트링으로 바꾸어준다면 컴파일을 실행시킬 때 문자열에 대한 값이 나오는 것이 아니라 주소에 대한 값이 나오게 되는 것을 볼 수 있다. 이렇게 되면 메모리 열람이 가능하게 되고 이렇게 열람을 할 수 있으면 메모리 조작도 가능하게 된다. 해당 메모리에 대해 값을 바꾸어 집어넣게 되면 메모리의 주소 값이 바뀌게 된다. 이러한 공격을 포맷 스트링 공격이라고 한다.
포맷 스트링 공격은 버퍼 오버플로와 달리 1990년 말에 알려지기 시작하였다. 발견 당시, 최초로 포맷 스트링을 발견한 사람이 천재일 거라는 평가를 받을 정도로 사람들을 매우 충격에 몰아넣었다고 한다.
출처 - 네이버 정보 보안 개론[버퍼 오버플로우, 포맷 스트링 공격], 나무 위키[버퍼 오버플로], 위키백과[버퍼 오버플로, 포맷 스트링 공격]
'보안해킹' 카테고리의 다른 글
블록체인 (0) | 2017.04.28 |
---|---|
FIDO (생체 인식) (0) | 2017.04.25 |
SQL 인젝션 & XSS (0) | 2017.04.24 |
세션 하이재킹 공격 & 부채널 공격 (0) | 2017.04.23 |
허니팟 & 허니넷 (0) | 2017.04.22 |