지금까지 웹해킹만 공부하고 있었는데 선배님의 추천에 따라 새로운 분야로 범위를 넓히는 과정의 필요함을 느꼈다.
아직 웹을 잘한다고 말할 수는 없지만 다양한 분야로 지식을 넓히는 과정에서 새롭게 배우는 것이 있을 것이고 각 분야에도 서로 도움이 될 것이라 생각했다.
Reversing 이란
흔히 "역공학", "리버스 엔지니어링"이라 불리며 엔지니어링 즉, 완성품과 이를 구성하는 부품들의 기능과 설계를 고안하고 제작하는 과정의 반대방향, 거꾸로 하는 행위를 말한다.
좋게는 악성코드를 분석하고 해당 프로그램의 보안을 점검할 수 있지만 나쁘게는 프로그램의 코드 흐름을 분석하여 크랙 또는 게임에서 핵을 만들때도 사용된다.
리버싱을 본격적으로 배우기전에 알아야 할 개념들을 먼저 짚고 지나가겠다.
우리는 코딩, 해킹을 공부하면서 기계어, 어셈블리어 등을 들어봤을 것이다.
흔히 모든 프로그램은 0과 1로 이루어져 있다고 하는데 이렇게 우리가 컴퓨터에게 명령을 내리기 위해 컴퓨터가 이해하고 실행할 수 있게 하는 언어, 0과 1로만 이루어진 언어를 기계어 라고 한다.
하지만 이러한 기계어를 사람이 보고 이해하기에는 어려움이 있으며 이를 사람이 사용하여 컴퓨터에 명령을 내리기에는 많은 시간과 노력이 들었다. 이러한 단점을 보안하기 위해 사람이 이해하기 쉽게 새로 만든 언어가 어셈블리어 라고 한다.
이러한 과정이 있었지만 어셈블리어도 프로그램의 규모가 커지면 개발하는데 어려움이 있었다. 그래서 다음으로 나온 게 C, C++과 같은 언어이다.
또한 C, C++ 같은 언어를 컴퓨터가 이해할 수 있게 기계어로 바꿔주는 컴파일러도 개발되었다.
프로그래밍 언어는 고급 언어와 저급 언어로 나뉠 수 있는데
- 고급 언어
사람이 이해하고 읽기 쉬운 언어 (C, C++, Python, Java....)
- 저급 언어
사람이 이해하기 어려운 컴퓨터 언어 (기계어, 어셈블리어)
사람이 C언어로 코드를 작성했다고 가정하자
그러면 C코드를 컴퓨터가 바로 이해할 수 없으므로 전처리 -> 컴파일 -> 어셈블 -> 링크 과정을 거쳐 해석된다.
전처리
전처리는 컴파일러가 소스코드를 어셈블리어로 컴파일하기 전에, 가공하는 과정이다.
보통 주석 제거, 매크로 치환, 파일 병합으로 이루어졌으며
주석 제거 : 프로그램 실행과는 관련 없으므로 제거한다.
매크로 치환 : define으로 정의한 매크로의 이름은 전처리 과정에서 값으로 치환된다.
파일 병합 : 프로그램의 크기가 커질수록 여러 개의 소스와 헤더 파일로 이루어져 있다. 컴파일 후 합치기도 하지만 전처리 단계에서 파일을 합치고 컴파일하기도 한다.
컴파일
컴파일은 소스 코드를 어셈블리어로 번역하는 것이다. 이 과정에서 컴파일러는 소스 코드의 문법을 검사 후 에러를 출력한다.
어셈블
어셈블은 컴파일로 생성된 어셈블리어를 ELF(윈도우일 경우 PE) 형식의 목적 파일로 변환하는 과정이다.
어셈블을 거치게 되면 기계어로 표현되기 때문에 사람이 이해하기 어려워진다.
링크
여러 목적 파일을 연결하여 실행 가능한 프로그램으로 만드는 과정이다.
이로써 사람이 소스 코드를 작성하고 컴퓨터가 이해할 수 있는 기계어까지의 변형 과정을 알아봤다.
그러나 우리가 해야 될 리버싱은 이러한 과정을 반대로 하여 기계어를 보고 분석해야 되는 과정이다.
이러한 과정을 하기 위해서는 기계어를 다시 어셈블리어로 재번역하는 과정이 필요한데 이 과정을 디스어셈블이라 부른다.
이를 넘어 사람들이 어셈블리어에서 고급언어를 만들었듯이 어셈블리어로만 재변역되면 한계가 있다.
그로 인해 고급 언어로까지 재번역해주는 디컴파일러가 나왔다.
하지만 기계어와 어셈블리어는 1대1 대응이 되어 오차가 없지만 고급언어와 어셈블리어는 전처리 과정이 있기때문에 1대1 대응이 불가능하다. 이로 인해 변형이 생기지만 이러한 오차가 프로그램의 동작을 왜곡하지는 않으며 디스어셈블러를 사용할 때보다 분석효율이 뛰어나기 대문에 디컴파일러를 사용하는 것이 유리하다.
'Reversing > 개념정리' 카테고리의 다른 글
[어셈블리어] 빅엔디안, 리틀엔디안 (0) | 2024.04.19 |
---|---|
[어셈블리어] 명령어와 피연산자 (0) | 2024.04.12 |