c0mpos3r

Proper program exit 본문

Develop/Assembly

Proper program exit

음대생 2024. 7. 4. 14:16

올바른 프로그램 종료

1강에서 시스템 호출을 실행하는 방법을 성공적으로 배웠다면 이제 커널에서 가장 중요한 시스템 호출 중 하나인 sys_exit에 대해 배워야 한다.

 

‘Hello, world!’ 프로그램이 실행된 후 어떻게 세그멘테이션 오류가 발생했는지 기억하시나요? 컴퓨터 프로그램은 메모리에 로드되어 섹션(또는 세그먼트)으로 나뉘어져 있는 긴 명령어 조각으로 생각할 수 있다. 이 일반적인 메모리 풀은 모든 프로그램 간의 공유되며 변수, 명령어, 다른 프로그램 또는 실제로 무엇이든 저장하는 데 사용할 수 있다. 각 세그먼트에는 해당 섹션에 저장된 정보를 나중에 찾을 수 있도록 주소가 지정된다.

 

메모리에 로드된 프로그램을 실행하려면 글로벌 레이블 _start: 를 사용하여 운영 체제에 메모리에서 프로그램을 찾아 실행할 수 있는 위치를 알려준다. 그런 다음 액세스해야 할 주소를 결정하는 프로그램 로직에 따라 메모리에 순차적으로 액세스한다. 커널은 메모리에서 해당 주소로 점프하여 실행한다.

 

운영 체제가 실행을 시작해야 하는 위치와 실행을 중지해야 하는 위치를 정확히 알려주는 것이 중요하다. 1강에서는 커널에 실행을 중지할 위치를 알려주지 않았다.

 

따라서 sys_write를 호출한 후 프로그램은 메모리의 다음 주소를 순차적으로 계속 실행했는데, 그 주소는 무엇이든 될 수 있다. 커널이 무엇을 실행하려고 했는지는 알 수 없지만, 대신 ‘세그먼트 오류’라는 오류 메시지를 남기면서 프로세스가 중단되고 종료되었다. 모든 프로그램이 끝날 때 sys_exit를 호출하면 커널이 프로세스를 종료하고 메모리를 일반 풀로 반환할 시점을 정확히 알 수 있으므로 오류를 피할 수 있다.

 

Program Write

sys_exit는 간단한 함수 정의가 있다. Linux System Call Table에서 이 함수 OPCODE 1로 할당되고 EBX를 통해 단일 인수가 전달된다.

 

‘오류 0’을 의미하는 함수에 0을 전달하기 위해 EBX를 0으로 로드한다.

EAX를 1로 로드하여 sys_exit를 호출한다.

그런 다음 INT 80h를 사용하여 libc에 인터럽트를 요청한다.

그런 다음 컴파일, 링크 및 다시 실핸한다.

 

helloworld.asm

; Hello World Program - asmtutor.com
; Compile with nasm -f elf helloworld.asm
; Link with (64 bit systems require elf_i386 option) : ld -m elf_i386 helloworld.o -o helloworld
; Run with: ./helloworld

SECTION .data
msg     db    'Hello World', 0Ah

SECTION .text
	global  _start 

_start:
    mov    edx, 13
    mov    ecx, msg
    mov    ebx, 1
    mov    eax, 4
    int    80h
    
    mov    ebx, 0     ; return 0 status on exit - 'No Errors'
    mov    eax, 1     ; invoke SYS_EXIT (kernel opcode 1)
    int    80h   

 

Result

~$ nasm -f elf helloworld.asm
~$ ld -m elf_i386 helloworld.o -o helloworld
~$ ./helloworld
Hello World!

 

이 글은 https://asmtutor.com/#lesson2의 자료를 참고하여 작성되었습니다.

이 글은 상업적 목적이 아닌 개인이 공부한 내용을 정리하기 위한 글입니다. 

'Develop > Assembly' 카테고리의 다른 글

NULL terminating bytes  (0) 2024.07.04
External include files  (0) 2024.07.04
Subroutines  (0) 2024.07.04
Calculate string length  (0) 2024.07.04
Hello, world!  (0) 2024.07.04