해킹 이야기
해킹 이야기
  • 장태웅 / 물리 07
  • 승인 2009.09.23 12:37
  • 댓글 0
이 기사를 공유합니다

컴퓨터 논리와 구조에 대한 기존 관념을 깨고 새로이 해석

‘해킹’을 이야기할 때는 컴퓨터 보안에 한정하기도 하고, 혹은 더 넓게 컴퓨터에 관한 모든 열정적인 일들을 지칭하기도 한다. 하지만 공통적이고 핵심적인 것은 컴퓨터상에 구현된 ‘논리’나 ‘구조’에 대한 기존의 관념을 깨고 새로운 해석을 한다는 것이다. 가령, 해킹은 단순한 데이터로 간주되는 그림이나 음악, 웹 페이지를 계산기나 워드 프로그램과 같이 컴퓨터가 읽어내려 실행하는 기계어로 탈바꿈시키기도 하며, 컴퓨터상에 구현된 난수 발생기가 만들어내는 숫자를 예측하기도 한다. 또한 프로그램 내부에서 오류를 일으키도록 교묘하게 지어진 제목의 글을 게시판에 올려서 관리자 권한을 획득하기도 한다. 이렇게 해킹은 상식을 뒤집는 일로부터 시작한다.

해킹의 범주

해킹은 컴퓨터 전 범위에 걸쳐 발견되는 오류를 다루기 때문에 매우 다양한 기술과 분야가 존재한다. 대표적인 것으로 △FTP나 게임 서버 프로그램과 같이 여러 사람에게 중앙 집중적인 서비스를 제공하는 프로그램을 공격하는 리모트 어택 △사용자의 신분이나 기타 요소에 따라 웹 브라우저를 통해 보일 내용을 구성하는 프로그램인 ‘웹 어플리케이션’의 논리상의 문제를 연구하는 웹 해킹 △암호학, 통계적 방법이나 엔트로피 분석을 통해 그림이나 음악파일에 교묘하게 숨겨진 데이터를 찾아내는 Forensic △컴퓨터 사이의 통신 규약에 있는 문제점을 다루는 네트워크와 같은 분야가 있다.

시스템 해킹과 버퍼오버플로우

본격적으로 컴퓨터를 주 대상으로 삼는 해킹은 버퍼오버플로우라는 공격 기술의 발견으로부터 시작된 것이라 해도 과언이 아니다. 웹 페이지를 열거나 음악을 재생시키면 프로그램이 오동작하며 악성코드가 심어지게 하는 사례 대부분이 이 기술에 기반을 둔다. 버퍼오버플로우의 발견은 프로그래밍 기술의 발전과도 함께했다.
컴퓨터가 발전하면서 프로그램 규모가 커지게 되었는데, 이로 인해 중복되는 기능을 구현해야 하는 경우가 많이 생겼다. 중복되는 기능을 다시 작성하는 수고를 줄이고 프로그램 개발을 효율적으로 하기 위해서 자주 사용되는 프로그램의 부분을 기능별로 묶어서, 값을 넣으면 이를 처리하여 의미 있는 작업 후에 새로운 값을 만들어내는 단위인 ‘함수’를 만들었다. 프로그램들은 이러한 함수들의 유기적 혹은 복합적 결합을 통해 구성된다.
함수를 이용해 프로그램을 구성하는 것은 사람이 일을 하는 방식과 유사하다. 만약 글을 쓰는 프로그램을 작성한다면, 처음에는 서론을 쓰는 함수를 이용하고 다음에는 본론을 쓰는 함수, 마지막으로 결론을 쓰는 함수를 이용하게 될 것이다. 그리고 서론ㆍ본론ㆍ결론을 쓰는 각각의 함수는 문장을 만드는 함수와 문장을 배치하는 함수, 그리고 유기적으로 연결하는 함수를 이용할 것이다. 이런 프로그램이 올바로 수행되기 위해선 어떤 작업 혹은 함수를 마치고 무슨 일을 이어서 해야 하는 가를 기억하는 것이 필요하다. 즉, 서론을 쓴 다음에 무엇을 해야 하는가를 기억해야 하는가에 따라서 어떤 함수가 만들어내는 결과를 프로그램의 어느 부분에서 필요로 했는지 기억하는 것이 중요한 문제가 되는데, 이를 해결하기 위해서 초기의 컴퓨터 과학자들은 스택을 이용했다. 테세우스가 미로에서 돌아가야 할 길을 기억하기 위해 실타래를 풀었던 것처럼, 함수를 필요로 했던 곳, 즉 함수가 결과를 만들어낸 뒤 돌아갈 위치를 메모리에 ‘스택’이라는 형태로 저장을 한 것이다. (☞스택 : 자료를 저장하는 방식 중 하나. 쌓여진 접시와 같이 구성되어 있어, 이 자료구조로부터 자료를 읽을 때는 가장 나중에 저장했던 것이 읽힌다.)
한편, 서론을 쓰는 함수와 결론을 쓰는 작업에서 ‘문장을 만드는 함수’의 쓰임이 달라서 문장을 만들 때 염두에 둘 사항이 다르듯, 같은 함수라도 서로 다른 곳에서 다른 목적으로 쓰이기 때문에 함수에 넣어주는 값도 다르고, 함수 내부에서 임시로 기억해야 할 값들은 매번 다르다. 따라서 임시로 사용할 값을 저장할 공간의 위치를 정하는 것이 필요하게 되는데, 이를 해결하기 위해 함수 종료 후 돌아갈 위치를, 함수 내부에서 임시로 사용할 공간과 뭉뚱그려 ‘스택 프레임’이라 불리는 덩어리로 구성하여 메모리에 저장했다. 여기에서 문제가 발생하기 시작했다. 데이터와 돌아갈 위치를 한 덩어리로 저장하는 바람에 큰 데이터를 넣으면 돌아갈 위치를 덮어씌우게 된 것이다. 이를 알아차린 해커들은, 컴퓨터는 데이터와 명령어를 구분하는 능력이 없다는 점을 이용해, 실행시키고자 하는 명령어들을 담은 큰 데이터를 프로그램에 입력하여 프로그램이 실행되어온 자취를 변형함과 동시에 데이터 속에 들어있는 명령어가 실행되도록 했다.
이 기술의 등장 이래로 많은 프로그램의 취약점이 발견되었고 수정되었다. 운영체제는 이러한 기술들을 무력화시키기 위해 끊임없이 보완되었고, 이를 우회하는 기술도 지속적으로 개발되었다. 최근에는 데이터가 명령어로 실행되는 것을 막는 NX라는 기술이 CPU에 적용되기까지에 이르렀다. 하지만 이 방법이 모든 버퍼오버플로우를 막는 것은 아니기 때문에, 앞으로 상당기간 동안 버퍼오버플로우는 유효할 것으로 보인다.

웹의 등장과 해킹

웹이 본격적으로 확산되기 전까지는 대부분의 해킹은 버퍼오버플로우를 이용한 기술이었다. 하지만 웹이 확산되면서 해킹도 웹으로 확장되어 하나의 큰 조류를 만들기에 이르렀다. 사람들은 웹 페이지를 더 화려하게 꾸미길 원했고, 이러한 욕구에 의해 게시판이나 카운터와 같은 웹 어플리케이션이 많이 제작되었다. 그러나 대부분의 웹 어플리케이션은 부주의하게 짜여 공격에 취약했다. 해커는 웹 어플리케이션의 문제점을 찾기 시작했다. 그 과정에서 쿠키 변조나 쿠키 하이재킹, SQL Injection과 같은 기술이 등장했다. 이후 방어기법이 꾸준히 발전하면서 SQL Injection 등의 서버를 대상으로 하는 공격을 원천적으로 막는 효율적인 방법이 고안되었다. 그래서 최근에는 서버를 직접 뚫는 대신 관리자가 열어볼 만한 웹 페이지에 프로그램을 숨겨 관리자 권한으로 실행되도록 만드는 크로스 사이트 스크립팅이라는 기술이 발전되고 있다.
해킹은 굉장히 소모적으로 비추어지기도 한다. 그럼에도 불구하고 프로그램의 취약점에 대해 지속적으로 연구되어야 하는 것은, 취약점을 방치한다면 이를 악용하는 누군가가 반드시 등장할 것이기 때문이다. 그렇기 때문에 해킹에 대한 지원은 확대되어야 할 필요가 있다.
하지만 더욱 중요한 것은 컴퓨터를 사용하는 사람의 인식이다. 최근의 ‘DDoS 대란’의 악성코드는 기술적으로 뛰어난 것이 아니었지만, 문제가 커진 것은 많은 웹 사이트가 공격에 취약하여 악성코드를 퍼트리는 숙주로 변했고, 이 사이트에 접속한 사용자들도 악성코드를 정상적인 프로그램으로 오인해 다운로드받아 실행시켰기 때문이다. 이는 결국 침해사고의 피해 정도를 결정하는 것은 공격기법의 뛰어남 보다는 보안에 대한 인식이라는 것을 시사한다. 지금이라도 직접 운영하는 홈페이지에 쓰는 게시판이 취약하지는 않은지, 인터넷에서 받은 파일이 안전한 파일인지 확인할 필요가 있다. 즉, 인터넷이 안전한 공간일 것이라는 생각을 버려야 한다.