์ด์ ๋ธ๋ฆฌ ์ฝ๋ ๋ถ์ 5 - example 5 :: ๋ฐ๋ณต๋ฌธ
* ์ด ๊ฒ์๊ธ์ AT&T ๋ฌธ๋ฒ์ ๋ฐ๋ผ ์์ฑ๋์์ต๋๋ค.
(AT&T ์ Intel ์ฐจ์ด ์ฐธ๊ณ -
REVERSING ์์ํ๊ธฐ - ๊ธฐ์ด ๊ฐ๋ 4 :: ์ด์ ๋ธ๋ฆฌ ์ธ์ด
์ด์ ๋ธ๋ฆฌ ์ธ์ด : ์์ฐ์ด์ ๊ธฐ๊ณ์ด ์ฌ์ด๋ก, CPU ์ ๋ช ๋ น์ด๋ค์ ์์ด์ ์ฝ์์ธ ๊ธฐํธ๋ก ํ๊ธฐํ ๊ฒ์ด๋ค. ์ด ๊ธฐํธ๋ค์ CPU ์ ๋ช ๋ น์ด(๊ธฐ๊ณ์ด) ์ ์ผ๋์ผ ๋์ํ๋ค. ์ปดํจํฐ ๊ตฌ์กฐ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ๊ธฐ๊ณ์ด
iforint.tistory.com
.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
์ฒ์์ ๋นํฉํ์ง๋ง, ์ด๋ด ๋ฐ๋ณต๋ฌธ ์ด๋ผ๋ ๊ฒ์ ์์๋ค.
์กฐ๊ฑด๋ฌธ์ด ๋งค๊ฒจ์ง๋ ์์๋ ์ฝ๋๊ฐ ์งํ๋๋ ์์๋๋ก ๋งค๊ฒจ์ง๊ธฐ ๋๋ฌธ์, L3 ๊ฐ ๋จผ์ ์คํ๋์ง๋ง L2 ๊ฐ ๋จผ์ ์์ฑ๋์ด์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
JMP ๊ด๊ณ๋ฅผ ๋ณด์ํ๋
L2 ์ L3 ๊ฐ ํ๋์ ๋ฐ๋ณต๋ฌธ์, L4 ์ L5 ๊ฐ ํ๋์ ๋ฐ๋ณต๋ฌธ์ ๊ตฌ์ฑํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
jle : jump if less or equel, ์ฆ <=
#include <stdio.h>
int main() {
int a = 0, b;
while (a != 10) {
printf("number %d \n", a);
a++;
}
for (b = 0; b <= 4; b++) {
printf("%d * %d = %d \n", a, b, a * b);
}
return 0;
}
๋ ๋ฐ๋ณต๋ฌธ์ ๊ฐ๊ฐ while ๊ณผ for ๋ก ์์ฑํ์๋๋ฐ ์ด์ ๋ธ๋ฌ ์ฝ๋์์๋ ์ฐจ์ด๊ฐ ์์์ ์ ์ ์์๋ค.
๋ํ, L5 ์ ์ดํด๋ณด๋ฉด, "%d * %d = %d \n" ์ ์ถ๋ ฅํ๋ฏ๋ก printf ์ ํ์ํ ์ธ์๊ฐ 4๊ฐ์ด๋ค.
์ด๋ค์ ๋ค push ํ๊ณ printf ํจ์๋ฅผ ํธ์ถํ์ ๋ printf ํจ์๊ฐ ํ๋์ฉ pop ํด์์ ์ธ์๋ก ์ด๋ค๋ ์ฌ์ค์ ์ง์ํด๋ณผ ์ ์๋ค.
(์ฃผ์ด์ง ์์ ์ฝ๋์์ ๋งค printf ๊ฐ ๋๋ ํ์ eax ์ 0 ์ ์ ์ฅํ๋ ๊ฒ์ printf ํจ์์ ๋ฆฌํด๊ฐ์ธ๊ฐ?)
๊ทธ๋์ push ๋ eax (a*b ์ ์ฐ์ฐ ๊ฒฐ๊ณผ) , -12(%ebp) (=a) , -16(%ebp) , LC1 ์์๋๋ก ๋ค์ด๊ฐ๊ณ ,
printf๋ "%d * %d = %d \n", a, b, a * b ์ ์ธ์๋ก ํ์ฌ ์ถ๋ ฅํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ฐ๋ณต๋ฌธ์ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ถ๊ธฐ๊ฐ ๋ง์์ ํท๊ฐ๋ฆด ์ ์๋๋ฐ, ๋ถ๊ธฐ์ ๋ฒํธ๋ฅผ ์ ์ํด์ ๋ฐฐ์นํด๋ณด๋ฉด ๋ต์ ์ป์ ์ ์์ ๊ฒ์ด๋ค.
์ด๋ก์จ ์ผ๋จ๋ฝ์ด ๋๋ฌ๋๋ฐ,
https://operatingsystems.tistory.com/entry/SP-Procedure-Call?category=495589
์ฌ๊ธฐ์์ ํท๊ฐ๋ฆฐ ๊ฐ๋ ๋ค์ ์ก์์ผ๋ ๋ค์ ๋ณผ ๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ฉด ๋ค์ ๋ณด๋๋ก ํ์.