# 1. 어셈블리 언어 개요 ## CPU 아키텍쳐 - CPU의 내부 동작 방식과 구성 요소를 정의하는 설계 개념 - CPU 아키텍쳐에 따라 명령어, 레지스터 구조 등이 다름 - **x86, arm**, mips, Power PC 등 ### x86 - 32bit architecture - 64bit 버전 - Windows, Linux, Mac ### arm - 32bit architecture - 64bit 버전 - 모바일 기기 및 임베디드 시스템 ## 어셈블리어 ### 어셈블리어 - ==기계어와 일대일 대응==이 되는 저급언어 ### 기계어 - ==0과 1로 이루어진 컴퓨터==가 이해할 수 있는 언어 ### 저급언어 - ==컴퓨터가 이해하기 쉬운== 언어 - 어셈블리어, 기계어 ### 고급언어 - ==사람이 이해하기 쉬운== 언어 - C언어, 자바, 파이썬 등 --- 고급언어 -> 컴파일러 -> 기계어 고급언어 <- 디컴파일러 <- 기계어 `(완벽 X)` 어셈블리어 -> 어셈블러 -> 기계어 어셈블리어 <- 디스어셈블러 <- 기계어 (일대일 대응) ## 어셈블리어를 공부하는 이유 - 리버싱 - 시스템해킹 - 프로그램 패치 - 디컴파일러 버그 -- 디컴파일을 정상적으로 하지 못하는 경우 **(함수나 switch문 인식 못하는 경우, 함수가 너무 큰 경우)** -- 디컴파일러에 나온 코드와 다르게 동작하는 경우 **(디컴파일된 코드만 보면 변수에 0또는 1만 삽입될 수 있지만 어셈블리로 보면 -1도 올 수 있는 경우)** - 가젯 탐색 - 쉘코드 작성