-
혹시 해킹 보안 쪽의 기본기를 다질 수 있는 시간 6개월 정도가 주어진다면, 그 시간 동안 어떤 걸 하는 게 좋다고 생각하시나요? 조금 더 기본기를 탄탄히 다질 수 있는 재미있는 방법이 있을까요? 꼭 재미는 아니더라도 기본기 자체를 더 튼튼히 하려면 어떤 게 있을까요?
시스템해킹도 시스템해킹이고 리버싱도 리버싱이지만, 이 기반이 될 수 있는 전체를 더 잘 구성할 수 있는 길 혹은 방법이 뭘까요? c언어 어셈블리어 등에 대해서 실질적으로 더 깊이 이해할 수 있는 좋은 방법이 뭘까요? 기본을 튼튼히 다지면서도 더 재미있게 배울 수 있는 방법이 뭘까요? -
익스플로잇 등을 잘 짜는 방법이 뭘까요? 꼭 시스템 해킹이 아니더라도 c언어 혹은 파이썬 등으로 익스플로잇을 잘 만드는 분들을 간혹가다가 봤어요. 사실 제 프로그래밍은 주로 새로운 것을 만드는데 더 주 목적이 있어서 (그런 식으로 프로그래밍을 배우기도 했고) 여러 언어로 자유자재로 익스플로잇이나 페이로드를 구성하는 분들을 보면 대단하다고 생각이 들기도 하고, 어떤 내용을 배워서 저렇게 할 수 있는 건지 궁금하기도 하고 그냥 역시 기본 프로그래밍을 바탕으로 계속 만들다보니 그렇게 자유자재로 짜는 거겠죠? 그래도 궁금하긴 한게 ㅋㅋㅋ C언어, 파이썬 혹은 어떤 언어든 그걸 조금 더 익스플로잇 쪽으로 배울 수 있는 좋은 콘텐츠 같은 게 있을까요? 어떻게 해야 더 깊이 이해하고 자유자재로 구성할 수 있을까요??
개인적인 생각을 남기고 갑니다.
-
해킹 보안의 기본기는 Computer Science 라고 생각합니다. 공부를 위한 6개월이 주어진다면, 공개된 대학 커리큘럼 (운영체제, 컴퓨터구조, 시스템 프로그래밍, DB 등) 중 3~4가지를 골라 정말 수업듣는 학생처럼 공부하고, 시험도 보고 해보는게 좋을 것 같습니다. 하고싶은 분야에 따라 다르지만, 질문 주신 c나 어셈블리를 더 실질적으로 깊이 이해하는데에는 컴퓨터구조(Computer Architecture), 운영체제 과목이 가장 크게 와닿는 것 같습니다. 사실 우리가 해킹의 분야를 구분하고 있긴 하지만, 본질적으로는 모두가 '컴퓨터' 안에서 일어나는 일이기 때문에 어떤걸 배우든지 연결되지 않는 지식은 없다고 생각합니다. 더욱이, 새롭게 나오는 취약점들을 설명하는 글들은 독자가 CS 전공자만큼의 배경지식이 있을 것이라 가정하는 경우가 많더라구요. (배경지식이 없다고 이해 못하는 것은 아니나, 이를 하나하나 이해하는데 드는 시간이 크게 줄어들죠).
물론 이러한 대답의 전제는 질문자분이 대학 과목을 수강하지 않았을 경우입니다. 만약 이미 이러한 배경지식이 있고, 이와 별개로 보안 기초공부가 하고싶으신거면, 역시 wargame과 CTF 밖에 없는 것 같습니다. 특히나 CTF는 문제가 불친절한 경우도 있고, 이를 풀기위해 정말 마이너한 지식을 요구하는 경우도 왕왕 있습니다(모르면 못푸는...). 문제를 접해보고, 풀이를 본 후에 반드시 거기 사용된 지식을 머릿속에 담아둘 필요까지는 없으나, 나중에 같은 것을 물어보는 문제를 만났을 때 어떤 자료, 어떤 문제 풀이를 찾아봐야하는지만 기억할 수 있어도 충분하다고 봅니다. -
익스플로잇을 잘짜는방법은, 역시나 보고 배우는것 밖에 없을 것 같습니다.(제 경험으로도 그렇게 느꼈습니다.)
이를 위한 왕도를 후대에 전공하는 자료들이 사실 writeup이 아닌가 싶은데요. 내가 익스플로잇을 짤 때 어려웠던 부분들은 다른사람들은 어떻게 했는가? 가 핵심인 것 같습니다. 중요한 점은 내가 푼 적 없는 문제의 익스플로잇을 찾아보는 것 보다, 어느정도 분석해봤고 삽질해본 문제에 대한 라업을 봤을때 익스플로잇 더 잘 이해할 수 있고, 내가 못했던것을 이 사람은 어떻게 대응했는지를 더 잘 찾아내고 이해할 수 있다는 점입니다.
이런 맥락에서도 CTF를 자주 참여하는게 도움이 되는 것 같습니다. wargame에 비해서 CTF는 더 다양하고 못된(?) 문제가 많이 나옵니다. 어떤 때는 어떻게 익스플로잇해야하는지 모를 수도 있고, 어떤 경우에는 접근방법조차 떠올리지 못할 때가 있죠. 하지만 이게 본인이 실력없고 형편없어서가 아니라 '몰라서' 어찌하지 못했다는 점을 기억하고, 풀이를 보고 공부할 수 있으면 그 다음번에 똑같은(비슷한) 문제가 나왔을때는 문제없이 풀 수 있게 된다! << 이 부분이 지켜진다면 훌륭하게 공부하고 있는 것 아닐까요?
저런 못된 문제들을 풀어보고나서(라업도보고나서) 내가 몰라서 못푼것인지 아니면 충분히 떠올릴 수 있는 아이디어를 떠올리지 못해서 못푼것인지 판단할 수 있다면 좋은 경험이 되었던 것 같습니다.
또, 라이트업이나 익스플로잇을 보고 이게 좋은지 판단하는 건 경험적인 부분이라서 어렵네요. 익스플로잇, 라이트업을 여러번 써보는 것도 좋은 것 같습니다. 모든 학문, 지식이 그렇듯이 본인이 잘 이해했음을 증명하는 좋은 방법이 타인에게 가르쳐줄 수 있는가? 를 보는 것이잖아요? 내 익스와 라업이 다른사람에게 전혀 이해할 수 없는 바이트 덩어리라면 어떤부분이 원인인가를 찾아보는 것도 좋을 것 같습니다.
이와 별개로, 디버깅을 얼마나 잘하는지도 익스플로잇을 짜는데 영향을 미치는 것 같습니다. 또, 디버깅을 잘하기 위해서는 internal을 잘 이해하고 있어야 하구요. 결국 다시 CS 지식이 필요하다로 넘어오네요.. !!
사실 slow thinker님은 저보다 훨씬 많이 문제를 푸시고 있기 때문에 제 답변이 와닿지 않으실것도 같습니다..
어떻게 공부하는게 좋은가? 는 영원히 답이 나오지 않을 세계의 난제가 아닐까 싶네요.. 그만큼 개개인이 생각하는 방법도 다양할 것 같습니다.
행복한 하루 되시길 바랍니다.