어셈블리어란?
어셈블리어란 C나 JAVA 와 같은 사용자와 가까운 고급언어보다 기계어와 더 가까운 언어이다.
기계어와 명령어가 1:1로 대응하고,
이 기계어는 CPU 종류에 따라 달라지기 때문에 호환성이 없는 언어이다.
주로 임베디드나 커널 프로그래밍 등에 쓰인다.
어셈블리어의 특징
- 동일한 종류의 프로레서만 실행된다.
- 프로세서에 대한 사전지식이 필요하다.
- 메모리나 입출력장치, 레지스터 등의 구성요소를 직접 다룰 수 있다.
- 컴퓨터에서 실행하는 과정등을 이해하기 쉽다.
고급언어의 특징
- 프로세서 종류 상관X -> CPU의 종류가 달라도 코드에 지장없다.
- 프로세서에 대한 사전 지식이 필요없다.
- 문법이 비교적 간단하고 이해하기 쉽다.
- 코드 양이 적고 디버깅이 용이하다.
컴파일러 VS 어셈블러
- 컴파일러
- 고급언어 프로그램 입력
- 구문 오류 검사
- 목적코드 생성
- 한 문장을 여러개의 기계코드로 변환.
- 어셈블러
- 기계어 형태의 오브젝트 코드로 해석해주는 언어번역 프로그램
- 어셈블리어 프로그램입력
- 하나의 어셈블리어 명령어는 하나의 기계코드에 대응
어셈블리 실행파일 생성 과정
test.asm 이라는 어셈블리 텍스트 파일이 어셈블러를 거치면
os규약과 합쳐져 test.obj 코드가 된다.
이후 이 목적코드가 링커를 거쳐 라이브러리 파일이 합쳐지면 비로소 test.exe가 된다.
어셈블리언어로 프로그래밍 하는것, 어떤가요?
-
규칙이 단순하고 반복이 많다.
- 편의를 위해 내부적으로 많은 매크로 사용
- 매크로 차이로 소스 호환 안되는 경우 많음
어셈블러의 종류
- MASM - 윈도우
- GAS - 리눅스/유닉스
- NASM - 윈도우, 리눅스, 맥
- SASM - 윈도우, 리눅스
이중 SASM 은 통합개발 환경으로 GUI,CUI 둘 다 지원하며
공통 매크로 함수를 지원한다.
화면 및 키보드 입출력과 관련된 다른 운영체제 서비스를 추상화시킨다.
즉, 아키텍처 상관없이 사용이 가능하다.
어셈블리어 구조
- 윈도우 : intel 문법
- 리눅스 : AT&T 문법
+ 코드는 특수한 경우 제외 대소문자 구분 X
+ 주석은 세미콜론 사용.
SASM 설치
구글에 SASM 을 검색해 가장 먼저 나오는 창이다.
링크를 타고 들어가보자. 검색하기 귀찮으니까.
https://dman95.github.io/SASM/english.html
아래로 쭉 스크롤 하다보면 Windows와 Linux용 다운로드 버튼이 있다.
클릭하여 다운로드 받는다.
언어는 다 영어로 설정해준다.
설치하고 실행하면 위 그림과 같은 화면이 나올 것이다.
Create new project를 이용해서 새로운 프로젝트를 만들어준다.
나는 처음 설정을 조금 거쳐서 기본 화면 구성이 저렇다.
첫번째 줄이 %include "io.inc" 면 32bit 매크로를 의미한다.
%include "io64.inc" 는 64bit 매크로다.
32bit 매크로는 64비트의 컴퓨터에서 돌아가지만,
64bit 매크로는 32비트 컴퓨터에서 돌아가지 않는다.
나처럼 새로운 파일을 만들었을 때의 매크로 세팅을 바꾸고 싶다면
Settings -> Build 에서 64를 선택해주면 된다.
x86은 32bit다.
화면 안에 있는 주석도 없애고, section 도 만들어주고 싶다면
Settings -> common 에 들어가서 바꿔주면 된다.
참고로 section .text 는 코드를 쓰는 공간이고,
section .data는 변수를 선언하는 공간이다.
* 이때, section 다음은 반드시 띄우고 .을 쓰길 바란다.
오늘 포스팅은 간단한 어셈블리의 개요와 어셈블러인 SASM을 설치해보았다.
다음 포스팅은 출력과 연산 정도 수준의 어셈블리어 프로그래밍을 실습해보겠다.
'Archive > Hacking' 카테고리의 다른 글
[ Protocol ] 프로토콜 문서 기본 지식 (0) | 2020.04.03 |
---|---|
[ Assemble ] 어셈블리어 출력, add 연산, imul 연산실습 (0) | 2020.03.31 |
[ Bee-Box ] 기타 Injection - OS 커맨드 injection (1) | 2020.03.30 |
[ Bee-Box ] 기타 Injection - iframe injection (0) | 2020.03.30 |
[ Bee-Box ] HTML Injection - Stored(Blog) (0) | 2020.03.29 |