ImFe's study

어셈블리어로 Hello world 출력하고 디버깅해보기 본문

Reversing

어셈블리어로 Hello world 출력하고 디버깅해보기

ImFe 2020. 4. 11. 22:49

칼리리눅스 터미널창을 띄운 후

 

nano helloworld.s 를 입력해줍니다. s는 어셈블리 코드파일을 의미합니다.

입력한 후

section .data
		msg db "hello word"

section .text
		global_start
_start:
		mov rax, 1	//mov를 통해 rax에 1값을 넣어줍니다. 1은 systemwrite를 call하게 해줍니다.
        mov rdi, 1		//file discrupter에 1을 넣습니다. (=문자열을 출력하겠다)
        mov rsi, msg		//msg라는 포인터변수를 rsi에 넣음으로써 출력합니다
        mov rdx, 12		//문자열 길이를 지정합니다.
        syscall			//syscall하면서 hello world가 출력됩니다.
        mov rax, 60		//rax에60 값을 넣는건 system exit를 의미합니다.
        mov rdi, 0		//에러코드? 를 의미하는 줄인거같습니다. 0이니까 해당사항이 없겠네요
        syscall			//종료
        
        

(손 필기라 오타가 있을수 있습니다. + rax(8비트)=eax(4비트)입니다


다 입력후 컨트롤+x를 입력후 y를 입력해줍니다.

(cat helloword.s를 통해 제대로 입력되었는지 확인할수있습니다.)

 

nasm -f elf64 -o helloword.o helloword.s
               (목적코드로 먼저 변환)

ld -o helloword helloword.o

를 차례로 입력해줍시다

 

ls명령어를 이용하면 helloword 파일이 생성된것을 알 수 있습니다.
리눅스의 경우에는 초록색으로 표시된 파일이 실행할수있는 파일입니다.



rax에 값을 넣어주는 이유는? :
rax에 넣어주는 값에 따라 호출되는 함수가 달라지기 때문입니다.


이러한 행동을 시스템 호출이라하는데 시스템 호출은 크게 다섯가지의 주요 범주로 묶을 수 있습니다.

프로세스 제어, 파일 조작, 장치 관리, 정보 유지, 통신 이 있는데 값을 달리하여 다른 함수들을 불러옵니다.

참고: http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

 

Linux System Call Table for x86 64 · Ryan A. Chapman

Linux 4.7 (pulled from github.com/torvalds/linux on Jul 20 2016), x86_64 Note: 64-bit x86 uses syscall instead of interrupt 0x80. The result value will be in %rax To find the implementation of a system call, grep the kernel tree for SYSCALL_DEFINE.\?(sysca

blog.rchapman.org

또한 첨부된 링크 속 표를 보면 rax값에는 매개변수가 따라온다는걸 알 수 있습니다.

Comments