์ค๋๋ ๋๋น๋๋์ ๊ฐ์๋ก ๊ณต๋ถ๋ฅผ ํด๋ณด์.
$ nano sum.c
๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ ์ง๊ธฐ ์ํด nano๋ฅผ ์คํํ๋ค.
sum์ด๋ผ๋ ์ด๋ฆ์ C์ธ์ด ํ๋ก๊ทธ๋จ์ ๋ง๋ ๋ค.
๊ทธ ํ ๋ด์ฉ์๋ ๋ค์๊ณผ ๊ฐ์ ์์ค์ฝ๋๋ฅผ ์์ฑํด์ค๋ค.
#include <stdio.h>
int sum(int a, int b){
return a+b;
}
int main(void){
int c=sum(1,2);
return c;
}

$gcc -S -fno-stack-protector -mpreferred-stack-boundary=4 -z execstack -o sum.a sum.c
ํด๋น ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ณํ๋๋ค.
$vi sum.a
sum.a์ ๋ด์ฉ์ ํ์ธํ๊ธฐ์ํด ๋ช ๋ น์ด๋ฅผ ์น๋ฉด

์ด๋ฌํ ๋ด์ฉ์ด ๋จ๊ฒ ๋๋ค.
vi์๋ํฐ๋ฅผ ์ข ๋ฃํ๋ ๋ฒ์
ESC๋ฅผ ๋๋ฅธ ์ํ์์ : ๋ฅผ ๋๋ฅด๊ณ q๋ฅผ ์น๋ฉด ๋๋ค.
ESC+:q
#include <stdio.h>
int sum(int a, int b){
return a+b;
}
int main(void){
int c=sum(1,2);
return c;
}
์คํ ํ๋ ์์ ๋ํด ์ดํดํ๊ธฐ ์ํด ์ด์ ๋ธ๋ฆฌ์ฝ๋๋ณด๋ค ์ดํดํ๊ธฐ ์ฌ์ด
C์ธ์ด ์์ค์ฝ๋๋ก ๋จผ์ ์ดํด๋ฅผ ํด๋ณด์.
sum.c ์์ค์ฝ๋๊ฐ ์คํ์ด ๋๋ค๋ฉด, mainํจ์๋ฅผ ๋จผ์ ์คํํ๋ค.
๊ทธ ํ sum์ด๋ผ๋ ํจ์๋ฅผ ๋ถ๋ฅด๋ฉฐ ํ๋ผ๋ฏธํฐ๋ก 1,2๋ฅผ ๋ฃ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก sumํจ์์์ return a+b;์ ์ํด 1+2์ด ๋ฐํ๋๋ค.
์ฒ์ mainํจ์ ์คํ ์์ ์คํ ํ๋ ์์ ๋ค์๊ณผ ๊ฐ๋ค.

RET๋ ๋ฆฌํด ์ด๋๋ ์ค. ํญ์ ๋งจ ์๋์ชฝ์ ์๋ค.
ํน์ ํ ํจ์๊ฐ ๋๋ ํ ๋์๊ฐ ์ฃผ์๋ฅผ ๋ปํ๋ค.
RBP๋ ์คํ์ด ์์ํ๋ ๋ฒ ์ด์ค ํฌ์ธํฐ๋ฅผ ๋ปํ๋ค.
์ฆ RBP๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ผ๋ก๋ถํฐ ์คํ์ด ์์ธ๋ค.
๋ณ์ c๋ main ํจ์์ int c๋ฅผ ๋ปํ๋ค.
main ํจ์์์ sum ํจ์๋ฅผ ํธ์ถํ์ ๋์ ์คํ ํ๋ ์์ ๋ค์๊ณผ ๊ฐ๋ค.

๋ฐ์ 4๊ฐ๋ ๊ทธ๋๋ก๋ฉฐ,
๊ทธ ์๋ก sum()ํธ์ถ ํ์
ํจ์์ ๋งค๊ฐ๋ณ์ ๋ํ ์คํ์ผ๋ก ๋ค์ด๊ฐ๋ค.
๋ณ์ y ์์ RET๋ sum ํจ์๋ฅผ ๋ค ์คํํ ํ ๋์๊ฐ๋ ์ฃผ์๋ฅผ ๋ปํ๋ค.
๋ณ์ x, ๋ณ์ y๋ ๊ฐ๊ฐ 1๊ณผ 2๊ฐ ๋๋ค.
#include <stdio.h>
int sum(int a, int b){
return a+b;
}
int main(void){
int c=sum(1,2);
printf("%d\n",c);
return c;
}
์ด์ ์ ์ ๋ ฅํ๋ sum.c์
printf("%d\n",c);๋ฅผ ์ถ๊ฐํด์ค๋ค.
$ gcc -o sum sum.c
$./sum
์คํํด์ ํ ์คํธ ํ๊ธฐ ์ํด ์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค.

์คํํ๋ฉด ์์ ๊ฐ์ด ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
์ด์ ์ ๋ง๋ค์ด๋์๋ sum.a๋ฅผ vi์๋ํฐ๋ก ๋ค์ ํ์ธํด๋ณด์.

main ํจ์๋ฅผ ์ดํด๋ณด๋ฉด call์ ํตํด sum์ด๋ ํจ์๋ฅผ ๋ถ๋ฅด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

SUM์ด๋ ํจ์๋ฅผ ๋ถ๋ฅด๊ธฐ ์ ๊น์ง ํ์ธํด๋ณด์.
์ฒ์ mainํจ์๋ฅผ ํธ์ถํจ๊ณผ ๋์์ RET๊ฐ ์ ์ผ ๋ฐ์ ์์ฑ๋๋ค.
๊ทธ ์์ pushq %rbp์ ์ํด RBP๊ฐ ๋ค์ด๊ฐ๋ค.
movq %rsp, %rbp์ ์ํด RBP=RSP๊ฐ ๋๋ค.
subq $16, %rsp๋ฅผ ํตํด rsp์์ 16์ ๋บ๋ค.
16์ ๋นผ๊ฒ ๋๋ฉด ์์ ๊ทธ๋ฆผ์ฒ๋ผ RSP๊ฐ 16๋งํผ ์๋ก ์ ํ๋ฅผ ํ๊ฒ ๋๋ค.
movl $2, %esi ์ movl $1, %edi๋ฅผ ํตํด ๊ฐ๊ฐ 2์ 1์ ๋ฃ๋๋ค.
esi๋ rsi์ ๋น์ทํ๊ณ , edi๋ rdi์ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.

์ด์ ๋ sum()ํจ์๋ฅผ ์คํํ๋ ๋ถ๋ถ์ ์ดํด๋ณด์.

์๊น์ RSP๋ 16๋งํผ์ ๊ณต๊ฐ์ ํ๋ณดํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก SUMํจ์๋ฅผ ๋ถ๋ ๊ธฐ ๋๋ฌธ์ RET๊ฐ ์ถ๊ฐ๋๋ค.
pushq %rbp๋ก ์ธํด RET์์ RBP๊ฐ ์๊ธด๋ค.
movl %edi, -4(%rbp)๋ rbp-4์ ์์น์ edi ๊ฐ์ ๋ฃ๋๋ค.
edi๋ 1์ด๊ณ , RBP์ ์์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
movl %esi, -8(%rbp)๋ rbp-8์ ์์น์ esi ๊ฐ์ธ 2๋ฅผ ๋ฃ๊ฒ๋๋ค.
movl -4(%rbp), %edx ๋ rbp-4์ ์์น์ ๊ฐ์ edx์ ๋ฃ๊ณ ,
movl -8(%rbp), %eax๋ rbp-8์ ์์น์ ๊ฐ์ eax์ ๋ฃ๋๋ค.
์ฆ, edx๋ 1์ด ๋๊ณ , eax๋ 2๊ฐ ๋๋ค.
addl %edx, %eax๋
edx์ ๊ฐ์ eax์ ๋ํด์ฃผ๊ธฐ ๋๋ฌธ์,
์ต์ข ์ ์ผ๋ก eax์ ๊ฐ์ 3์ด ๋๋ค.
๋ง์ง๋ง์ผ๋ก popq %rbp๋ฅผ ํจ์ผ๋ก์จ RBP๋ฅผ ๋นผ๋ด์ด RET๋ก ๋์๊ฐ ์ ์๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก EAX๋ ์ง์คํฐ๋ ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค.

call sum ๋ค์ ๋ถ๋ถ์ ํ์ธํด๋ณด์.

movl %eax, -4(%rbp)๋ฅผ ํตํด rbp-4์ eax์ ๊ฐ์ธ 3์ ์ ์ฅํ๋ค.
movl -4(%rbp), %eax๋ฅผ ํตํด ๋ค์ rbp-4์ ๊ฐ์ธ 3์ ๋ค์ eax์ ์ ์ฅํ๋ค.
์ต์ข ์ผ๋ก sum ํ๋ก๊ทธ๋จ์ 3์ ๋ฐํํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
2023.01.11 - [ํ๋ก์ ํธ/์์คํ ํดํน] - [์์คํ ํดํน] ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
[์์คํ ํดํน] ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
https://youtu.be/TxWOaKE5w_s ์ค๋๋ ํด๋น ์ ํ๋ธ๋ฅผ ๋ณด๋ฉด์ ๊ณต๋ถํด๋ณด๋ ค๊ณ ํ๋ค! ์ฌ์ค ์ ๊ณต ์ฑ ์ค์ ํํ ์ด์ ๋ธ๋ฆฌ์ด๋ง ํ์์์ ๊ฒ ๊ฐ์์ ๋ฒ๋ ธ๋๋ฐ ์ง๊ธ์ ์์ฒญ ํํ๊ฐ ๋๊ณ ์๋ค! ํ์ง๋ง ์ธํฐ๋ท์ผ๋ก
dangsdangs.tistory.com
'ํ๋ก์ ํธ > ์์คํ ํดํน' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์์คํ ํดํน] ์ด์ ๋ธ๋ฆฌ์ด ๊ธฐ๋ณธ ๋ฌธ๋ฒ (0) | 2023.01.15 |
|---|---|
| [์์คํ ํดํน] ์ด์ ๋ธ๋ฆฌ์ด ์์ฝ ํ๋ก๊ทธ๋จ ์์ฑ (1) | 2023.01.13 |
| [์์คํ ํดํน] ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (0) | 2023.01.11 |
| [์์คํ ํดํน] ๋ ์ง์คํฐ ์ฉ๋์ ์์คํ ์ฝ (3) | 2023.01.10 |
| [์์คํ ํดํน] ์ด์ ๋ธ๋ฆฌ์ด๋ก Hello World ์ถ๋ ฅ (1) | 2023.01.09 |