1. 해킹이란 무엇인가?
해킹은 한마디로 말해 믿었던 것에 대한 배신이다.
안전하다고 믿었던 시스템이 안전하지 못하다는 걸 깨달았을 때 느끼는 배신감.
내가 만든 프로그램이 잘 돌아가리라 믿었는데 예상했던것 만큼 잘 돌아가지 않을 때 느끼는 배신감.
믿는 상대에게 속아 정보를 주었음을 깨달았을 때 느끼는 배신감.
거의 모든 해킹은 배신과 연관되어 있다.
배신 당해서 기분좋을 사람은 아무도 없다. 해킹을 당하면 기분이 나쁘다. 그래서 해킹이 나쁜 것이다.
해킹에 있어 정정당당함이란 없다. 아무도 해킹했다고 칭찬하는 사람은 없다. 잘 해야 본전, 아니면 욕이나 실컷 얻어 먹는게 해킹이다.
내가 취약점을 발견함으로써 보안이 강화된다고? 고로 나의 해킹은 인류 발전에 이바지 하는 것이라고?
천부당 만부당한 말씀이다.
내가 취약점을 발견해 동네방네 떠든 덕분에 몰랐던 사람도 알게 된다.
몰랐을 땐 아무도 그 취약점을 이용해 해킹을 할 생각을 못했다. 모르니까.
그러나 내가 발견해 동네방네 떠든 바람에 많은 사람이 알게 되었다.
즉 버그를 아는 사람이 처음엔 나 하나였지만 내가 발표를 함으로써 아는 사람은 1백만명으로 된다.
해킹은 양면의 칼과도 같다. 좋은 데 쓰일 수도, 나쁜데 쓰일 수도 있다.
내가 아무리 좋은데 써도 나쁜데 쓰는 사람이 있게 마련이다.
2. 해킹은 왜 하는가?
이유는 하나다. 해킹이 재미 있으니까 한다.
사람들은 보통 재미로 해킹을 한다. 자기는 재미로 하는데 누군가는 심하게 상처를 입는다. 마치 연못에 재미로 돌을 던지는데 개구리가 맞아 죽는 것과 같은 이치다.
해킹은 기술의 문제가 아니다. 사람의 문제다. 늙어서도 해킹을 계속하는 사람이 있다. 하지만 밥벌이에 바쁘면 안하고(못하고) 시간이 남으면 한다.
해킹은 자기 우월감의 과시다. 탐구가 아니다. 초기에는 순수한 탐구심으로 시작할 지 몰라도 얼마 못간다. 실력이 붙으면 실력을 과시하려 들게 된다. 누구나 다 그렇다.
알기 위해서 테스트만 한다면 문제가 되지 않는다. 하지만 백도어 만들어 계정 훔치고, 조롱하는 메일 보내 관리자 약올리고, 나 잡아봐라 하니까 그게 문제다.
남의 시스템에 몰래 들어가 버그 테스트 한 번 해 봤다. 관리자는 까마득히 모른다. 그냥 테스트만 해 보고 나오면 아무 문제가 없다. 문제는 자료를 빼갔네, 어쩌네 하는 소리가 나올 때까지 하는데 있다. 가장 많이 쓰이는 방법은 와레즈나 FTP같은 남의 서버 들어가 자료를 빼오는 것이다. 빼낸 사람은 별거 아니라고 생각한다. 그러나 당하는 당사자는 그 별거 아닌 일로 인해 해고를 당할 수도 있다.
그래서 해킹하는 사람은 나쁘다(이런 사람들 때문에 먹고 사는 나의 현실이 한심스럽다...)
아는걸 적당히 취미로 사용해야 한다는 걸 알면서 막상 시스템에 들어가면 그냥 나오기 싫은 유혹에 빠진다. 그래서 아는걸 남용한다. 해킹은 좋은 경우에 쓰이는 경우가 거의 없다.
해커는 그런 놈을 찾아 잡으려고 있는 것이 아니다. 방지하려고 있는 것이다.
3. 해결책은?
없다. 이것은 인류가 풀 수 없는 영원한 딜레마이자 숙제다. 믿음에 대한 배신은 인류의 역사와 더불어 존재해 왔다. 인류가 멸망하는 순간까지 계속될 것이다. 유다도 예수를 부정하는 마당에 평범한 인간이야 오죽하겠는가. 인류가 존재하는 한 이런 암울한 현실은 계속될 것이다. "짠!' 하고 슈퍼맨이 나타나도 소용없다.
100% 안전한 시스템이란게 존재할까? 완벽에 가까운 상태는 존재할 수 없다. 새로운 것들이 계속 나오는 현실에 있어 안정은 존재하지 않는다.
욕심이 욕심을 낳는다. 모든 것은 욕심에서 비롯된다. 윤리를 잘 배워서 개인의 양심에 호소하는게 현재로서는 최선책일 것이다.
4. 해킹은 어떻게 하는가?
방법은 의외로 간단하다.
해킹 하는데 사용되는 방법은 다음 2가지다.
1) 뭐가 있는지 알아보고,
2) 되는지 해 본다.
누군가의 집에 불을 지르려면 그 집의 주소를 알아야 한다. 어떤 사람을 공략하려면 먼저 그 사람의 신상 명세서부터 뽑아야 한다. 주소, 하는 일, 가족사항, 전과는 있는지? 병력은? 그리고 컴플렉스는? 이런 것들을 순차적으로 알아본다. 이것이 첫 단계다. 이것을 유식한 말로 스캐닝이라 한다.
그러고 난 뒤 공략한다.
예를 들어 보겠다.
리눅스 커널 안에 ptrace라는 기능이 있다. ptrace는 프로세서를 추적하는 기능이다. 그런데 커널을 개발한 프로그래머 중 누군가가 이 ptrace 기능의 코딩을 잘못 해서 race condition 기법이 먹혀든다는 걸 어떤 놈이 발견했다. 이것이 ptrace 버그다.
이 놈은 동네방네 떠들어댔다. 그래서 사람들은 ptrace를 race condition으로 공략하면 루트를 딸 수 있다는 걸 알게 되었다.
공략은 어떻게 하는가? 익스플로이트로 한다. 익스플로이트를 만들 줄 알면 다 하는 사람이다. 기본을 알면 누구나 만들 수 있다. 그런데 귀찮다. 그래서 대부분 사람들은 남이 만든걸 갖다 쓴다.
여기서 우리는 중요한 2가지를 발견하게 된다.
첫째:"해킹은 어떻게 배우는게 좋은가?"
ptrace를 race condition으로 공략하라는 말은 race condition이 뭔지 모르는 사람에게는 무용지물이다. 아는 사람은 한 번 듣는 것만으로 이유, 내용, 용도, 활용 방법이 머릿속에 저절로 그려진다.
"해킹은 어떻게 배우는게 좋은가?" 에 대한 답이 여기 있다.
이 경우 필요한 것은
- C 언어
- 소스 보는 능력
- 디버깅
- 적용하는 능력
- race condition이 무엇인가
등이다.
그리고 또 하나... 바로 "감"이다.
둘째: "감"에 관하여
이 "어떤 놈"은 코딩이 잘못되었다는 걸 어떻게 알았을까? 얼마나 대단하길래? 심심풀이로 1천줄짜리 소스코드를 읽을 정도로 할 일이 없는 놈일까? 우연의 일치? 소스를 들여다 볼 일이 갑자기 생긴걸까? 쓰다 보니까 뭔가 이상한 점이 보인걸까? 누구처럼 끝내주게 소심한 놈이라 찾아낸 걸까?
1천줄짜리 소스에서 버그를 찾아내는 것은 "타고난 감"이다.
감, 끼, 필... 이건 많이 보고 많이 해본 사람만이 안다. 이런 일을 할 땐 이런데서 실수가 온다는 걸 아는 사람. 같은 것을 보더라고도 대부분 사람이 못보는 걸 볼 수 있는 사람. 이것은 공부해서 되는 것도, 의도적으로 길러지는 것도 아닌 것 같다. 그러나 많이 보고 해보지 않고서는 절대 습득할 수 없는 것이 감이기도 하다.
이상으로 해킹에 대한 정의와 개요에 대해 간단히 소개했다.
조금이나마 도움이 되었기를 바라는 마음 간절하다.
(이 글은 cockroach님이 보내주신 글로 해커스랩 F.H.Z 이 지향하는 방향과 일치하지 않을 수도 있습니다)
# 또한, 이 글은 해커스랩에서 퍼온 것으로서, 프리노트의 방향과 일치할 수도 있습니다.