๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ์ ํŠธ/์‹œ์Šคํ…œ ํ•ดํ‚น

[์‹œ์Šคํ…œ ํ•ดํ‚น] ์Šคํƒ ํ”„๋ ˆ์ž„

728x90

https://youtu.be/ZFOHvzXcao0

์˜ค๋Š˜๋„ ๋™๋นˆ๋‚˜๋‹˜์˜ ๊ฐ•์˜๋กœ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด์ž.


 

$ 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