asm 분석하기 #1

어셈블리어

2019. 12. 9. 22:15

반응형
#include <stdio.h>

int main()
{
	printf("Hello World");
	return 0;
}


.LC0:
        .string "Hello World"
main:
        push    rbp
        mov     rbp, rsp
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        mov     eax, 0
        pop     rbp
        ret

string에 출력할 문자열인 "Hello World"가 저장되어있는 모습이다.

push rbp를 통해 공간을 만들고,

printf 함수를 호출하여 "Hello World"가 출력된다.

 

#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n);
    printf("%d",n);
}


.LC0:
        .string "%d"
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        lea     rax, [rbp-4]
        mov     rsi, rax
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    __isoc99_scanf
        mov     eax, DWORD PTR [rbp-4]
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        mov     eax, 0
        leave
        ret

이번엔 정수 a를 선언하고, 정수를 입력받고, 입력받은 정수를 출력하는 코드이다.

lea rax, [rbp-4]를 통해 정수(4바이트)크기만큼 공간을 확보해주는 모습이다.

그런 후 scanf함수를 호출하여 정수를 입력받아주고,

eax에 입력받은 정수가 있는 위치인 rbp-4의 주소값을 넣어준다.

그리고 eax를 printf 함수를 호출하여 출력시켜준다.

 

이런 모습은 정수가 아닌 문자값을 넣어줘도 크기만 다를 뿐 행동은 같다.

반응형