ํจ์ ํธ์ถ ๊ท์ฝ๐ค
ํจ์์ ํธ์ถ ๋ฐ ๋ฐํ์ ์ฝ์
ํ ํจ์์์ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถ ์, ํ๋ก๊ทธ๋จ์ ์คํ ํ๋ฆ์ ๋ค๋ฅธ ํจ์๋ก ์ด๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํธ์ถ๋ ํจ์๊ฐ ๋ฐํ๋๋ฉด ๋ค์ ์๋์ ํจ์๋ก ๋์์ ๊ธฐ์กด์ ์คํ ํ๋ฆ์ ์ด์ด๊ฐ์ฃ .
ํจ์ ํธ์ถ ์ ๋ฐํ๋ ์ดํ๋ฅผ ์ํด ํธ์ถ์(Caller)์ ์ํ(Stack frame) ๋ฐ ๋ฐํ ์ฃผ์(Return Address)๋ฅผ ์ ์ฅํด์ผ ํจ!
๋ํ, ํธ์ถ์๋ ํผํธ์ถ์(Callee)๊ฐ ์๊ตฌํ ์ธ์๋ฅผ ์ ๋ฌํ๋ฉฐ, ํผํธ์ถ์์ ์คํ์ด ์ข ๋ฃ ์ ๋ฐํ ๊ฐ์ ์ ๋ฌ ๋ฐ์์ผํจ
ํจ์ ํธ์ถ ๊ท์ฝ ์ ์ฉ์ ์ผ๋ฐ์ ์ผ๋ก ์ปดํ์ผ์ ๋ชซ์ด๋ฉฐ, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ง๊ฒ ํธ์ถ ๊ท์ฝ์ ์๋ง๊ฒ ์ ์ฉ์ ์ปดํ์ผํฉ๋๋ค. ํธ์ถ ๊ท์ฝ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ผ๋ฉฐ, ์ฝ๋์ ๋ช ์๊ฐ ์๋์ด ์๋ค๋ฉด ์ปดํ์ผ์์ ์ง์ํ๋ ํธ์ถ ๊ท์ฝ ์ค CUP์ ์ํคํ ์ฒ์ ์ ํฉํ ๊ฒ์ ์ ํํฉ๋๋ค. ๋ฐ๋ผ์ ๋๊ฐ์ ํ๋ก๊ทธ๋๋จธ๋ ํจ์ ํธ์ถ ๊ท์ฝ ๋ชฐ๋ผ๋ ์๊ด ์๋ค๋ ์ด์ผ๊ธฐ์ฃ
๋ง์ฝ, ์ปดํ์ผ๋ฌ ๋์ ์์ด ์ด์
๋ธ๋ฆฌ ์ฝ๋ ์์ฑ ๋๋ ์ด์
๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ ํ๋ค๋ฉด ์ ํ์๊ฐ ์๋ค๋ ์ด์ผ๊ธฐ
์์คํ
ํดํน์์ ์ด ๋ ๋ชจ๋ ํ์ ๊ธฐ์ ์ด๋ ์ด๋ฒ์ ํจ์์ ํธ์ถ ๊ท์ฝ์ ๋ํด ์์๋ณผ๊น์
ํจ์ ํธ์ถ ๊ท์ฝ์ ์ข ๋ฅ
์ปดํ์ผ๋ฌ๋ ์ง์ํ ํธ์ถ ๊ท์ฝ ์ค, CPU ์ํคํ ์ฒ์ ์ ํฉํ ๊ฒ์ ์ ํ!
x86(32bit) | Callee(ํผํธ์ถ์)์ ์ธ์ → ์คํ(Stack)
x86-64(64bit) | Callee์ ์ธ์ → ๋ ์ง์คํฐ(๋จ๋ ๊ฑด ์คํ์..)
์๋ฅผ ๋ค๋ฉด, x86(32bit) ์ํคํ ์ฒ๋ ๋ ์ง์คํฐ๋ฅผ ํตํด ํผํธ์ถ์(Callee)์ ์ธ์๋ฅผ ์ ๋ฌํ๊ธฐ์ ๋ ์ง์คํฐ์ ์๊ฐ ์ ์ผ๋ฏ๋ก, ์คํ์ผ๋ก ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ท์ฝ์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋๋ก x86-64(64bit) ์ํคํ ์ฒ๋ ๋ ์ง์คํฐ๊ฐ ๋ง์ผ๋ฏ๋ก ์ ์ ์์ ์ธ์๋ ๋ ์ง์คํฐ๋ง ์ฌ์ฉํด ์ธ์๋ฅผ ์ ๋ฌํ๊ณ , ์ธ์๊ฐ ๋ ๋ง์ ๋ ์คํ์ ์ฌ์ฉํจ
๊ทธ๋ฌ๋ CPU์ ์ํคํ
์ฒ๊ฐ ๊ฐ์๋, ์ปดํ์ผ๋ฌ๊ฐ ๋ค๋ฅด๋ฉด ์ ์ฉํ ํธ์ถ ๊ท์ฝ์ด ๋ค๋ฅผ ์๋ ์๋ค๋ ์ !!
C์ธ์ด๋ฅผ ์ปดํ์ผ ์, ์๋์ฐ๋ MSVC๋ MS x64 ํธ์ถ ๊ท์ฝ์ ์ ์ฉํ์ง๋ง, gcc๋ SYSTME V ํธ์ถ ๊ท์ฝ์ ์ ์ฉ
์ด ์ธ์ ๊ฐ์ ํธ์ถ ๊ท์ฝ์ ์ปดํ์ผ๋ฌ๋ง๋ค ๋ค๋ฅด๊ฒ ๊ตฌํํ๊ธฐ๋ ํจ
๋ค์ํ ํจ์ ํธ์ถ ๊ท์ฝ
x86
- cdecl
- stdcall
- fastcall
- thiscall
x86-64
- System V AMD64 ABI์ Calling ConventionMS
- ABI์ Calling Convention
x86ํธ์ถ ๊ท์ฝ : cdecl
์ธ์๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉํ ์คํ์ ํธ์ถ์๊ฐ ์ ๋ฆฌํจ
x86(32bit) | Callee(ํผํธ์ถ์)์ ์ธ์ → ์คํ(Stack)
์คํ์ ํตํด ์ธ์๋ฅผ ์ ๋ฌ ์ ๋ง์ง๋ง ์ธ์๋ถํฐ ์ฒซ ๋ฒ์งธ ์ธ์๊น์ง ๊ฑฐ๊พธ๋ก ์คํ์ push(์คํ์ ํน์ง..๊ฐ์๊ฑฐ?)
์ปดํ์ผ ์ต์ ์ค ๋ชจ๋ฅด๋๊ฒ ๋ง์๊ฑด๋ฐ ๋๋ฌด ๋ง์์.. ์ ๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค์ ใ ๋์ค์ ์ ๋ฆฌํด์ผ๊ฒ ์ฃ ..
// Name: cdecl.c
// Compile: gcc -fno-asynchronous-unwind-tables -nostdlib -masm=intel -fomit-frame-pointer -S cdecl.c -w -m32 -fno-pic -O0
// cdecl์ ํธ์ถ
void __attribute__((cdecl)) callee(int a1, int a2){}
void caller(){ callee(1, 2); }
์ ๋ฌ๋ฉด objdump๋ hexdump ์ธ ํ์๋ ์์ฃ ๊ทธ๋ฆฌ๊ณ ์ ๊น ์์๋ณผ ์ฌ์ค!
๐ก์ปดํ์ผ์ ์ ํํ ์๋ฏธ
์ด๋ค ์ธ์ด๋ก ์์ฑ๋ ์์ค ์ฝ๋ → ๋ชฉ์ ์ฝ๋๋ก ๋ฒ์ญํ๋ ๊ฒ
์์ค์ฝ๋ → ์ด์ ๋ธ๋ฆฌ์ด๋ก, ๋๋ ์์ค์ฝ๋ → ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ ํ์ ๋ชจ๋ ๋ฒ์ฃผ์ ํฌํจ๋จ
C์ธ์ด๋ฅผ ์คํ ๋ฐ์ด๋๋ฆฌ๋ก ๋ง๋๋ ๊ณผ์ ์ ๋ณดํต ์ ์ฒ๋ฆฌ, ์ปดํ์ผ, ์ด์ ๋ธ, ๋งํฌ์ 4๋จ๊ณ๋ก ๊ตฌ๋ถํ๋๋ฐ, ์ด๋ฅผ ํฉํด์ '์ปดํ์ผ'์ด๋ผ๊ณ ๋ถ๋ฅด๋ ์ด์ ๋ ๊ฐ์
x86-64ํธ์ถ ๊ท์ฝ : SYSV
๋ฆฌ๋ ์ค๋ SYSTEM V(SYSV)/ Application Binary Interface(ABI)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ฌ!
SYSV ABI๋ ELF ํฌ๋งท, ๋งํน ๋ฐฉ๋ฒ, ํจ์ ํธ์ถ ๊ท์ฝ ๋ฑ์ ๋ด์ฉ์ ๋ดํฌํจ
File ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด ๋ฐ์ด๋๋ฆฌ ์ ๋ณด๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ด SYSV ๋ฌธ์์ด์ด ํฌํจ๋์์ฃ
SYSV์์ ์ ์ํ ํจ์ ํธ์ถ ๊ท์ฝ์ ๋ค์์ ํน์ง์ ๊ฐ์ต๋๋ค.
- 6๊ฐ์ ์ธ์๋ฅผ RDI, RSI, RDX, RCX, R8, R9์ ์์๋๋ก ์ ์ฅํ๋ฉฐ ์ ๋ฌ
- ๋ ๋ง์ ์ธ์๋ฅผ ์ฌ์ฉํ ๋ ์คํ์ ์ถ๊ฐ๋ก ์ด์ฉํจ - Caller์์ ์ธ์ ์ ๋ฌ์ ์ฌ์ฉ๋ ์คํ์ ์ ๋ฆฌ
- ํจ์์ ๋ฐํ ๊ฐ์ RAX๋ก ์ ๋ฌํจ
๋ค์์ผ๋ก SYSV ์์ธ ๋ถ์์ผ๋ก ๋ค์ด๊ฐ๊ธฐ ์ ์ ํ์ํ ์ฝ๋๋ฅผ ์ปดํ์ผ ํ๊ณ ํ ๊น์ ใ ใ
// Name: sysv.c
// Compile: gcc -fno-asynchronous-unwind-tables -masm=intel -fno-omit-frame-pointer -S sysv.c -fno-pic -O0
#define ull unsigned long long
ull callee(ull a1, int a2, int a3, int a4, int a5, int a6, int a7) {
ull ret = a1 + a2 + a3 + a4 + a5 + a6 + a7;
return ret;
}
void caller() { callee(123456789123456789, 2, 3, 4, 5, 6, 7); }
int main() { caller(); }
SYSV ์์ธ ๋ถ์๐
gcc -fno-asynchronous-unwind-tables -masm=intel -fno-omit-frame-pointer -o sysv sysv.c -fno-pic -O0
gcc -fno-asynchronous-unwind-tables -masm=intel -fno-omit-frame-pointer -o sysv sysv.c -fno-pic -O0
์ปดํ์ผ์ ํ ํ, SYSV๋ ์์ผ๋ก ์์ฃผ ์ ํ ํธ์ถ ๊ท์ฝ์ด๋ฉฐ ์์ธํ ์์๋ด
์๋ค.
1. ์ธ์ ์ ๋ฌ๐
gdb๋ก sysv๋ฅผ ๋ก๋ํ ํ ์ค๋จ์ ์ค์ ํด caller ํจ์๊น์ง ์คํํฉ์๋ค.
context์ DISASM์ ๋ณด๋ฉด, caller+6 ๋ถํฐ caller+33 ๊น์ง 6๊ฐ์ ์ธ์๊ฐ ๊ฐ์ ๋ ์ง์คํฐ ์ค์
caller+4 ์์๋ 7๋ฒ์งธ ์ธ์์ธ 7์ ์คํ์ผ๋ก ์ ๋ฌํจ
gdb -q sysv | b* caller | r
b* caller+43 | c | x/10gx $rsp
1. callee ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ๊น์ง ์คํํ๊ณ , ๋ ์ง์คํฐ์ ์คํ์ ํ์ธํด๋ด ์๋ค.
2. ์์ค ์ฝ๋์์ callee(123456789, 2, 3, 4, 5, 6, 7)๋ก ํจ์๋ฅผ ํธ์ถํ๋๋ฐ,
์ธ์๋ค์ด ์์๋๋ก rdi, rsi, rdx, rcx, r8, r9 ๊ทธ๋ฆฌ๊ณ [rsp]์ ์ค์ ๋์ด ์๋ ๊ฑธ ํ์ธ ๊ฐ๋ฅ
2. ๋ฐํ ์ฃผ์ ์ ์ฅ๐
si ๋ช
๋ น์ด๋ก ํ ๋จ๊ณ ๋ ์คํํฉ์๋ค. 0x555555554682๊ฐ ๋ฐํ ์ฃผ์๋ก ์ ์ฅ๋จ
0x555555554682๋ callee ํธ์ถ ๋ค์ ๋ช
๋ น์ด์ ์ฃผ์์ด๋ฉฐ, callee์์ ๋ฐํ๋์ ๋,
์ด ์ฃผ์๋ฅผ ๊บผ๋ด์ด ์๋์ ์คํ ํ๋ฆ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค.
3. ์คํ ํ๋ ์์ ์ ์ฅ
x/5i $rip๋ช
๋ น์ด๋ก calleeํจ์์ ๋์
๋ถ(Prologue)๋ฅผ ์ดํด๋ณด๋ฉด, ๊ฐ์ฅ ๋จผ์ push rbp๋ฅผ ํตํด ํธ์ถ์์ rbp๋ฅผ ์ ์ฅํจ
rbp๊ฐ ์คํํ๋ ์์ ๊ฐ์ฅ ๋ฎ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๋ฏ๋ก, ์ด๋ฅผ Stack Frame Pointer(SFP)๋ผ๊ณ ๋ ๋ถ๋ฆผ
callee์์ ๋ฐํ๋ ๋, SFP๋ฅผ ๊บผ๋ด์ด caller์ ์คํ ํ๋ ์์ผ๋ก ๋์๊ฐ ์ ์์
si๋ก push rbp๋ฅผ ์คํํ๊ณ , ์คํ์ ํ์ธํด๋ณด๋ฉด
rbp๊ฐ์ธ 0x00007fffffffdf80๊ฐ ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
4. ์คํ ํ๋ ์ ํ ๋น
์ด์ mov rbp, rsp๋ก rbp์ rsp๊ฐ ๊ฐ์ ์ฃผ์๋ก ๊ฐ๋ฆฌํค๋ฉฐ,
๋ฐ๋ก ๋ค์์ rsp์ ๊ฐ์ ๋นผ๊ฒ ๋๋ฉด, rbp์ rsp์ ์ฌ์ด ๊ณต๊ฐ์ ์๋ก์ด ์คํ ํ๋ ์์ผ๋ก ํ ๋น๋์ง๋ง,
callee ํจ์๋ ์ง์ญ ๋ณ์ ์ฌ์ฉ์ ํ์ง ์์ผ๋ฏ๋ก, ์๋ก์ด ์คํ ํ๋ ์ ๋ง๋ค์ง ์์
si๋ก ์คํํ๊ณ , ๋ ์ง์คํฐ๋ฅผ ๋ณด๋ฉด ์ด ๋์ด ๊ฐ์ ์ฃผ์ ๊ฐ๋ฅดํค๋ ๊ฑธ ํ์ธ ๊ฐ๋ฅ
๐ก calleeํจ์์์ ret๋ผ๋ ์ง์ญ ๋ณ์๋ฅผ ์ ์ธํ์ง ์์๋์?
์ฝ๋๋ฅผ ๋ณด๋ฉด, ret๋ฅผ ์ ์ธํ๊ธฐ๋ ํ์ผ๋, ๋ฐํ ๊ฐ์ ์ ์ฅํ๋ ์ฉ๋ ์ธ๋ก๋ ์ฌ์ฉ X
gcc๋ ์ด๋ฐ ๋ณ์์ ๋ํด ์คํ์ ํ ๋นํ์ง ์๊ณ , rax๋ฅผ ์ง์ ์ฌ์ฉํฉ๋๋ค.
int callee(ull a1, int a2, int a3, int a4, int a5, int a6, int a7){
ull ret = a1 + a2 + a3 + a4 + a5 + a6 + a7;
return ret;
}
5. ๋ฐํ๊ฐ ์ ๋ฌ
์ฐ์ฐ์ ๋ชจ๋ ๋ง์น๊ณ , ํจ์์ ์ข
๊ฒฐ๋ถ(Epilogue)์ ๋๋ฌํ๋ฉด, ๋ฐํ๊ฐ์ rax๋ก ์ฎ๊น
๋ฐํ ์ง์ ์ rax๋ฅผ ์ถ๋ ฅํ๋ฉด ์ ๋ฌํ 7๊ฐ ์ธ์์ ํฉ์ ํ์ธ ํ ์ ์์
6. ๋ฐํ
๋ฐํ์ ์ ์ฅํด๋๋ ์คํ ํ๋ ์๊ณผ ๋ฐํ ์ฃผ์๋ฅผ ๊บผ๋ด๋ฉฐ ์ด๋ฃจ์ด์ง
์ฌ๊ธฐ์ calleeํจ์๊ฐ ์คํ ํ๋ ์์ ๋ง๋ค์ง ์๊ธฐ์, pop rbp๋ก ์คํ ํ๋ ์์ ๊บผ๋ผ ์ ์์ง๋ง,
์ผ๋ฐ์ ์ผ๋ก leave๋ก ์คํ ํ๋ ์์ ๊บผ๋ด์ผ ํจ
์คํ ํ๋ ์์ ๊บผ๋ธ ๋ค, ret๋ก ํธ์ถ์๋ก ๋ณต๊ท
์์์ ์ ์ฅํด๋ sfp๋ก rbp๊ฐ, ๋ฐํ ์ฃผ์๋ก rip๊ฐ ์ค์ ๋ ๊ฑธ ํ์ธ ๊ฐ๋ฅ
์ฝ์ค ์์ฝ๐
x86 ํจ์ ํธ์ถ ๊ท์ฝ
ํจ์ํธ์ถ๊ท์ฝ์ฌ์ฉ ์ปดํ์ผ๋ฌ์ธ์ ์ ๋ฌ ๋ฐฉ์์คํ ์ ๋ฆฌ์ ์ฉ
stdcall | MSVC | Stack | Callee | WINAPI |
cdecl | GCC, MSVC | Stack | Caller | ์ผ๋ฐ ํจ์ |
fastcall | MSVC | ECX, EDX | Callee | ์ต์ ํ๋ ํจ์ |
thiscall | MSVC | ECX(์ธ์คํด์ค), Stack(์ธ์) | Callee | ํด๋์ค์ ํจ์ |
x86-64 ํจ์ ํธ์ถ ๊ท์ฝ
ํจ์ํธ์ถ๊ท์ฝ์ฌ์ฉ ์ปดํ์ผ๋ฌ์ธ์ ์ ๋ฌ ๋ฐฉ์์คํ ์ ๋ฆฌ์ ์ฉ
MS ABI | MSVC | RCX, RDX, R8, R9 | Caller | ์ผ๋ฐ ํจ์, Windows Syscall |
System ABI | GCC | RDI, RSI, RDX, RCX, R8, R9, XMM0–7 | Caller | ์ผ๋ฐ ํจ์ |
๋ฌธ์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋๋ฌด ๊ธฐ์ด ๊ทธ๋๋ก ๋์์ ๋ฑํ.. ์ค๋ช ํ ๋ถ๋ถ์ด ์๊ธฐ์ ๋์ด๊ฐ๊ป์
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Return Address Overwrite (0) | 2022.04.25 |
---|---|
Memory Corruption: Stack Buffer Overflow (0) | 2022.04.21 |
shell_basic (0) | 2022.04.19 |
Exploit Tech: Shellcode (0) | 2022.04.15 |
Tool: pwntools (4) | 2022.04.04 |