해킹이라는 것은 아주 많이 들어보셨을 겁니다. 최근 들어서 사회가 정보화 사회로 탈바꿈 되었고, 이미 대한민국은 컴퓨터 혹은 네트워크없이는 말을 못할 정도로 크게 발전이 되었죠. 그로 인해, 해킹이라는 것 또한 이슈로 떠올랐을 겁니다. 최근 들어서 옥션 개인 정보 유출등의 사건과도 연관을 지을 수도 있는 부분입니다.
이 해킹혹은 크래킹에 있어서 주요한 원인은 어떤 것일까요? 가장 크게 말해서 프로그램 제작상 소스코딩의 오류라고 표현을 할 수 있다고 합니다. 왜 그런가 하면 아래의 코드를 한 번 보도록 할 까요?
이 같은 경우 어떠한 문제를 불러일으킬 수 있을까요?? 흔히 C++, C 코드가 기계어로 바뀌는 과정을 대충적이나마 알고 계신 분들은 원인을 대충 아실 겁니다. 함수를 호출하기 위해서는 스택에 return 될 코드를 push 한 뒤, Call 명령 혹은 Jmp 명령으로 호출하게 되죠, 그런데 지역 변수라는 것 또한 해당 컨텍스트의 스택에 존재하게 된다는 게 이 코드의 문제점 원인 입니다.
이와 비슷한 형태를 띄고 있기 때문에 만약 데이터를 읽는데 있어 return 될 주소의 코드가 다른 정보로 뒤 덮어씌워진다면 어떠한 문제점이 생길까요? Process 함수를 호출한 뒤, main 함수로 다시 돌아가지 않고, 어떠한 특정 함수로 호출이 될 수 있다는 점이 문제입니다.
이 게 만약 Linux, Unix 쪽의 텔넷 터미널 쪽으로 접속되었을 때 수행이 되는 코드라고 생각을 해 봅시다. 그럼 악의적인 목적을 가진 사용자가 Telnet Control 소켓으로 일반적인 키보드로는 입력할 수 없는 데이터를 전송하여 return 코드를 덮어씌워버릴 수 있지 않을까요? 만약 그렇게 된다면 특정 커널 코드로 return 주소를 수정할 수 있고, 그로 인해 사용자의 권한이 관리자의 권한으로 지정되게 될 지도 모르겠죠.
그런데 이러한 코드가 저런 부분만 해당 되느냐 하면 그것은 또 아닙니다.
위와 같은 코드일 경우 문제점이 생길 것 같다는 생각이 들지 않나요? 바로 strcpy라는 함수에 바운더리를 계산하는 부분이 없어서 그렇습니다. 입력된 문자열이 길다면 그냥 데이터를 뒤집어 씌운다는 점으로 인하여 잠재적인 보안의 위협적 요소를 가지게 된다는 점이 중요합니다. strcpy 함수의 내부 구현은 아마도 '\0', NULL 문자가 나올 때 까지 해당 Dest 문자열에서 Src 문자열 까지 복사를 하도록 구현이 되어있을 겁니다. 그리하여 문제점이 생길 수 있는 것이구요.
그래서 strcpy 대신에 strncpy를 사용하도록 권고가 되었고, 이 것 또한 모자라서 VS.net 2005 이상 부터는 strcpy_s 를 사용하도록 기존 문자열 함수들은 디프리케이트 된 것으로 알 고 있습니다. 사용하지 말라고 비권고까지 시켜버렸는데 굳이 사용할 이유는 없겠죠?
책을 더 읽어서 유용한 정보가 있으면 더 올려보도록 하겠습니다. 이러한 보안요소는 지켜가며 코딩을 해야 겠다는 생각이 줄줄 드는군요^^;
이 해킹혹은 크래킹에 있어서 주요한 원인은 어떤 것일까요? 가장 크게 말해서 프로그램 제작상 소스코딩의 오류라고 표현을 할 수 있다고 합니다. 왜 그런가 하면 아래의 코드를 한 번 보도록 할 까요?
이 같은 경우 어떠한 문제를 불러일으킬 수 있을까요?? 흔히 C++, C 코드가 기계어로 바뀌는 과정을 대충적이나마 알고 계신 분들은 원인을 대충 아실 겁니다. 함수를 호출하기 위해서는 스택에 return 될 코드를 push 한 뒤, Call 명령 혹은 Jmp 명령으로 호출하게 되죠, 그런데 지역 변수라는 것 또한 해당 컨텍스트의 스택에 존재하게 된다는 게 이 코드의 문제점 원인 입니다.
return 될 주소
첫 번째 인자.
두 번째 인자.
세 번째 인자.
.
.
.
지역 변수
현재 스택 포인터
첫 번째 인자.
두 번째 인자.
세 번째 인자.
.
.
.
지역 변수
현재 스택 포인터
이와 비슷한 형태를 띄고 있기 때문에 만약 데이터를 읽는데 있어 return 될 주소의 코드가 다른 정보로 뒤 덮어씌워진다면 어떠한 문제점이 생길까요? Process 함수를 호출한 뒤, main 함수로 다시 돌아가지 않고, 어떠한 특정 함수로 호출이 될 수 있다는 점이 문제입니다.
이 게 만약 Linux, Unix 쪽의 텔넷 터미널 쪽으로 접속되었을 때 수행이 되는 코드라고 생각을 해 봅시다. 그럼 악의적인 목적을 가진 사용자가 Telnet Control 소켓으로 일반적인 키보드로는 입력할 수 없는 데이터를 전송하여 return 코드를 덮어씌워버릴 수 있지 않을까요? 만약 그렇게 된다면 특정 커널 코드로 return 주소를 수정할 수 있고, 그로 인해 사용자의 권한이 관리자의 권한으로 지정되게 될 지도 모르겠죠.
그런데 이러한 코드가 저런 부분만 해당 되느냐 하면 그것은 또 아닙니다.
위와 같은 코드일 경우 문제점이 생길 것 같다는 생각이 들지 않나요? 바로 strcpy라는 함수에 바운더리를 계산하는 부분이 없어서 그렇습니다. 입력된 문자열이 길다면 그냥 데이터를 뒤집어 씌운다는 점으로 인하여 잠재적인 보안의 위협적 요소를 가지게 된다는 점이 중요합니다. strcpy 함수의 내부 구현은 아마도 '\0', NULL 문자가 나올 때 까지 해당 Dest 문자열에서 Src 문자열 까지 복사를 하도록 구현이 되어있을 겁니다. 그리하여 문제점이 생길 수 있는 것이구요.
그래서 strcpy 대신에 strncpy를 사용하도록 권고가 되었고, 이 것 또한 모자라서 VS.net 2005 이상 부터는 strcpy_s 를 사용하도록 기존 문자열 함수들은 디프리케이트 된 것으로 알 고 있습니다. 사용하지 말라고 비권고까지 시켜버렸는데 굳이 사용할 이유는 없겠죠?
책을 더 읽어서 유용한 정보가 있으면 더 올려보도록 하겠습니다. 이러한 보안요소는 지켜가며 코딩을 해야 겠다는 생각이 줄줄 드는군요^^;
"Programming Tip" 분류의 다른 글
| OpenMP 라고 아십니까?? (0) | 2008/07/27 |
| 심심해서 구현해본 그래픽 요소 (0) | 2008/07/03 |
| Child Window Mouse Message 문제. (0) | 2008/07/01 |
| GDI+ 사용 시 Smart Pointer 란?? (0) | 2008/04/12 |
| Com Library in C++ Builder - C++ 빌더에서 Com 라이브러리, .Net라이브러... (0) | 2008/03/29 |


댓글을 달아 주세요