TIL 222-07-23 (1)

고둑·2022년 7월 29일
0

어셈블

어셈블리 코드 ------> Elf 형식(Linux)/PE 형식(Window)의 오브젝트 파일로 변환                   (어셈블)

이 단계부터는 사람이 해석하기 거의 불가능함!!

링크

링크 -> 여러 오브젝트 파일 엮어서 실행 가능한 바이너리로 만듬!!

ex)

#include <stdio.h>

int main() { 
printf("Hello, world!"); 
}

printf는 main.c가 아닌 libc라는 c 표준 라이브러리에 존재하는 함수임 -> libc에 존재하는 함수들 중 표준 입출력을 담당하는 함수들을 stdio.h로 묶어놓은 거

링커는 main.c에서 사용하고 있는 printf를 직접 stdio.h에서 찾아서 기능을 넣어주는 역활을 하고 있다고 보면 편함


어셈블 배웠으니까
그럼 디스어셈블은 뭘까? 당연히 어셈블의 반대, 즉 어셈블되있는 기계어 코드들을 다시 사람이 읽을 수 있는 형태로 풀어놓는거
이게 리버스 엔지니어링 -> 리버싱임

근데 솔직이 어셈 잘하는 사람도 있겠지만 솔직히 어셈도 해석하기 힘든 사람 많다.(그게 나야 뚜비뚜비뚜비뚜밤)
따라서 우리는 컴파일을 풀어줄 디컴파일러를 개발하게됨

BUT 기계어 TO 어셈은 1대1 대응 가능! -> 원본과 100프로 일치하는 어셈블리 생성 가능

하지만 어셈 TO 고오급 언어는 1대1 대응이 않됨 ==> 컴파일할때 우리가 입력한 변수명, 함수명과 같은 것들은 지워버리고 최적화 방식에 따라 코드가 압축되기도함

따라서 디컴파일러는 정확하지 않을 수도 있다! -> 하지만 디스어셈블러로 분석하는 것보다는 훨씬 효율적이므로 디컴파일러 사용 추천

이번장 요약

프로그램

컴퓨터가 실행해야할 파일 (= 프로그램)

전처리

우리가 짠 소스 코드를 컴파일 전 필요한 형식으로 가공하는 과정

컴파일

소스 코드 -> 어셈블리어

어셈블

어셈블리어 -> 기계어

링크

여러 가지 오브젝트 파일의 조인 + 필요한 라이브러리와 연결

디스어셈블

기계어 -> 어셈블리어

디컴파일

어셈블리어 -> 소스 코드

profile
문워킹은 하지말자

0개의 댓글