IT

Assembly x86-64 연습

끊임없는정진 2023. 3. 27. 23:38

▶ "Hello world!" 출력

우선 data 영역에 "Hello World!" 메시지를 저장시키고, text 영역에 코드를 저장시킨다. 그리고 코드를 작성하는데

우선, move rax, 1로 syscall 로 write를 불러오게끔 만든다. 다음에는 mov rdi, 1로 파일 디스크립터를 1로 설정시켜주어, 출력모드로 만들어주고, mov rsi, msg로 메시지를 위치시켜준다. mov rdx, 13으로 "Hello World!"메시지가 총 13글자임을 명시시켜주고, syscall을 입력해주면 호출이 된다. 다음으로 mov rax, 60 mov rdi, 0로 exit시켜준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
section .data
    msg db "Hello World!"
 
section .text
    global_start
 
_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, 13
    syscall
 
    mov rax, 60
    mov rdi, 0
    syscall
cs

 

▶ echo 프로그램 만들기

우선, linux syscall table을 보면, 0번이 read가 된다. 따라서, rax에 0을 할당해야 되는데, mov rax, 0 도 되지만, xor rax, rax를 하면 같은 수를 xor하게 되므로 0이 된다. 다음으로는 rbx, rcx, rdx 에 모두 0으로 초기화된 rax값을 할당해서 0으로 초기화 시켜준다. 다음으로 sub rsp, 64 로 rsp를 64만큼 빼서 내가 입력하는 문자를 저장할 공간을 확보해준다. 다음으로 mov rdi, 0으로 설정하여 fd(파일 디스크럽터)가 0이 되게 설정해준다. 표준 입력을 받게 해주기 위해서이다. 다음으로 rsi에 rsp값을 할당하여 문자열의 포인터 위치를 설정해준다. 그리고 mov rdx, 63으로 문자길이를 63으로 설정해준다.

이제는 메모리에 저장된 문자열을 출력하는 함수를 만들어주는데, 우선 mov rax, 1로 write syscall로 설정해준다. 그리고 mov rdi, 1로 설정해서 fd가 1이 되게끔 설정해준다(표준 출력). 그리고 mov rsi, rsp를 설정하여 저장한 위치를 rsi에 할당하고, mov rdx, 63으로 63만큼 불러온다는 것을 설정해준다.

마지막은 위와 같이 mov rax, 60으로 exit를 syscall로 불러와주면 끝이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
section .text
    global _start
 
_start:
    xor rax, rax
    mov rbx, rax
    mov rcx, rax
    mov rdx, rax
 
    sub rsp, 64
    mov rdi, 0
    mov rsi, rsp
    mov rdx, 63
 
    syscall
 
    mov rax, 1
    mov rdi, 1
    mov rsi, rsp
    mov rdx, 63
    
    syscall
 
    mov rax, 60
 
    syscall
cs

 

▶ 반복문 사용

반복해서 출력할 문자를 data에 저장한 후, r10 레지스터를 counter로 사용하여 100회 문자출력을 수행한다. 위에서 Hello World! 를 출력하는 예제와 출력까지는 비슷하나, 반복문 부분에서 차이점이 발생한다. 

again에서 cmp r10, 100 이후 je done을 설정하여 조건을 걸어 놓는다. 카운터가 100이 되면 done으로 넘어가겠다는 뜻이다. 다음은 syscall로 출력을 시킨 후, 다시 rax에 1을 할당하는 mov rax, 1을 넣은 후, inc r10으로 카운터를 하나 늘여준다. 다시 again 처음으로 돌아가게 jmp again을 설정해준다.

done의 경우 위 예제와 같이 exit syscall을 만들어 주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
section .data
    msg db "A"
 
section .text
    global _start
 
_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, 1
    mov r10, 1
 
again:
    cmp r10, 100
    je done
    syscall
    mov rax, 1
    inc r10
    jmp again
 
done:
    mov rax, 60
    mov rdi, 0
    syscall
cs