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;
}
'Security > Reversing' 카테고리의 다른 글
[Dreamhack Reverse Engineering] STAGE 6 (0) | 2022.05.17 |
---|---|
[Dreamhack Reverse Engineering] STAGE 5 (0) | 2022.05.10 |
[어셈블리어 분석 실습] example 4 (0) | 2022.05.08 |
[어셈블리어 분석 실습] example 3 (0) | 2022.05.08 |
[어셈블리어 분석 실습] example 2 (0) | 2022.05.08 |
댓글