SECURITY/REVERSING

์–ด์…ˆ๋ธ”๋ฆฌ์–ด ๋ถ„์„ 2 - example 2

\b\t 2020. 7. 14. 18:53

* ์ด ๊ฒŒ์‹œ๊ธ€์€ AT&T ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

(AT&T ์™€ Intel ์ฐจ์ด ์ฐธ๊ณ -

2020.07.08 - [SECURITY/REVERSING] - REVERSING ์‹œ์ž‘ํ•˜๊ธฐ - ๊ธฐ์ดˆ ๊ฐœ๋… 4 :: ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด )

.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

 

 

subq $16, %rsp : ์Šคํƒ ํฌ์ธํ„ฐ rsp ๋ฅผ 16 ๋งŒํผ ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ.

์Šคํƒ ๊ณต๊ฐ„์„ 16 byte ๋งŒํผ ํ™•๋ณดํ•˜๊ฒŒ ๋œ๋‹ค.

Allocate 16 bytes for stack frame

 


movl $10, -12(%rbp) : 10์„ rbp ๋ ˆ์ง€์Šคํ„ฐ์˜ -12 ๋งŒํผ์˜ ์ฃผ์†Œ์— ์ €์žฅ

(offset -12 in the stack to edx)

 

: ์ˆซ์ž 10 ์„ rbp ๋กœ๋ถ€ํ„ฐ 12 byte ๊ณต๊ฐ„์„ ํ• ๋‹นํ•œ ํ›„, ๊ทธ ์ž๋ฆฌ์— ๋„ฃ์„ ๊ฒƒ

์ฆ‰, 12 byte ๋งŒํผ์˜ ์ž„์‹œ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜์—ฌ ์ˆซ์ž 10์„ ์Šคํƒ์— ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.

- ๋‹ค์Œ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ์ค€๋น„ ์ž‘์—…

 


movl $20, -8(%rbp) : 20์„ rbp ๋ ˆ์ง€์Šคํ„ฐ์˜ -8 ๋งŒํผ์˜ ์ฃผ์†Œ์— ์ €์žฅ


movl -8(%rbp), %eax : eax ๋ ˆ์ง€์Šคํ„ฐ์— 20 ์ €์žฅ

rbp ๋กœ๋ถ€ํ„ฐ 8 byte ์•„๋ž˜์˜ ๊ณต๊ฐ„์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ eax ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ

 

movl -12(%rbp), %edx : edx ๋ ˆ์ง€์Šคํ„ฐ์— (-12(%rbp) ์— ์žˆ๋Š”) 10 ์ €์žฅ


addl %edx, %eax : 10 + 20


movl %eax, -4(%rbp) : eax (30) ์„ -4(%rbp) ์— ์ €์žฅ

 


movl -8(%rbp), %eax : 20 ์„ eax ์— ์ €์žฅ


movl -12(%rbp), %edx : edx ์— 10 ์ €์žฅ


addl %edx, %eax : 10 + 20

 

movl %eax, %esi : esi ์— eax ๊ฐ’ (30) ์ €์žฅ

 

 

c์–ธ์–ด๋กœ ํ•ด์„ํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#include <stdio.h>

int main(void){
    int a = 10;
    int b = 20;
    int c = a + b;
    
    printf("result : %d \n", a + b);
    
    return 0;
}    
๋Œ“๊ธ€์ˆ˜0