๐์คํ ํ๋ ์(Stack Frame)์ด๋?
ESP(์คํ ํฌ์ธํฐ)๊ฐ ์๋ EBP(๋ฒ ์ด์ค ํฌ์ธํฐ) ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ์ฌ
์คํ ๋ด์ ๋ก์ปฌ ๋ณ์, ํ๋ผ๋ฏธํฐ, ๋ณต๊ท ์ฃผ์์ ์ ๊ทผํ๋ ๊ธฐ๋ฒ
โก๏ธ ํจ์์ ๋งค๊ฐ ๋ณ์, ํจ์ ๋ฐํ ์ฃผ์๊ฐ, ์ง์ญ ๋ณ์ ๋ฑ
๋ฉ๋ชจ๋ฆฌ์ ์คํ ์์ญ์ ์์๋๋ก ์ ์ฅ๋๋ ํจ์์ ํธ์ถ ์ ๋ณด๋ฅผ ์คํ ํ๋ ์์ด๋ผ๊ณ ํ๋ค.
โ์ง๊ณ ๋์ด๊ฐ๊ธฐ - ์คํ
(1) Push
์คํ์ Push๋ฅผ ํ์ฌ ๊ฐ์ ๋ฃ์ผ๋ฉด ์คํ์ ๋ฐ๋ฅ(EBP)์์ ์คํ ํ(ESP)์ ํฅํด ๋ฐ์ดํฐ๊ฐ ์์ธ๋ค.
(2) Pop
์คํ์ Pop์ ํ์ฌ ๊ฐ์ ๋นผ๋ฉด ์คํ์ ํ(ESP)์์ ์คํ์ ๋ฐ๋ฅ(EBP)์ ํฅํด ๋ฐ์ดํฐ๊ฐ ์ค์ด๋ ๋ค.
โก๏ธ ์ฆ, ๋ฐ์ดํฐ๊ฐ ๋์ด๋ ์๋ก ๋ฎ์ ์ฃผ์์ ์ ์ฅ์ด ๋๋ค.
๋ฐ์ดํฐ๊ฐ ๋์ด๋ ์๋ก ๋ฎ์ ์ฃผ์์ ์ ์ฅ์ด ๋๋ ์ด์ ๋ ์ปค๋(Kernel)๊ณผ ๋ง๋์ง ์๋๋ก ํ๊ธฐ ์ํจ์ด๋ค.
๐ขํจ์์ ํธ์ถ ๋จ๊ณ
- ํจ์๊ฐ ์ฌ์ฉํ ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฃ๊ณ ํจ์ ์์ ์ง์ ์ผ๋ก ์ ํํ๋ค. โก๏ธ ํจ์ ํธ์ถ
- ํจ์ ๋ด์์ ์ฌ์ฉํ ์คํ ํ๋ ์์ ์ค์ ํ๋ค. โก๏ธ ํจ์ ํ๋กค๋ก๊ทธ
- ํจ์์ ๋ด์ฉ์ ์ํํ๋ค. โก๏ธ ํจ์์ ๋ณธ์ฒด
- ์ํ์ ๋๋ด๋ฉด ์ฒ์ ํธ์ถํ ์ง์ ์ผ๋ก ๋์๊ฐ๊ธฐ ์ํด ์คํ์ ๋ณต์ํ๋ค. โก๏ธ ํจ์ ์ํ๋ก๊ทธ
๐งฌ์คํ ํ๋ ์์ ๊ตฌ์กฐ
PUSH EBP # ํจ์์์ (EBP๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ธฐ์กด์ ๊ฐ์ ์คํ์ ์ ์ฅ)
MOV EBP, ESP # ํ์ฌ์ ESP(์คํํฌ์ธํฐ)๋ฅผ EBP์์ ์ฅ
# ํจ์ ๋ณธ์ฒด
... # ์ฌ๊ธฐ์ ESP๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ EBP๊ฐ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก
# ์์ ํ๊ฒ ๋ก์ปฌ ๋ณ์์ํ๋ผ๋ฏธํฐ๋ฅผ ์์ธ์คํ ์ ์์
MOV ESP , EBP # ESP๋ฅผ์ ๋ฆฌ(ํจ์ ์์ํ์๋์ ๊ฐ์ผ๋ก ๋ณต์์ํด)
POP EBP # ๋ฆฌํด๋๊ธฐ ์ ์ ์ ์ฅํด ๋์๋ ์๋ EBP ๊ฐ์ผ๋ก ๋ณต์
RETN # ํจ์ ์ข
๋ฃ
(1) ํจ์ ํ๋กค๋ก๊ทธ
PUSH EBP # ํจ์์์ (EBP๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ธฐ์กด์ ๊ฐ์ ์คํ์ ์ ์ฅ)
MOV EBP, ESP # ํ์ฌ์ ESP(์คํํฌ์ธํฐ)๋ฅผ EBP์์ ์ฅ
ํจ์ ์ํ์ ๋ง์น๋ฉด ๋ค์ ์ ์๋ฆฌ๋ก ๋์๊ฐ๊ธฐ ์ํด EBP์ ๊ฐ์ ์คํ PUSH ํ์ฌ ์ ์ฅํด๋๋๋ค.
EBP์ ESP๋ฅผ ์ ์ฅํด์ค์ผ๋ก์จ ์คํ ํ๋ ์์ ์์ฑํด์ค๋ค.
(2) ํจ์ ์ํ๋ก๊ทธ
MOV ESP , EBP # ESP๋ฅผ์ ๋ฆฌ(ํจ์ ์์ํ์๋์ ๊ฐ์ผ๋ก ๋ณต์์ํด)
POP EBP # ๋ฆฌํด๋๊ธฐ ์ ์ ์ ์ฅํด ๋์๋ ์๋ EBP ๊ฐ์ผ๋ก ๋ณต์
RETN # ํจ์ ์ข
๋ฃ
ํจ์ ์ํ์ ๋ง์น๋ฉด ํธ์ถ์ ํ๋ ์ง์ ์ผ๋ก ๋์๊ฐ๊ธฐ ์ํด ์ฒ์ ํจ์๊ฐ ์์๋์์ ๋์ ๊ฐ์ผ๋ก ๋ณต์์ํจ๋ค.
๊ทธ๋ค์, ํ๋กค๋ก๊ทธ์์ PUSH ํด๋์๋ ๊ฐ์ ๋ค์ POP ํ์ฌ EBP์ ๋ฃ์ด์ค๋ค.
๐ธ์ค์ตํ๊ธฐ
C ์ฝ๋
#include <stdio.h>
int sub(int a, int b) {
int x = a, y = b;
return (x - y);
}
int main() {
int a = 5, b = 1;
printf("%d\n", sub(a, b));
return 0;
}
์์ C ์ฝ๋๋ฅผ Ollydbg๋ก ์ด์ด๋ณด์.
main() ํจ์
sub() ํจ์
(1) main() ํจ์ ์์ & ์คํ ์ํ
โฌ๏ธmain() ํจ์๋ฅผ ์คํํ์ ๋์ ์คํ ์ํ
EBP์ ๊ฐ์ ์คํ์ ์ง์ด๋ฃ๋ ๊ณผ์ ์ EBP๊ฐ ์ด์ ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ ์คํ์ ๋ฐฑ์ ํด๋๊ธฐ ์ํจ์ด๋ค.
(2) main() ํจ์ ์คํ ํ๋ ์ ์์ฑ
EBP์ ESP์ ๊ฐ์ ์ฎ๊ฒจ์ค์ผ๋ก์จ ์๋ก ๊ฐ์ ๊ฐ(012FFBB8)์ ๊ฐ์ง๊ฒ ๋๋ค. 12FFBB8์ ์ฃผ์์๋ 12FFC00์ด๋ผ๋ ๊ฐ์ด ์ ์ฅ๋์ด ์๋ค. 12FFC00์ main() ํจ์์ ์์ ๋ EBP๊ฐ ๊ฐ์ง๊ณ ์๋ ์ด๊ธฐ ๊ฐ์ด๋ค.
main() ํจ์๊ฐ ๋๋ ๋๊น์ง EBP ๊ฐ์ ๊ณ ์ ๋๋ค.
๋ฐ๋ผ์ ์คํ์ ์ ์ฅ๋ ํจ์์ ๋งค๊ฐ ๋ณ์์ ์ง์ญ ๋ณ์๋ค์ EBP๋ฅผ ํตํด ์ ๊ทผํ๊ฒ ๋๋ค.
โก๏ธ 2F10A0๊ณผ 2F10A1 ์ฃผ์์ ๋ ๋ช ๋ น์ด๋ฅผ ํตํด main() ํจ์์ ๋ํ ์คํ ํ๋ ์์ด ์์ฑ๋์๋ค.
(3) ์ง์ญ ๋ณ์ ์ค์
โฌ๏ธํด๋น C ์ฝ๋
int a = 5, b = 1;
์์ C ์ฝ๋๋ฅผ ๋ณด๋ฉด intํ ๋ณ์ 2๊ฐ๋ฅผ ์ ์ธํด ์ฃผ์๋ค.
์ด ๋ ๋ณ์๋ฅผ ์คํ์ ์ ์ฅํ๋ ค๋ฉด ๊ณต๊ฐ์ ๋ง๋ จํด์ฃผ์ด์ผ ํ๋๋ฐ, int๋ 4๋ฐ์ดํธ๋ ์ด 8๋ฐ์ดํธ๊ฐ ํ์ํ๋ค.
์ด ๊ณผ์ ์ ESP์ 8์ ๋นผ์ค์ผ๋ก์จ ํ์ํ ๊ณต๊ฐ์ ํ๋ณดํด ์ฃผ์๋ค.
์ด์ ๋ง๋ค์ด๋ ๊ณต๊ฐ์ ๊ฐ๊ฐ 5์ 1์ ๋ฃ์ด์ค ์ฐจ๋ก์ด๋ค.
[EBP-8]์ ์ฃผ์์ 5๋ฅผ ๋ฃ์ด์ฃผ๊ณ , [EBP-4]์ ์ฃผ์์ 1์ ๋ฃ์ด์ค๋ค.
๋ฐ๋ผ์ [EBP-8]์ ๋ณ์ a์ด๊ณ , [EBP-4]๋ ๋ณ์ b์์ ์ ์ ์๋ค.
โฌ๏ธ์ง๊ธ๊น์ง ์คํํ ํ์ ์คํ ์ํ
5์ 1์ด ๋ค์ด ์๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
(4) sub() ํจ์ ๋งค๊ฐ ๋ณ์ ์ ๋ ฅ & sub() ํจ์ ํธ์ถ
โฌ๏ธํด๋น C ์ฝ๋
printf("%d\n", sub(a, b));
EAX์๋ [EBP-4] ์ฆ, 1์ ์ฎ๊ฒจ์ฃผ๊ณ ์คํ์ ๋ฃ๋๋ค.
ECX์๋ [EBP-8] ์ฆ, 5๋ฅผ ์ฎ๊ฒจ์ฃผ๊ณ ์คํ์ ๋ฃ๋๋ค.
์ด๋ ๋ณ์ a, b๋ฅผ ์คํ์ ๋ฃ๋ ๊ฒ์ด๋ค.
์ฃผ๋ชฉํ ๋ด์ฉ์ ํ๋ผ๋ฏธํฐ๊ฐ C ์ธ์ด์ ์ ๋ ฅ ์ ์์ธ๋ ๋ฐ๋๋ก ์คํ์ ์ ์ฅ๋๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฅผ "ํจ์ ํ๋ผ๋ฏธํฐ์ ์ญ์ ์ ์ฅ"์ด๋ผ๊ณ ํ๋ค
โฌ๏ธ์ง๊ธ๊น์ง ์คํํ ํ์ ์คํ ์ํ
๊ทธ๋ค์ sub ํจ์๋ฅผ ๋ถ๋ฌ์จ๋ค.
(5) sub() ํจ์ ์์ & ์คํ ํ๋ ์ ์์ฑ
โฌ๏ธํด๋น C ์ฝ๋
int sub(int a, int b) {
main() ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก sub() ํจ์๋ ์์ ๋ง์ ์คํ ํ๋ ์์ ์์ฑํ๋ค.
์คํ ํ๋ ์์ ์์ฑ ๊ณผ์ ์ main() ํจ์์ ๊ฐ๋ค.
โฌ๏ธ์ง๊ธ๊น์ง ์คํํ ํ์ ์คํ ์ํ
main() ํจ์์์ ์ฌ์ฉ๋๋ EBP ๊ฐ(12FFBB8)์ ์คํ์ ๋ฐฑ์ ํ ํ EBP๋ 12FFBA0๋ก ์๋กญ๊ฒ ์ธํ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
(6) sub() ํจ์์ ์ง์ญ ๋ณ์ ์ค์
โฌ๏ธํด๋น C ์ฝ๋
int a = 5, b = 1;
sub() ํจ์์ ์ง์ญ ๋ณ์ x, y์ ๊ฐ๊ฐ ๋งค๊ฐ ๋ณ์ a, b๋ฅผ ๋์ ์ ํด์ฃผ๋ ๋ถ๋ถ์ด๋ค.
์ด ์ญ์ intํ ๋ณ์ x์ y์ 8๋ฐ์ดํธ์ ๊ณต๊ฐ์ ํ๋ณดํด์ค๋ค.
sub() ํจ์์์ ์คํ ํ๋ ์์ด ์์ฑ๋๋ฉด์ EBP์ ๊ฐ์ด ๋ณํ๋ค.
๋ฐ๋ผ์ [EBP+8], [EBP+C]๊ฐ ๊ฐ๊ฐ ๋งค๊ฐ ๋ณ์ a, b๋ฅผ ๊ฐ๋ฆฌํจ๋ค. (C๋ 16์ง์)
[EBP-8], [EBP-4]๋ ๊ฐ๊ฐ sub() ํจ์์ ์ง์ญ ๋ณ์ y, x๋ฅผ ์๋ฏธํ๋ค.
โฌ๏ธ์ง๊ธ๊น์ง ์คํํ ํ์ ์คํ ์ํ
(7) sub() ์ฐ์ฐ
return (x - y);
์์ ์ฝ๋์ ์ฐ์ฐ ๋ถ๋ถ์ด๋ค.
EAX์ [EBP-4] ์ฆ, x๋ฅผ ์ฎ๊ฒจ์ค๋ค.
๊ทธ๋ค์, 5์ ๊ฐ์ด ๋ค์ด์๋ EAX์ y์ ๊ฐ์ด ๋ค์ด์๋ [EBP-8]๋ฅผ ๋นผ์ค๋ค.
์ด ๊ณผ์ ์ ์ฝ๊ฒ ์ฐ์ฐ์ผ๋ก ํํํ๋ค๋ฉด
5 - 1
์ด ๋๋ค. ๋ฐ๋ผ์ EAX์ ๊ฐ์ด 4๊ฐ ๋์๋ค.
(8) sub() ํจ์ ์คํ ํ๋ ์ ํด์ & ํจ์ ์ข ๋ฃ(๋ฆฌํด)
return (x - y);
}
์์ ์ฝ๋์ ํด๋นํ๋ ๋ถ๋ถ์ด๋ค.
EBP ๊ฐ์ ESP์ ๋์ ํด์ค๋ค. ์ด๋ sub() ํจ์๊ฐ ์์๋ ๋์ ESP๊ฐ์ EBP์ ๋ฃ์ด ๋์๋ค๊ฐ ํจ์๊ฐ ์ข ๋ฃ๋ ๋ ESP๋ฅผ ์๋๋๋ก ๋ณต์์ํค๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
sub() ํจ์๋ฅผ ์์ํ๋ฉด์ ์คํ์ ๋ฏธ๋ฆฌ ์ ์ฅํด๋ EBP ๊ฐ์ ๋ณต์ํด์ค๋ค.
์ด ๋ช ๋ น์ด๋ ์์ PUSH EBP ๋ช ๋ น์ ๋์ํ๋ ๊ฒ์ด๋ค.
main() ํจ์์ EBP๊ฐ์ ๋ณต์ํจ์ผ๋ก์จ sub() ํจ์์ ์คํ ํ๋ ์์ด ํด์ ๋๋ค.
โฌ๏ธ์ง๊ธ๊น์ง ์คํํ ํ์ ์คํ ์ํ
ESP๊ฐ 12 FFBA4์ด๊ณ , ์ด ์ฃผ์์ ๊ฐ์ F110C1์ด๋ค.
์ด ๊ฐ์ CPU๊ฐ ์คํ์ ์ ๋ ฅํ ๋ณต๊ท ์ฃผ์์ด๋ค.
RETN ๋ช ๋ น์ด๊ฐ ์คํ๋๋ฉด ์คํ์ ์ ์ฅ๋ ๋ณต๊ท ์ฃผ์๋ก ๋ฆฌํดํ๋ค.
โฌ๏ธ์ง๊ธ๊น์ง ์คํํ ํ์ ์คํ ์ํ
์คํ ์ํ๋ฅผ ํ์ธํด๋ณด๋ฉด, sub() ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ํ๋ก ๋๋์์๋ค.
(4) sub() ํจ์ ๋งค๊ฐ ๋ณ์ ์ ๋ ฅ & sub() ํจ์ ํธ์ถ์ sub() ํจ์ ํธ์ถ ์ ์ ์คํ ์ํ๋ฅผ ํ์ธํด๋ณด๋ฉด
์๋ฒฝํ ์ผ์นํ๋ค.
ํ๋ก๊ทธ๋จ์ ์ด๋ฐ ์์ผ๋ก ์คํ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํจ์์ ํธ์ถ์ด ์๋ฌด๋ฆฌ ๋ง๋๋ผ๋ ์คํ์ด ๊นจ์ง์ง ์๊ณ ์ ์ ์ง๋๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ํจ์์ ๋งค๊ฐ ๋ณ์, ๋ณต๊ท ์ฃผ์๊ฐ ๋ฑ์ ํ ๋ฒ์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์ ์คํ ๋ฒํผ ์ค๋ฒ ํ๋ก์ฐ(Stack Buffer Overflow)์ ์ทจ์ฝํ๋ค.
(9) sub() ํจ์ ๋งค๊ฐ ๋ณ์ ์ ๊ฑฐ(์คํ ์ ๋ฆฌ)
sub() ํจ์์์ ๋ค์ main() ํจ์๋ก ๋์์๋ค.
'ADD' ๋ช ๋ น์ผ๋ก ESP์ 8์ ๋ํ๋ ์ด์ ๋ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ sub() ํจ์์๊ฒ ๋๊ฒจ์ค ๋งค๊ฐ ๋ณ์์ธ a, b๋ฅผ ์ ๋ฆฌํด์ฃผ๊ธฐ ์ํจ์ด๋ค.
'ADD' ๋ช ๋ น ์คํ ์ ์ ๋ค์ ์๋์ ์คํ ์ํ๋ฅผ ์ ๋ณด๋ฉด 12FFBA8๊ณผ 12FFBAC ์ฃผ์์ 5์ 1, ์ฆ ๋งค๊ฐ ๋ณ์ a, b๊ฐ ์๋ ๊ฒ์ ์ ์ ์๋ค.
โฌ๏ธ์คํ ํ ์คํ ์ํ
(10) printf() ํจ์ ํธ์ถ
โฌ๏ธํด๋น C ์ฝ๋
printf("%d\n", sub(a, b));
PUSH EAX : EAX์๋ sub() ํจ์์์ ์ ์ฅ๋ ๋ฆฌํด ๊ฐ์ธ 4๊ฐ ๋ค์ด์๋ค.
PUSH OFFSET ... : "%d\n"
CALL stackstu.printf : printf() ํจ์ ํธ์ถ
ADD ESP, 8 : ๋งค๊ฐ ๋ณ์ ์ ๋ฆฌ
(11) ๋ฆฌํด ๊ฐ ์ค์
โฌ๏ธํด๋น C ์ฝ๋
return 0;
main() ํจ์์ ๋ฆฌํด ๊ฐ(0)์ ์ค์ ํด์ฃผ๋ ์ฝ๋์ด๋ค.
XOR์ ๋ฐฐํ์ ๋ ผ๋ฆฌํฉ์ผ๋ก, ๋น๊ตํ๋ ๊ฐ๋ค์ด ์๋ก ๊ฐ์ผ๋ฉด 0์ ๋ฐํํ๋ค.
๊ฐ์ ๋ ์ง์คํฐ๋ฅผ ๋น๊ตํ์ผ๋ฏ๋ก 0์ด ๋๋ค.
XOR์ ์ฌ์ฉํ๋ ์ด์ ๋ 'MOV' ๋ช ๋ น์ด๋ณด๋ค ์คํ ์๋๊ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ ์ง์คํฐ๋ฅผ ์ด๊ธฐํ์ํฌ ๋ ๋ง์ด ์ฌ์ฉ๋๋ค.
(12) ์คํ ํ๋ ์ ํด์ & main() ํจ์ ์ข ๋ฃ
โฌ๏ธํด๋น C ์ฝ๋
return 0;
}
main() ํจ์์ ์คํ ํ๋ ์์ ํด์ ํ๋ค.
main() ํจ์์ ์ง์ญ ๋ณ์ ์ญ์ ์ ํจํ์ง ์๊ฒ ๋์๋ค.
POP EBP๊น์ง ์คํํ๊ณ ๋๋ฉด main() ํจ์๊ฐ ์์ํ ๋์ ์คํ ๋ชจ์ต๊ณผ ํ์ฌ์ ์คํ ํ๋ ์์ด ๋์ผํด์ง๋ค.
์ด์ ๋ฉ์ธ ํจ์๊ฐ 'RETN' ๋๋ฉด์ ๋ฆฌํด ์ฃผ์๋ก ์ ํํ๋ค.
๊ทธ ์ดํ์๋ ํ๋ก์ธ์ค ์ข ๋ฃ ์ฝ๋๊ฐ ์คํ๋๋ฉฐ ์ต์ข ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๊ฐ ๋๋ค.
์ฐธ๊ณ
https://oopsys.tistory.com/165
[๋ฆฌ๋ฒ์ฑ] ํจ์: ํ๋กค๋ก๊ทธ&์ํ๋ก๊ทธ์ ํธ์ถ ๊ท์ฝ
ํจ์ ํธ์ถ ๊ณผ์ ์ ๋ํด ์์๋ณด์. 1. ํจ์๊ฐ ์ฌ์ฉํ ํ๋ผ๋ฏธํฐ๋ฅผ ์คํ์ ๋ฃ๊ณ ํจ์ ์์์ง์ ์ผ๋ก ์ ํ(ํจ์ ํธ์ถ) ํ๋ค. 2. ํจ์ ๋ด์์ ์ฌ์ฉํ ์คํํ๋ ์์ ์ค์ ํ๋ค. (ํ๋กค๋ก๊ทธ) 3. ํจ์์ ๋ด์ฉ
oopsys.tistory.com
'Reverse Engineering' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Dreamhack | Reverse Engineering | Stage 2 | Background: Static Analysis vs. Dynamic Analysis (0) | 2022.07.09 |
---|---|
Dreamhack | Reverse Engineering | Stage 2 | Binary (0) | 2022.07.08 |