* ๊ธฐ๋ณธ ํ•ด์„

 

.file "example1.c"

 : ๋””๋ฒ„๊ฑฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์›๋ณธ ํŒŒ์ผ ์ด๋ฆ„์„ ๊ฐ€๋ฆฌํ‚ด

 

โ–ก Intel ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ์™ผ์ชฝ์œผ๋กœ ๋„ฃ๋Š”๋‹ค !!

.section .rodata

 : ./rodata ์„น์…˜ ์ •์˜, ์ด ์„น์…˜์€ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ ๋ณ€์ˆ˜

.text

 : text section → ์ฝ”๋“œ๋“ค์„ ์ •ํ•œ ์„น์…˜ / ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ

.global main

 : ์ „์ฒด ์ฝ”๋“œ์— ๊ฑธ์ณ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜

.type main, @function

: main ํ•จ์ˆ˜ ์ •์˜ → ์ด๊ฑธ ํ•ด์•ผ๋งŒ global main ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค

.LBF0

 : ํ•จ์ˆ˜์˜ ์‹œ์ž‘์„ ์˜๋ฏธํ•˜๋Š” 'local label'

.cfi_startproc

: 'call from information'

์–ด์…ˆ๋ธ”๋Ÿฌ์—๊ฒŒ dwarf format ๋””๋ฒ„๊น… information์„ ์ง€์‹œ

.cfi_endproc

: ํ•จ์ˆ˜ ๋

.size main, .-main

: size ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ๋ฉ”์ธ ํ•จ์ˆ˜์˜ ํฌ๊ธฐ๋ฅผ ์„ธํŒ…ํ•จ

* .-main ์€ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์— ์“ฐ์—ฌ์งˆ mainํ•จ์ˆ˜์˜ ์ •ํ™•ํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4"

 : indent ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ์–ด๋–ค ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜์˜€๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด ๋ฌธ์ž์—ด "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4"์„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ instruction

(ex) Hello World ํ”„๋กœ๊ทธ๋žจ : ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ)

 

 


# example1.asm

# example1.asm
.file	"example1.c"
.section	.rodata
.LC0:
	.string	"Hello world"
	.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
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	movl	$0, %eax
	popq	%rbp
	.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:
	pushq	%rbp
	movq	%rsp, %rbp
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	movl	$0, %eax
	popq	%rbp
	ret

push1 %rbp → rbp ์Šคํƒ์— ์ƒˆ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์ €์žฅํ•˜๊ณ , rsp์˜ ๊ฐ’์„ 8 ์ค„์ธ๋‹ค.

movq %rsp, %rbp → rbp์˜ ๊ฐ’์„ rsp์— ๋„ฃ๋Š”๋‹ค.

movl $.LC0. %edi → printf์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ LC0์— ์ €์žฅ๋œ ๋ฌธ์ž๋ฅผ ์ €์žฅ

movl $0, %eax → eax์— 0์ €์žฅ

call printf → printf ํ•จ์ˆ˜ ํ˜ธ์ถœ

movl $0, %eax → eax์— 0์ €์žฅ

popq %rbp → rbp ๊บผ๋ƒ„

ret → return address ์ฃผ์†Œ๋กœ ๋ฆฌํ„ด

 

 

์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•œ C์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#include <stdio.h>

int main() {
	printf("Hello World");
	return 0;
}

 

 

๋””์Šค์–ด์…ˆ๋ธ” ์ฝ”๋“œ์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ์™ผ์ชฝ์œผ๋กœ ๋„ฃ๋Š”๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๋””์Šค์–ด์…ˆ๋ธ” ์ฝ”๋“œ๋ผ๋Š” ๊ฑธ ๊ณ ๋ คํ•˜๋ฉด ์•ž์—์„œ ๋ดค๋˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

*objdump -d๋ฅผ ์จ์„œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์œผ๋‚˜ ์ž๊พธ ์˜ค๋ฅ˜๊ฐ€ ๋–ด๋‹ค...

 

 

 


 

# 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:
	pushq	%rbp
	movq	%rsp, %rbp
	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
	ret
  • push1 %rbp → ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ
  • movq %rsp, %rbp → rsp์˜ ๊ฐ’์„ rbp์— ๋„ฃ๋Š”๋‹ค
  • subq $16, %rsp → ์Šคํƒ ํฌ์ธํ„ฐ rsp๋ฅผ 0x10(16byte)๋งŒํผ ๊ณต๊ฐ„ ํ™•๋ณด
  • movl $10, -12(%rbp)10์„ rbp ๋ ˆ์ง€์Šคํ„ฐ์˜ -12๋งŒํผ์˜ ์ฃผ์†Œ(offset)์— ์ €์žฅ  
    •  12byte ๋งŒํผ์˜ ์ž„์‹œ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด์„œ ์ˆซ์ž 10์„ ์Šคํƒ์— ๋„ฃ๋Š” ๊ฒƒ! (๋‹ค์Œ ์—ฐ์‚ฐ ์ค€๋น„)
  • movl $20, -8(%rbp) 20์„ rbp ๋ ˆ์ง€์Šคํ„ฐ์˜ rbp-0x8์— ์ €์žฅ
  • movl -8(%rbp), %eax → eax๋ ˆ์ง€์Šคํ„ฐ์— 20 ์ €์žฅ 
    •  rbp๋กœ๋ถ€ํ„ฐ 8byte ์•„๋ž˜์˜ ๊ณต๊ฐ„์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’(์—ฌ๊ธฐ์„  20)์„ eax ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ
  • movl -12(%rbp), %ed rbp๋กœ๋ถ€ํ„ฐ 12byte ์•„๋ž˜์˜ ๊ณต๊ฐ„์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’(10)์„ edx์— ์ €์žฅ
  • addl %edx, %eax → edx ๋ ˆ์ง€์Šคํ„ฐ์— ์žˆ๋Š” ๊ฐ’(10)๊ณผ eax ๋ ˆ์ง€์Šคํ„ฐ์— ์žˆ๋Š” ๊ฐ’(20) ๋”ํ•ด์„œ eax์— ์ €์žฅ
  • movl %eax, -4(%rbp)eax(30)๋ฅผ rbp-0x4์— ์ €์žฅ
  • movl -8(%rbp), %eax → eax๋ ˆ์ง€์Šคํ„ฐ์— 20 ์ €์žฅ
  • movl -12(%rbp), %edx → edx์— 10์ €์žฅ
  • addl %edx, %eax  → 10 + 20(30)์„ eax์— ์ €์žฅ
  • movl %eax, %esi → esi์— 30 ์ €์žฅ
  • movl $.LC0, %edi → printf์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž ๊ฐ’์„ LC0์ฃผ์†Œ์˜ ์ŠคํŠธ๋ง์œผ๋กœ ๊ฐ€์ ธ์™€์„œ edi์— ์ €์žฅ
  • movl $0, %eax → eax๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • call printf → printf ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • movl $0, %eax → eax(๋ฆฌํ„ด๊ฐ’)๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • leave → ํ•จ์ˆ˜ ์—ํ•„๋กœ๊ทธ
  • ret  return address ์ฃผ์†Œ๋กœ ๋ฆฌํ„ด

 

์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•œ c์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#include <stdio.h>

int main(){
	int a, b, c;
	a = 10;
	b = 20;
	c = a + b;
    
	printf("%d\n", a + b);
	return 0;
}

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋””์Šค์–ด์…ˆ๋ธ”ํ•˜๋‹ˆ ์–ด์…ˆ๋ธ”ํ•œ ์ฝ”๋“œ์™€ ๋ฐ˜๋Œ€๋กœ ๋งž์•„๋–จ์–ด์กŒ๋‹ค.

 

 

 


 

 

# example3

# example3.asm
.file	"example3.c"
.section	.rodata
.LC0:
	.string	"a is 10"
.LC1:
	.string	"b is 10"
.LC2:
	.string	"b is 20"
.LC3:
	.string	"a=b"
.LC4:
	.string	"a!=b"
.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, -8(%rbp)
	movl	$20, -4(%rbp)
	cmpl	$10, -8(%rbp)
	jne	.L2
	movl	$.LC0, %edi
	call	puts
	.L2:
	cmpl	$10, -4(%rbp)
	jne	.L3
	movl	$.LC1, %edi
	call	puts
	jmp	.L4
	.L3:
	cmpl	$20, -4(%rbp)
	jne	.L4
	movl	$.LC2, %edi
	call	puts
	.L4:
	movl	-8(%rbp), %eax
	cmpl	-4(%rbp), %eax
	jne	.L5
	movl	$.LC3, %edi
	call	puts
	jmp	.L6
	.L5:
	movl	$.LC4, %edi
	call	puts
	.L6:
	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 ์ด์ „์„ ๋จผ์ € ์‚ดํŽด๋ณด์ž.

.LC0:
	.string	"a is 10"
.LC1:
	.string	"b is 10"
.LC2:
	.string	"b is 20"
.LC3:
	.string	"a=b"
.LC4:
	.string	"a!=b"

๋‹ค์Œ๊ณผ ๊ฐ™์ด LC0, LC1, LC2, LC3, LC4์— ๊ฐ๊ฐ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•ด์ฃผ์—ˆ๋‹ค.

 

 

์ด์ œ mainํ•จ์ˆ˜์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

main:
	pushq	%rbp
	movq	%rsp, %rbp
	subq	$16, %rsp
	movl	$10, -8(%rbp)
	movl	$20, -4(%rbp)
	cmpl	$10, -8(%rbp)
	jne	.L2
	movl	$.LC0, %edi
	call	puts
	.L2:
	cmpl	$10, -4(%rbp)
	jne	.L3
	movl	$.LC1, %edi
	call	puts
	jmp	.L4
	.L3:
	cmpl	$20, -4(%rbp)
	jne	.L4
	movl	$.LC2, %edi
	call	puts
	.L4:
	movl	-8(%rbp), %eax
	cmpl	-4(%rbp), %eax
	jne	.L5
	movl	$.LC3, %edi
	call	puts
	jmp	.L6
	.L5:
	movl	$.LC4, %edi
	call	puts
	.L6:
	movl	$0, %eax
	leave
	ret
  • pushq %rbp → ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ
  • movq %rsp, %rbp → rsp์— rbp๊ฐ’์„ ๋„ฃ๋Š”๋‹ค
  • subq $16, %rsp → rsp๋ฅผ 0x10(16byte)์œผ๋กœ ์Šคํƒ ๊ณต๊ฐ„ ํ™•๋ณด
  • movl $10, -8(%rbp) → rbp-0x8์— 10์ €์žฅ
  • movl $20, -4(%rbp) →rbp-0x4์— 20์ €์žฅ
  • cmpl $10, -8(%rbp) → rbp-0x8๊ฐ’ (10)๊ณผ 10๋น„๊ต  (a == 10?)
    • jne .L2 → ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด L2๋กœ ์ ํ”„
  • movl $.LC0, %edi  ๊ฐ™๋‹ค๋ฉด "a is 10"์„ ์ธ์ž๋กœ ๊ฐ€์ ธ์˜ด
  • call puts   puts ํ•จ์ˆ˜ ํ˜ธ์ถœ

.L2:

  • cmpl $10, -4(%rbp) → rbp-0x4์˜ ๊ฐ’(20)๊ณผ 10 ๋น„๊ต  (b == 10?)
    • jne .L3 → ๋น„๊ตํ•ด์„œ ๊ฐ™์ง€ ์•Š์œผ๋ฉด L3์œผ๋กœ ์ ํ”„
  • movl $.LC1, %edi → ๋งž๋‹ค๋ฉด "b is 10"์„ ์ธ์ž๋กœ ๊ฐ€์ ธ์˜ด
  • call puts → puts ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • jmp .L4 → L4๋กœ ์ ํ”„

.L3:

  • cmpl   $20, -4(%rbp) → rbp-0x4์˜ ๊ฐ’(20)๊ณผ 20 ๋น„๊ต   (b == 20?)
    •  jne .L4 → ๋น„๊ตํ•ด์„œ ๊ฐ™์ง€ ์•Š์œผ๋ฉด L4๋กœ ์ ํ”„
  • movl $.LC2,%edi → ๋งž๋‹ค๋ฉด "b is 20"์„ ์ธ์ž๋กœ ๊ฐ€์ ธ์˜ด
  • call puts → puts ํ•จ์ˆ˜ ํ˜ธ์ถœ

.L4:    

  •  movl -8(%rbp), %eax  eax์˜ ๊ฐ’ rbp-0x8์— ์ €์žฅ    (c = a)
  • cmpl -4(%rbp), %eax  eax์˜ ๊ฐ’๊ณผ rbp-0x4์˜ ๊ฐ’(20)์„ ๋น„๊ต   (c == b?)
    • jne .L5  ๋น„๊ตํ•ด์„œ ๋‹ค๋ฅด๋‹ค๋ฉด L5๋กœ ์ ํ”„
  • movl $.LC3, %edi  ๋งž๋‹ค๋ฉด "a=b"์„ ์ธ์ž๋กœ ๊ฐ€์ ธ์˜ด
  • call puts  puts ํ•จ์ˆ˜ ํ˜ธ์ถœ

.L5:       

  • movl $.LC4, %edi → "a!=b"๋ฅผ ์ธ์ž๋กœ ๊ฐ€์ ธ์˜ด
  • call puts → puts ํ•จ์ˆ˜ ํ˜ธ์ถœ

.L6:       

  • movl   $0, %eax → eax๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • leave → ํ•จ์ˆ˜ ์—ํ•„๋กœ๊ทธ
  • ret → return address ์ฃผ์†Œ ๋ฐ˜ํ™˜

 

 

์ž‘์„ฑํ•ด์ค€ C ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#include <stdio.h> 
int main(){ 
	int a = 10; 
	int b = 20; 
	
	if (a == 10)
		puts("a is 10"); 
	if (b == 10) 
		puts("b is 10"); 
	else if (b == 20) 
		puts("b is 20"); 
	if (a == b) 
		puts("a=b"); 
	else 
		puts("a!=b"); 
	return 0; 
}

 

 

 

 

 

 

 

์ด๋ฅผ ๋‹ค์‹œ ๋””์Šค์–ด์…ˆ๋ธ” ํ•ด๋ณธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

disassemble main

 

 

 


 

 

 

 

# 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

์ „์ฒด ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™๊ณ ,

 

์ด ์ค‘์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด

.LC0:
	.string	"result : %d\n"

.LC0: ๋Š” "result : %d\n"์ด๋ผ๋Š” ์ŠคํŠธ๋ง์œผ๋กœ ์ •์˜๊ฐ€ ๋˜์–ด์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ด๋ฒˆ์—๋Š” main ํ•จ์ˆ˜ ๋ง๊ณ ๋„ ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜ function์ด ๋“ฑ์žฅํ•œ๋‹ค.

function:
	pushq	%rbp
	movq	%rsp, %rbp
	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
	ret
  • pushq %rbp → ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ
  • movq %rsp, %rbp → rsp์— rbp์˜ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค
  • subq $16, %rsp → rsp๋ฅผ 0x10(16byte)์œผ๋กœ ์Šคํƒ ํ™•๋ณด
  • movl %edi, -4(%rbp) → rbp-0x4์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ ธ์˜จ edi์ €์žฅ
  • movl %esi, -8(%rbp) → rbp-0x8์— ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ ธ์˜จ esi ์ €์žฅ
  • movl -4(%rbp), %eax → eax์— rbp-0x4์ €์žฅ 
  • imull -8(%rbp), %eax → eax์™€ rbp-0x8 ๊ฐ’ ๊ณฑํ•ด์„œ eax์— ์ €์žฅ
  • movl %eax, %esi → esi์— ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ eax๋ฅผ ๋„ฃ์Œ
  • movl $.LC0, %edi → ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ "result : %d\n" ๊ฐ€์ ธ์˜ด
  • movl $0, %eax → eax 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • call printf → printf ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • leave → ํ•จ์ˆ˜ ์—ํ•„๋กœ๊ทธ
  • ret → return address ์ฃผ์†Œ ๋ฐ˜ํ™˜
int function(int a, int b) {
	printf("result : %d\n", a*b);
	return 0;
}

function ํ•จ์ˆ˜๋ฅผ C์–ธ์–ด๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์œ„์™€ ๊ฐ™๋‹ค.

 

disassemble function

 

 

 

 

์ด์ œ mainํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด์ž.

main:
	pushq	%rbp
	movq	%rsp, %rbp
	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
	ret
  • pushq %rbp → ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ
  • movq %rsp, %rbp → rsp์— rbp๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
  • subq $16, %rsp → rsp๋ฅผ 0x10(16byte)์œผ๋กœ ๊ณต๊ฐ„ ํ™•๋ณด
  • movl $50, -8(%rbp) → rbp-0x8์— 50 ์ €์žฅ 
  • movl $60, -4(%rbp) → rbp-0x4์— 60 ์ €์žฅ
  • movl -4(%rbp), %edx → ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ edx์— rbp-0x4์˜ ๊ฐ’(60) ์ €์žฅ
  • movl -8(%rbp), %eax → ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ eax์— rbp-0x8์˜ ๊ฐ’(50) ์ €์žฅ
  • movl %edx, %esi → esi ๋ ˆ์ง€์Šคํ„ฐ์— edx(function์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž) ์ €์žฅ
  • movl %eax, %edi → edi ๋ ˆ์ง€์Šคํ„ฐ์— eax(function์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž) ์ €์žฅ
  • call function → function (ํ•จ์ˆ˜)ํ˜ธ์ถœ
  • movl $0, %eax → eax๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • leave → ํ•จ์ˆ˜ ์—ํ•„๋กœ๊ทธ
  • ret → ret address ์ฃผ์†Œ ๋ฐ˜ํ™˜

 

mainํ•จ์ˆ˜์™€ function ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ C์–ธ์–ด ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#include <stdio.h>

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

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

disassemble main

 

 

 


 

 

 

# 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

 

 

.LC0:
	.string	"number %d \n"
.LC1:
	.string	"%d * %d = %d \n"

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด .LC0๊ณผ .LC1์„ ๊ฐ๊ฐ์˜ ๋ฌธ์ž์—ด๋กœ ์ •์˜ํ•œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

main ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

main:
	pushq	%rbp
	movq	%rsp, %rbp
	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
	ret
  • pushq %rbp → ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ
  • movq %rsp, %rbp → rsp์— rbp๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
  • subq $16, %rsp → rsp๋ฅผ 0x10(16byte)๋งŒํผ ์Šคํƒ ๊ณต๊ฐ„ ํ™•๋ณด
  • movl $0, -8(%rbp) → rbp-0x8์— 0 ์ €์žฅ
  • jmp .L2 → L2๋กœ ์ ํ”„

.L3:

  • movl -8(%rbp), %eax → eax ๋ ˆ์ง€์Šคํ„ฐ์— rbp-0x8 ์ €์žฅ 
  • movl %eax, %esi → esi ๋ ˆ์ง€์Šคํ„ฐ์— eax ๊ฐ’(rbp-0x8) ์ €์žฅ 
  • movl $.LC0, %edi → edi ๋ ˆ์ง€์Šคํ„ฐ์— LC0 ๋ฌธ์ž์—ด ์ €์žฅ
  • movl $0, %eax → eax ๋ ˆ์ง€์Šคํ„ฐ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • call printf → printf ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • addl $1, -8(%rbp) → rbp-0x8์— 1 ๋”ํ•จ (i++)

.L2:

  • cmpl $9, -8(%rbp) → rbp-0x8์˜ ๊ฐ’๊ณผ 9 ๋น„๊ต
    • jle .L3 → ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด L3์œผ๋กœ ์ด๋™
    • movl $0, -4(%rbp) → ํฌ๋ฉด rbp-0x4์— ์ €์žฅ
  • jmp .L4 → L4๋กœ ์ด๋™ (๋ฃจํ”„์—์„œ ๋‚˜์˜ค๋ฉด)

.L5: 

  • movl -8(%rbp), %eax → eax ๋ ˆ์ง€์Šคํ„ฐ์— rbp-0x8 ๊ฐ’ ์ €์žฅ
  • imull -4(%rbp), %eax → eax = eax * [rbp-0x4]
  • movl %eax, %ecx → ecx์— eax ๊ฐ’ ์ €์žฅ
  • movl -4(%rbp), %edx → edx์— rbp-0x4๊ฐ’ ์ €์žฅ
  • movl -8(%rbp), %eax → eax์— rbp-0x8๊ฐ’ ์ €์žฅ
  • movl %eax, %esi → ๋‘ ๋ฒˆ์งธ ์ธ์ž eax๋กœ ์ด๋™
  • movl $.LC1, %edi → ์ฒซ ๋ฒˆ์งธ ์ธ์ž LC1 ๋ฌธ์ž์—ด๋กœ ์ด๋™
  • movl $0, %eax → eax 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • call printf → printf ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • addl $1, -4(%rbp) → rbp-0x4 ๊ฐ’์— 1 ์ฆ๊ฐ€

.L4:

  • cmpl $4, -4(%rbp) → rbp-0x4๊ฐ’๊ณผ 4 ๋น„๊ต
    • jle .L5 → 4๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์œผ๋ฉด L5๋กœ ์ด๋™
  • movl $0, %eax → eax 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • leave → ํ•จ์ˆ˜ ์—ํ•„๋กœ๊ทธ
  • ret → return address ๋ฐ˜ํ™˜

 

C์–ธ์–ด๋กœ ๋ฐ”๊ฟ”์ค€ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#include <stdio.h>

int main() {
	int a = 0, b;
	
	for (int i = 0; i < 10; i++) {
		printf("number %d \n", a);
		a++;
	}
	for (int j = 0; j < 5; j++) {
		b = j;
		printf("%d * %d = %d \n", a, b, a*b);
	}
	return 0;
}

'DreamHack > Reversing' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Reversing.Kr] Easy Keygen  (0) 2022.07.03
๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!