본문 바로가기
Security/Reversing

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

by 단월໒꒱ 2022. 5. 8.

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

 

 

# example4.asm
.file	"example4.c"
.section	.rodata
.LC0:
	.string	"result : %d\n"
	.text
	.globl	function
	.type	function, @function
function:
	.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	%edi, -4(%rbp)
	movl	%esi, -8(%rbp)
	movl	-4(%rbp), %eax
	imull	-8(%rbp), %eax
	movl	%eax, %esi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	function, .-function
	.globl	main
	.type	main, @function
main:
	.LFB1:
	.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	$50, -8(%rbp)
	movl	$60, -4(%rbp)
	movl	-4(%rbp), %edx
	movl	-8(%rbp), %eax
	movl	%edx, %esi
	movl	%eax, %edi
	call	function
	movl	$0, %eax
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE1:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
	.section	.note.GNU-stack,"",@progbits

 

 

먼저 function의 코드를 살펴보았다.

 

 

function:
	.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	%edi, -4(%rbp)   #rbp-4에 edi를 저장
	movl	%esi, -8(%rbp)   #rbp-8에 esi를 저장
	movl	-4(%rbp), %eax   #eax에 rbp-4에 저장된 값 저장
	imull	-8(%rbp), %eax   #eax에 rbp-8에 저장된 값 * eax 값 저장
	movl	%eax, %esi   #esi에 eax를 저장
	movl	$.LC0, %edi   #edi에 LC0 저장, 여기서 LC0은 "result : %d\n"
	movl	$0, %eax   #eax에 0 저장
	call	printf   #printf 함수 호출
	leave   #rbp를 꺼내 원래의 스택 프레임으로 돌아감
	.cfi_def_cfa 7, 8
	ret   #return address 주소로 리턴
	.cfi_endproc

 

 

그 다음으로 main 함수를 살펴보았다.

 

 

main:
	.LFB1:
	.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	$50, -8(%rbp)   #rbp-8에 50 저장
	movl	$60, -4(%rbp)   #rbp-4에 60 저장
	movl	-4(%rbp), %edx   #edx에 rbp-4에 저장된 값 저장
	movl	-8(%rbp), %eax   #eax에 rbp-8에 저장된 값 저장
	movl	%edx, %esi   #esi에 edx 저장
	movl	%eax, %edi   #edi에 eax 저장
	call	function   #function 함수 호출
	movl	$0, %eax   #eax에 0 저장
	leave   #rbp를 꺼내 원래의 스택 프레임으로 돌아감
	.cfi_def_cfa 7, 8
	ret   #return address 주소로 리턴
	.cfi_endproc

 

 

위의 내용을 바탕으로 C언어로 바꿔주면 아래와 같다.

 

 

#include <stdio.h>

int function(int a, int b) {
    printf("result : %d\n", a * b);
    return 0;
}

int main() {
    int a, b;
    
    a = 50;
    b = 60;
    
    function(a, b);
    
    return 0;
}

 

 

 

 

댓글