본문 바로가기
Security/Reversing

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

by 단월໒꒱ 2022. 5. 8.

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

 

 

# example2.asm
.file	"example2.c"
.section	.rodata
.LC0:
	.string	"result : %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	$10, -12(%rbp)
	movl	$20, -8(%rbp)
	movl	-8(%rbp), %eax
	movl	-12(%rbp), %edx
	addl	%edx, %eax
	movl	%eax, -4(%rbp)
	movl	-8(%rbp), %eax
	movl	-12(%rbp), %edx
	addl	%edx, %eax  
	movl	%eax, %esi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	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	$10, -12(%rbp)   #rbp-12에 10 저장
	movl	$20, -8(%rbp)   #rbp-8에 20 저장
	movl	-8(%rbp), %eax   #eax에 rbp-8에 있는 값 저장 (20)
	movl	-12(%rbp), %edx   #edx에 rbp-12에 있는 값 저장 (10)
	addl	%edx, %eax   # eax에 eax+edx 값 저장 (30)
	movl	%eax, -4(%rbp)   #rbp-4에 eax에 있는 값 저장 (30)
	movl	-8(%rbp), %eax   #eax에 rbp-8에 있는 값 저장 (20)
	movl	-12(%rbp), %edx   #edx에 rbp-12에 있는 값 저장 (10)
	addl	%edx, %eax   #eax에 eax+edx 값 저장 (30)
	movl	%eax, %esi   #esi에 eax 값 저장 (30)
	movl	$.LC0, %edi   #LC0을 edi에 저장, 여기서 LC0은 "result : %d \n"
	movl	$0, %eax   #eax에 0 저장
	call	printf   #printf 함수 호출
	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, b, c;
    
    a = 10;
    b = 20;
    c = a + b;
 
    printf("result : %d \n", a + b);
    
    return 0;
}

 

 

 

댓글