Jastes 2022. 4. 20. 17:39


ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทœ์•ฝ๐Ÿค™

ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐ ๋ฐ˜ํ™˜์˜ ์•ฝ์†

 ํ•œ ํ•จ์ˆ˜์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์‹œ, ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ๋‹ค์‹œ ์›๋ž˜์˜ ํ•จ์ˆ˜๋กœ ๋Œ์•„์™€ ๊ธฐ์กด์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์ด์–ด๊ฐ€์ฃ .

 ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋ฐ˜ํ™˜๋œ ์ดํ›„๋ฅผ ์œ„ํ•ด ํ˜ธ์ถœ์ž(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์—์„œ ์ •์˜ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทœ์•ฝ์€ ๋‹ค์Œ์˜ ํŠน์ง•์„ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. 6๊ฐœ์˜ ์ธ์ž๋ฅผ RDI, RSI, RDX, RCX, R8, R9์— ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๋ฉฐ ์ „๋‹ฌ
    - ๋” ๋งŽ์€ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋• ์Šคํƒ์„ ์ถ”๊ฐ€๋กœ ์ด์šฉํ•จ
  2. Caller์—์„œ ์ธ์ž ์ „๋‹ฌ์— ์‚ฌ์šฉ๋œ ์Šคํƒ์„ ์ •๋ฆฌ
  3. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ 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 ์ผ๋ฐ˜ ํ•จ์ˆ˜

 

๋ฌธ์ œ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋„ˆ๋ฌด ๊ธฐ์ดˆ ๊ทธ๋Œ€๋กœ ๋‚˜์™€์„œ ๋”ฑํžˆ.. ์„ค๋ช…ํ•  ๋ถ€๋ถ„์ด ์—†๊ธฐ์— ๋„˜์–ด๊ฐˆ๊ป˜์š”


์ฐธ๊ณ  ์ž๋ฃŒ

 

Background: Calling Convention

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทœ์•ฝ์˜ ๊ฐœ๋…์„ ์‚ดํŽด๋ณด๊ณ , ๋ฆฌ๋ˆ…์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ˜ธ์ถœ ๊ทœ์•ฝ๋“ค์„ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ถ„์„ํ•ด๋ด…๋‹ˆ๋‹ค.

dreamhack.io

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

Background: Calling Convention

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทœ์•ฝ์˜ ๊ฐœ๋…์„ ์‚ดํŽด๋ณด๊ณ , ๋ฆฌ๋ˆ…์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ˜ธ์ถœ ๊ทœ์•ฝ๋“ค์„ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ถ„์„ํ•ด๋ด…๋‹ˆ๋‹ค.

dreamhack.io