목차
1. 프로그램의 분석 방법(정적 분석, 동적 분석)
2. 실행파일이 만들어지는 과정
3. 알면 좋은 리눅스 명령어 정리
4. vim(vi improved) 명령어 정리
1. 프로그램의 분석 방법(정적 분석, 동적 분석)
프로그램을 분석하는 방법은 크게 정적 분석과 동적 분석의 두 가지로 나뉜다.
정적 분석은 프로그램의 코드나 명령어만을 보고 프로그램의 실행과정을 유추하는 분석이고,
동적 분석은 프로그램을 직접 실행시켜 보면서 프로그램의 실행과정을 확인하는 분석이다.
각각을 예를 들어 설명해보자.
만일 실행파일이 있고, 그 프로그램이 악성 프로그램인지 잘 모르겠다면 IDA, x64 dbg 같은 디컴파일러, 디스어셈블러 등으로 코드를 보고 한 해석만으로 실행과정을 유추해낼 것이다.
이렇게 코드 분석만으로 실행과정을 유추하는 분석방법을 정적 분석이라고 한다.
다음으로, 코드가 너무 난잡하고 해석하기 힘들 때, 프로그램을 가상 머신 위에서 실행시켜보며 프로그램에 어떤 기능이 있고, 어떻게 만들어졌을 지 유추해볼 것이다.
이렇게 프로그램을 직접 실행시켜보며 실행과정을 유추하는 분석방법을 동적 분석이라고 한다.
2. 실행파일이 만들어지는 과정
우리가 사용하는 모든 프로그램은 모두 개발자가 코드를 짜고, 그 코드를 '컴파일'해 프로그램을 만들어낸다.
그러나 우리가 알고있는 컴파일은 실행파일을 만들어내는 과정의 일부일 뿐이고, 실은 더 다양하고 복잡한 과정을 거쳐 실행파일이 만들어진다.
1. 전처리기
우리가 프로그램을 실행파일로 만들면, 처음엔 #define, 주석 등의 코드에서 필요없는 부분을 지우고 매크로를 처리해줘야한다.
따라서 컴파일 과정을 거치기 전, 전처리기가 전처리 지시자를 실행시켜, 매크로를 처리한다.
#include "헤더파일"(현재 경로) or <헤더파일>(라이브러리) | 헤더파일을 소스에 포함 |
#define a b | b -> a, 특정 값으로 매크로 처리 |
#if, #ifdef, #endif... | 컴파일 시의 조건 결정 |
#line | 컴파일 오류 등의 목적으로 줄 수를 보고함 |
#error a | a를 에러보고 메시지로 출력 |
#pragma | 컴파일 설정 제어 |
그리고 이렇게 전처리기를 거친 코드는 .i 라는 확장자명을 가지고 나온다.
그러나 이렇게 나온 코드는 전처리기를 거쳤지만 아직 실행할 수 없다. 컴퓨터는 0, 1밖에 몰라 printf, scanf 등의 함수를 이해할 수 없다.
따라서 이 코드를 기계어로 바꿔줘야 한다.
2. 컴파일
드디어 우리에게 익숙한 컴파일 과정이 나왔다.
이 컴파일 과정에선 하이레벨 프로그래밍 언어로 짠 코드를 어셈블리어라는 로우레벨 프로그래밍 언어로 해석한다.
컴파일은 크게 front end, middle end, back end로 나뉘는데, 하나씩 살펴보자.
front end에선 C언어의 printf, 파이썬의 print, C++의 cout 등의 언어 종속적인 표현을 공통된 표현으로 해석한다.
그 다음 소스코드를 gimple tree라는 트리 형태로 고쳐 middle end로 넘겨주게 되는데, gimple tree가 뭔지 알아보자.
front end에서 middle end로 넘겨줄 때 gimple tree를 만들어 준다고 했는데, 이 tree를 만드는 과정은 다음과 같다.
C(AST) → C(genericize) ↘
C++(AST) → C++(genericize) → GENERIC 트리 → Gimplify → GIMPlE 트리
Java(AST) → JAVA(genericize) ↗
이렇게 generic 트리를 형성한 후, gimple 트리를 형성한다.
generic 트리는 언어 독립적인 특징을 제공하기 위해 형성하는 트리이고,
gimple 트리는 언어 독립적인 특징을 공통적인 특징을 가지도록 바꾼 트리이다.
front end에선 언어 종속적인 표현을 공통적인 표현으로 바꿨다면, middle end에선 아키텍처 비종속적인 최적화를 진행한다.
ex) ARM, x32, x64에 상관없는 최적화
middle end에서 최적화를 진행하면 RTL이라는 형태로 나오는데, 이는 백엔드에서 사용하는 언어로, 하이레벨 프로그래밍 언어와 어셈블리어의 중간 형태이다.
back end에선 middle end에서 받은 RTL 언어를 이용해 아키텍처에 종속적인 최적화를 진행한다.
ex) ARM, x32, x64마다 다른 명령어를 이용해 각 아키텍처에 최적화
이렇게 back end에서까지 최적화를 마치면, 그토록 바라던 어셈블리어가 탄생하게 된다.
3. 어셈블러
어셈블리어가 만들어졌지만, 아직도 코드는 실행할 수 없다.
컴퓨터는 0, 1 밖에 모르는데 movl 등의 알 수 없는 영어들이 나오기 때문이다.
따라서 어셈블러를 거쳐 2진수로 이뤄진 기계어로 만들어줘야 한다.
4. 링커
어셈블러로 기계어를 만들었지만 '아직도' 실행시킬 수 없다.
소스코드 상엔 printf, scanf 등의 함수가 정의되어있지 않기 때문에 헤더파일을 포함시켜줘야 한다.
이 과정을 링킹이라고 부르고, 두 개의 방법으로 할 수 있다.
첫번째는 정적 링킹이라고 하는데, 이는 라이브러리 자체를 소스 코드 안에 포함시키는 방법이다.
물론 용량이 매우 방대해진다.
두번째는 동적 링킹이라고 하는데, 이는 dll, so 등의 동적 링킹 라이브러리 파일을 이용해 굳이 실행파일 안에 정의가 없어도 사용할 수 있도록 라이브러리 파일 안에 정의하는 방법이다.
이 방법이 더 좋아보일 수도 있으나, 컴퓨터 내에 dll 파일이 존재하지 않을 시 프로그램 실행이 안 된다.
알면 좋은 리눅스 명령어 정리
ls "..." | ls만 치면 현재 디렉토리 내에 있는 모든 파일 표시, 뒤에 경로를 넣어주면 그 경로 내에 있는 모든 파일 표시 |
cd "..." | 뒤에 경로를 넣어주면 그 디렉토리로 이동("../" -> 한 단계 위로 이동, "./" -> 현재 디렉토리 |
vi(m) "..." | 뒤에 파일 이름을 넣어주면, 그 파일을 vi 편집기로 편집, 파일이 존재하지 않는다면 새 파일을 만듦 |
chmod "..." "..." | 첫번째로 권한 옵션을 넣어주고, 두 번째로 파일 이름을 넣어주어 인자로 들어간 파일의 권한을 변경한다. 이때, 권한은 숫자 3개로 표현한다. 각 숫자는 사용자 권한, 그룹 권한, 다른 사용자 권한을 표시한다. |
mkdir "..." | 현재 디렉토리에 "..."이라는 이름을 가진 디렉토리 생성 |
sudo | 임시로 권한을 root로 상승시킴 |
rm "..." | 뒤에 들어간 파일을 삭제한다.(-f로 디렉토리 삭제도 가능) |
gdb "..." | 뒤에 들어간 파일을 gdb 디버거로 연다. |
gcc/g++ | 각각 C언어, C++파일을 컴파일한다. |
python "..." | 뒤에 인자를 주지 않으면 파이썬 대화식 모드 열기, 인자를 주면 인자로 들어간 파일 실행 |
cp "..." "..." | 첫번째 인자로 들어간 파일을 두 번째 인자의 이름을 가진 파일로 복사 |
vi 유용한 명령어 정리
명령어 모드(command mode) | |
i | 입력 모드 |
dd | 한 줄 삭제 |
u | 뒤로 돌아가기 |
yy | 현재 줄 복사 |
p | 현재 커서 바로 아래 줄에 붙여넣기 |
(N)dd | 현재 줄부터 N행 잘라내기 |
(N)- | N줄 위로 이동 |
(N)+ | N줄 아래로 이동 |
r | 한 문자 변경 |
G | 파일 맨 끝으로 이동 |
cc | 커서가 위치해있는 줄의 내용 변경 |
마지막 행 모드(last line mode) -> 명령 모드에서 콜론(:) 입력 | |
:w | 파일 저장 |
:wq "..." | 인자로 들어간 이름을 파일이름으로 저장 |
:q! | 강제 종료(저장 안 됨) |
:wq | 저장하고 나가기 |
:f "..." | 인자로 들어간 문자열로 파일이름 변경 |
:(N) | N번째 줄로 커서 이동 |
/"..." | 현재 커서 앞쪽의 인자로 준 문자열 탐색 |
?"..." | 현재 커서 뒤쪽의 인자로 준 문자열 탐색 |
'reversing' 카테고리의 다른 글
layer7 리버싱 5차시 과제(2) - prob3 분석 (0) | 2022.08.01 |
---|---|
Layer7 리버싱 5차시 과제(1) - prob5 풀이 (0) | 2022.08.01 |
Layer7 리버싱 4차시 과제(2) - prob2 풀이 (0) | 2022.07.27 |
layer7 리버싱 4차시 과제(1) - prob1 풀이 (0) | 2022.07.27 |
Layer7 리버싱 3차시 과제 (0) | 2022.07.25 |