Guru가 되기 위해 공부할 것
정리 2018. 5. 25. 09:49 |1. 영어.
영어는 평생을 안고 가야할 언어다.
프리토킹은 필요없다. 원서를 읽고 이해하고 학습할 수준까진 영어를 배워야한다.
문법도 필요없고, 독해만 열심히 하면 된다.
2. 프로그래밍을 공부할 것.
프로그래밍을 공부해야 하는 건 너무나 당연한 것이다.
다만, 프로그래밍 언어에 목맬 필요는 없다.
프로그래밍을 공부하랬더니 프로그래밍 언어에 목매는 사람들을 많이 보았다.
나 또한 그랬고..
언어는 C언어 하나만 잘 다뤄도 된다.
중요한 건 프로그램이란 것은 어떻게 짜야하고 어떻게 돌아가는지, 운영체제 위에서 프로그램이 돌아가는 원리.
디바이스 드라이버는 어떻게 개발되어지는 지 등등을 배워야 한다.
java로 할 수 있는일, C#으로 할 수 있는일 Python으로 할 수 있는일 모두 다
C언어로도 가능하다.
그러니 언어를 문어발 식으로 배울 필요는 없다.
Python은 매우 간단한 프로그램을 쉽고 빠르게 만들 수 있으니 선호하는 것 뿐이다.
Python은 내가 생산성을 증가시켜야 될 필요가 있다 싶을 때 배워도 충분하다.
프로그램이 구동되는 전체적인 로직을 이해하고 있는 사람이라면, 언어를 배우는 건 2주면 충분하기 때문에
절대, 언어에 많은 시간을 쏟지 말아라.
3. Linux를 공부할 것.
대부분의 작업을 간단한 스크립트 작성으로 해결할 수 있을 정도로
스크립트 작성의 대가가 되어야 한다.
Bash 쉘의 스크립트를 배워라.
또,
리눅스 커널이 어떻게 동작하는지, 어떻게 구성되어 있는지 알아야 한다.
일반적으로 우분투와 같은 배포판을 윈도우처럼 간단하게 설치하여 사용하기 때문에
커널이란 녀석이 도대체 어떤 모습인지 아는 사람은 거의 없다.
리눅스를 더 잘 다루고 깊게 이해하고 싶다면 배포판이 아니라 직접 파일시스템부터 구성해서 커널을 컴파일하고 돌려볼 필요가 있다.
여기서 LFS(Linux From Scratch) 프로젝트로 맨땅에서 시작하여 리눅스를 구축해볼 수 있다.
물론 모두 영문이다.
다만, 쉬운 영어로 쓰여 있어 고등학생 정도의 실력이면 충분히 독해 가능하다.
(그리고 요즘 구글번역이 매우 뛰어나 대부분의 문장은 제대로 해석해준다.
그래도 중요한 문장이 오역되어 오해하면 치명적이니 직접 독해할 수 있어야 한다. )
4. 리버싱을 공부해라.
모든 프로그램은 기계어로 되어있다.
기계어란 CPU가 이해할 수 있는 언어로
C언어로 작성된 코드를 컴파일하면 CPU가 이해할 수 있는 언어인 기계어로 번역되는 것이다.
이 기계어는 어셈블리어와 1:1 매칭이 되므로 기계어를 어셈블리어 형태로 변환하여 프로그래머가 알아볼 수 있게 바꿀 수 있다.
리버싱은 이렇게 기계어를 어셈블리어로 역으로 변환 하여 분석하는 작업을 뜻한다.
리버싱을 통해 원래의 소스코드를 유추하거나 동작의 원리를 파악할 수 있다.
또한, 해당 프로그램의 취약점을 발견할 수 있으며, 프로그램의 동작을 조작할 수 있다.
이 역할을 하는 프로그램을 디버거라고 하며 Windows엔 대표적으로 ollyDbg가 있고 Linux진영엔 GNU gdb가 있다.
굉장히 비싼 가격으로 구매할 수 있는 IDA pro도 대표적인 디버거 툴이다.
디버거 툴의 기능을 모두 꿰고 있으면 리버싱을 수월하게 할 수 있다.
리버싱을 하는데에는 많은 사전 지식이 필요하기 때문에 매우 어렵고 많은 시간을 투자해야 하는 영역이다.
운영체제, 프로그래밍, cpu 아키텍쳐 와 같은 컴퓨터공학의 전반적인 지식을 모두 갖추고 있어야 한다.
5. 네트워크를 공부해라.
그리고나서 네트워크 통신의 프로토콜들을 하나씩 분석해 나가면 된다.