어셈블리어를 공부하기 전 "어셈블리어를 왜 공부해야하는가"에 대해서 자신의 생각을 정리하고 공부하면 조금 더 구체적으로 공부 방향성을 잡을 수 있어서 블로그를 작성하게 되었다.
어셈블리어는 바이너리 코드를 사람이 읽을 수 있도록 나타낸 저수준 언어이다.
어셈블리어는 기계어와 1대1로 대응되는 가장 저수준 언어이기 때문에 하드웨어의 동작과도 밀접하게 연관되어 있다.
맛보기로 예시를 들자면
add eax, ebx
는 EAX 레지스터에 EBX 레지스터의 값을 더한 뒤, 그 결과를 다시 EAX에 저장하는 명령이다.
ALU는 무엇인가?
- 산술 논리 장치(Arithmetic and Logical Unit, ALU)는 산술연산과 논리연산을 계산하는 디지털 회로이다.
자세한 정보(나중에 ALU에 관해 제 블로그 써서 링크 넣을게염)
어셈블리어를 왜 공부해야하는지에 대해서 컴퓨터 구조, 보안적 관점, 최적화 관점 총 3가지 관점에서 생각해보았다.
컴퓨터 구조는 하드웨어(레지스터, 메모리, 캐시, 파이프라인 등)가 명령을 어떻게 처리하는지 보는 분야다.
어셈블리어는 그런 하드웨어 동작을 ‘직접 보여주는’ 언어라서, 컴퓨터 구조를 공부할 때 함께 보면 이해가 훨씬 쉬워진다.
mov, add 같은 명령이 레지스터를 어떻게 바꾸는지 확인한다.보안은 컴퓨터 시스템의 내부 동작을 이해하는 학문이다.
어셈블리어는 하드웨어와 소프트웨어의 경계를 직접 다루는 언어이므로 보안 분야에서 필수적이다.
아래는 어셈블리어가 특히 많이 쓰이는 리버싱 기반의 실무 활동들이다.
리버싱
리버싱은 컴파일된 실행 파일(바이너리)를 분석하는 과정이다. 이 과정에서 실행 파일을 분석할때
어셈블리어는 필수적이다.
취약점 분석은 프로그램의 설계·구현상 결함을 찾아내어 악용 가능성을 평가하는 작업이다. 어셈블리 코드를 보면 함수의 스택 프레임, 메모리 접근 오프셋, 경계 검사 여부 등을 직접 확인할 수 있으므로, 버퍼 오버플로우나 잘못된 포인터 사용과 같은 결함을 정확히 식별하고 영향 범위를 평가할 수 있다.
익스플로잇 개발은 발견된 취약점을 실제로 악용해 시스템 동작을 제어하는 페이로드를 만드는 과정이다. 이 과정에서는 리턴 주소(EIP/RIP) 조작, 레지스터 값 설정, 시스템 콜 호출 방식 등 어셈블리 수준의 제어가 전제되어야 하므로 어셈블리 이해가 필수적이다.
악성코드는 소스 없이 배포되는 경우가 대부분이고 난독화·패킹이 자주 사용된다. 어셈블리 수준에서 코드 흐름과 API 호출 패턴을 읽을 수 있어야 파일 암호화 루틴, 키로깅, 네트워크 통신 등 악성 행위를 분해·추적하고 대응 방안을 세울 수 있다.
최적화는 코드가 하드웨어에서 더 빠르고 효율적으로 실행되도록 만드는 작업이다.
어셈블리어는 컴파일러가 실제로 내보낸 명령어 시퀀스를 그대로 보여주기 때문에, 성능 문제의 원인을 바로 확인하고 직접 개선할 수 있게 해준다.