본문 바로가기

Assembly

(5)
x86 assembly data move instruction [1. 데이터 이동] mov => 두번째 피연산자에 명시 된 레지스터에 저장된 값을 첫번째 피연산자에 명시 된 레지스터에 저장한다. mov => 두번째 피연산자에 명시 된 메모리 주소에 저장 된 값을 첫번째 피연산자에 명시 된 레지스터에 저장한다. mov => 두번째 피연산자에 명시 된 레지스터에 저장 된 값을 첫번째 피연산자에 명시 된 메모리 주소에 저장한다. mov mov => 두번째 피연산자에 명시 된 상수 값을 첫번째 피연산자에 명시 된 레지스터/메모리 주소에 저장한다. ; example code section .bss num resb 8 ; reserve 8bytes num1 resb 8 section .text global _start _start: mov rax, 0x50 mov ebx, 0..
x86 assembly code 구조 [1. 프로그램 메모리 구조] 컴퓨터 프로그램의 메모리 구조는 아래와 그림과 같이 크게 4가지로 구분 된다. Code 영역 text section: CPU가 수행 할 명령어를 저장 Data 영역 data section: 초기화 된 전역 변수, static 변수가 저장됨. (const) bss section: 초기화 되지 않은 전역 변수, static 변수가 저장 됨 Heap 영역 동적 할당 된 변수가 저장 됨 Stack 영역 그 외 변수가 저장 됨 [2. Assembly code structure] 어셈블리 코드 구조 역시 위와 같은 구조로 작성 할 수 있다. section .data str1 db "hello world", 0xa ; label str1 store 'hello world\n' strin..
x86 assembly 디버깅 및 개발환경 구축 [1. 개발환경] 어셈블러 설치 $ sudo apt install nasm [2. 디버깅: pwndbg 설치] 리눅스 디버거 gdb 를 좀 더 사용하기 쉽게 한 플러그인이다. x86 레지스터 값을 어셈블리 코드 단위로 실행하면서 볼 수 있어서 매우 유용하다. pwndbg 는 아래 명령어를 통해 설치할 수 있다. $ git clone https://github.com/pwndbg/pwndbg $ cd pwndbg $ ./setup.sh [3. pwndbg 사용] gdb 처럼 사용한다. $ gdb "a.out" pwndbg> break _start pwndbg> run pwndbg> ni 특정 label 에 breakpoint 설정 후, 디버깅을 시작하며, ni(=next instruction) 을 이용하여..
x86 assembly system call [1. System call] 시스템 콜은 운영체제(커널) 이 제공하는 서비스이다. 예를 들어, C 언어에서 파일을 열고 데이터 작성 및 저장 시, 물리 디스크에 직접 저장하는 코드를 작성하지 않고, 운영체제가 제공하는 함수, 이 경우에서는 write() 같은 시스템 콜을 활용 할 수 있다. [2. x86 system call] assembly 로 작성한 코드도 어셈블러에 의해 컴파일(어셈블) 된 뒤 링커에 의해 링킹 후 실행파일이 되어 하나의 프로그램이 된다. 따라서 assembly 에서도 커널이 제공하는 시스템 콜을 사용 할 수 있다. 다만, 시스템 콜 호출을 위한 지켜야 할 규칙이 있다. 시스템 콜은 호출을 위한 시스템 콜 번호가 정해져 있다. 32bit 와 64bit 에서 시스템 콜 번호가 다르긴..
x86 assembly 개요 [1. 개요] x86 은 인텔에서 개발한 cpu architecture 로, 쉽게 생각하면 데스크탑 및 랩탑에 들어가는 거의 모든 cpu architecture 를 말한다. 그리고 x86 assembly 는 기계어와 일대일로 대응되는 저급 프로그래밍언어로 이러한 아키텍처를 제어할 수 있다. 즉, x86 architecture 인 cpu 를 전부 직접 제어 할 수 있다. 여기서 기계어는 cpu 가 이해할 수 있는 0과 1로 이루어져있으며, 어셈블리는 이 기계어를 사람이 읽을 수 있게 표현해준다. 가령, 기계어 0000'0001'0001'0002 이 reg1 = reg1 + reg2 를 표현한다면, 어셈블리는 위 기계어를 ADD r1, r1, r2 로 표현한다. [2. x86 assembly 문법] x86 ..