본문 바로가기
Security/Reversing

[어셈블리어 분석 실습] example 5

by 단월໒꒱ 2022. 5. 8.

example5.asm의 코드는 아래와 같다.

 

 

# example5.asm 
.file	"example5.c"
.section	.rodata
.LC0:
	.string	"number %d \n"
.LC1:
	.string	"%d * %d = %d \n"
	.text
	.globl	main
	.type	main, @function
main:
	.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	movl	$0, -8(%rbp)
	jmp	.L2
	.L3:
	movl	-8(%rbp), %eax
	movl	%eax, %esi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	addl	$1, -8(%rbp)
	.L2:
	cmpl	$9, -8(%rbp)
	jle	.L3
	movl	$0, -4(%rbp)
	jmp	.L4
	.L5:
	movl	-8(%rbp), %eax
	imull	-4(%rbp), %eax
	movl	%eax, %ecx
	movl	-4(%rbp), %edx
	movl	-8(%rbp), %eax
	movl	%eax, %esi
	movl	$.LC1, %edi
	movl	$0, %eax
	call	printf
	addl	$1, -4(%rbp)
	.L4:
	cmpl	$4, -4(%rbp)
	jle	.L5
	movl	$0, %eax
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
	.section	.note.GNU-stack,"",@progbits

 

 

먼저 main 함수를 살펴보았다.

 

 

main:
	.LFB0:
	.cfi_startproc
	pushq	%rbp   #rbp를 스택에 push
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp   #rbp를 rsp로 옮겨줌, rbp = rsp
	.cfi_def_cfa_register 6
	subq	$16, %rsp   #rsp-16으로 스택 공간 확보
	movl	$0, -8(%rbp)   #rbp-8에 0 저장
	jmp	.L2   #L2로 점프
	.L3:
	movl	-8(%rbp), %eax   #eax에 rbp-8에 저장된 값 저장
	movl	%eax, %esi   #esi에 eax 저장
	movl	$.LC0, %edi   #edi에 LC0 저장, 여기서 LC0은 "number %d \n"
	movl	$0, %eax   #eax에 0 저장
	call	printf   #printf 함수 호출
	addl	$1, -8(%rbp)   #rbp-8에 1 더해줌
	.L2:
	cmpl	$9, -8(%rbp)   #rbp-8에 저장된 값과 9를 비교
	jle	.L3   #작거나 같으면 L3으로 점프
	movl	$0, -4(%rbp)   #rbp-4에 0 저장
	jmp	.L4   #L4로 점프
	.L5:
	movl	-8(%rbp), %eax   #eax에 rbp-8에 저장된 값 저장
	imull	-4(%rbp), %eax   #eax에 rbp-4에 저장된 값 * eax 값 저장
	movl	%eax, %ecx   #ecx에 eax를 저장
	movl	-4(%rbp), %edx   #edx에 rbp-4에 저장된 값 저장
	movl	-8(%rbp), %eax   #eax에 rbp-8에 저장된 값 저장
	movl	%eax, %esi   #esi에 eax 저장
	movl	$.LC1, %edi   #edi에 LC1 저장, 여기서 LC1은 "%d * %d = %d \n"
	movl	$0, %eax   #eax에 0 저장
	call	printf   #printf 함수 호출
	addl	$1, -4(%rbp)   #rbp-4에 1 더해줌
	.L4:
	cmpl	$4, -4(%rbp)   #rbp-4에 저장된 값과 4를 비교
	jle	.L5   #작거나 같으면 L5로 점프
	movl	$0, %eax   #eax에 0 저장
	leave   #rbp를 꺼내 원래의 스택 프레임으로 돌아감
	.cfi_def_cfa 7, 8
	ret   #return address 주소로 리턴
	.cfi_endproc

 

 

위의 내용을 바탕으로 C언어 코드를 작성하면 아래와 같다.

 

 

#include <stdio.h>

int main(){
    int a = 0; 
    
    for(int i = 0; i <= 9; i++){ 
        a = i;
        printf("numebr %d \n", a);
    }

    for(int j = 0; j <= 4; j++) 
    {
        int b = j;

        printf("%d * %d = %d \n", a, b, a * b);
    }

    return 0;
}

 

 

 

 

댓글