๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ง ๋ฆฌ๋ฒ„์‹ฑ

๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง: ์–ด์…ˆ๋ธ”๋ฆฌ (ํ•จ์ˆ˜)

by ๋ถˆํƒ€๋Š” ์ฐธ์ƒˆ 2023. 8. 3.

๊นŒ๋ง‰๋ˆˆ์ด๋‹ค.ใ‚ท

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋ฆฌ๋ฒ„์‹ฑ์— ํ•„์š”ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ๋‚ด์šฉ ์ค‘ ํ•จ์ˆ˜ ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ๊ณ ์ž ํ•œ๋‹ค.

'๊ฐ•๋ณ‘ํƒใ€Ž๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ”์ด๋ธ”ใ€, ์œ„ํ‚ค๋ถ์Šค, 2014, 1p-127p.'์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.

 

ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

ํ•จ์ˆ˜์˜ ์‹œ์ž‘

push ebp
mov ebp, esp

 

ebp๋Š” ์Šคํƒ ๋ฒ ์ด์Šค ํฌ์ธํ„ฐ๋‹ค.

push ebp๋Š” ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ฒ ์ด์Šค ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฒ ์ด์Šค ํฌ์ธํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•œ ๋’ค, mov ebp, esp๋ฅผ ํ†ตํ•ด ์Šคํƒ ํฌ์ธํ„ฐ์ธ esp๋ฅผ ebp๋กœ ๋ฐ”๊พผ๋‹ค.

์ƒˆ๋กœ์šด ํฌ์ธํ„ฐ๋ฅผ ๋ฒ ์ด์Šค๋กœ ์žก๋Š”๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

* ํ•จ์ˆ˜์˜ ์‹œ์ž‘๊ณผ ๋ ์ค‘๊ฐ„์— rsp๋กœ ํ• ๋‹น๋œ ๋ฐ”์ดํŠธ๋งŒํผ์˜ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ๋‹ค.

ex:) 'sub rsp, 0x100'

 

ํ•จ์ˆ˜์˜ ๋

mov esp, ebp
pop ebp

ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ์Šคํƒ ์œ„์น˜๋ฅผ ์›๋ž˜๋Œ€๋กœ ๋Œ๋ ค๋†“์•„์•ผ ํ•œ๋‹ค.

์Šคํƒ ํฌ์ธํ„ฐ๋ฅผ mov esp, ebp๋กœ ๋Œ๋ ค๋†“๊ณ , pop ebp๋กœ ์Šคํƒ์—์„œ ebp๋ฅผ ๋นผ๋‚ธ๋‹ค.

 

 

ํ•จ์ˆ˜์™€ ์Šคํƒํ”„๋ ˆ์ž„

 ์•„๋ž˜์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํฌํ•จ๋˜๋Š” C์–ธ์–ด ์ฝ”๋“œ๋‹ค.

#include<stdio.h>

int sum(int a, int b) {
	return a+b;
}

int main(void) {
	int c = sum(1, 2);
    return c;
}

ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๋Š” main ํ•จ์ˆ˜์ด๋ฉฐ caller๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋Š” sum() ํ•จ์ˆ˜์ด๋ฉฐ callee๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋กœ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ์Šคํƒ์—์„œ๋Š” ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „ํ›„๋กœ ๋‚˜๋ˆ„์–ด ์‚ดํŽด๋ณด๋ฉด,

 

ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „: main() ์ดˆ๋ฐ˜์˜ ์Šคํƒ

caller ํ•จ์ˆ˜์˜ ๋ฒ„ํผ
main ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜, ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” 'c'
RBP: caller ํ•จ์ˆ˜์˜ ์Šคํƒ์ด ์Œ“์ด๊ธฐ ์‹œ์ž‘ํ•˜๋Š” Base Pointer, (์—ฌ๊ธฐ๋ถ€ํ„ฐ ์Šคํƒ์ด ์Œ“์ผ ๊ฒƒ์ด๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• )
RET: caller ํ•จ์ˆ˜์˜ Return Address, main()์ด ๋๋‚ฌ์„ ๋•Œ ๋Œ์•„๊ฐˆ ์œ„์น˜

 

์™ผ์ชฝ ๊ทธ๋ฆผ์€ main() ์ดˆ๋ฐ˜์˜ ์Šคํƒํ”„๋ ˆ์ž„์„

์ด๋ฏธ์ง€ํ™”ํ•˜์—ฌ ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ฆผ์ด๋‹ค.

ํ•จ์ˆ˜์˜ ์‹œ์ž‘ ๋‹จ๊ณ„์—์„œ RBP์™€ RSP๊ฐ€

๋™์ผํ•œ ์œ„์น˜๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

RSP์—์„œ 16์ด ๋น ์ ธ์„œ 16๋งŒํผ์˜ ๊ณต๊ฐ„์ด ์ƒ๊ธด๋‹ค.

์ฐธ๊ณ ๋กœ, ESI๋Š” 32๋น„ํŠธ์งœ๋ฆฌ RSI, 

EDI๋Š” 32๋น„ํŠธ์งœ๋ฆฌ RDI์ด๋‹ค.

 

 

 

 

 

ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„: sum() (ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜) ์ดˆ๋ฐ˜์˜ ์Šคํƒ

์•„๋ž˜ ํ‘œ์—์„œ ๋ฐ‘์ค„ ์ณ์ง„ ๋ถ€๋ถ„์ด ์Šคํƒ ์ค‘ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ถ”๊ฐ€๋กœ ์ƒ๊ฒจ๋‚œ ๋ถ€๋ถ„์ด๋‹ค.

callee ํ•จ์ˆ˜์˜ ๋ฒ„ํผ
RBP: callee ํ•จ์ˆ˜์˜ Base Pointer
RET: callee ํ•จ์ˆ˜์˜ return address
callee ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” y
callee ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” x
caller ํ•จ์ˆ˜์˜ ๋ฒ„ํผ 
main ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜
RPB: caller ํ•จ์ˆ˜์˜ ์Šคํƒ์ด ์Œ“์ด๊ธฐ ์‹œ์ž‘ํ•˜๋Š” Base Pointer, ์—ฌ๊ธฐ๋ถ€ํ„ฐ ์Šคํƒ์ด ์Œ“์ผ ๊ฒƒ์ด๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• 
RET: caller ํ•จ์ˆ˜์˜ Return Address, ๋ฉ”์ธ์ด ๋๋‚ฌ์„ ๋•Œ ๋Œ์•„๊ฐˆ ์œ„์น˜

 

๊ทธ๋ฆผ์—์„œ ๋งจ ์œ„์˜ 1, 2 ๋ถ€๋ถ„์„ ๋ณด๋ฉด

๋จผ์ € ๊ฐ’ 1๊ณผ 2๋ฅผ

EDI, ESI ๋ ˆ์ง€์Šคํ„ฐ์— ๋„ฃ๊ณ 

EDX, EAX ๋ ˆ์ง€์Šคํ„ฐ์—๋„

1๊ณผ 2๋ฅผ ๋„ฃ์€ ๋’ค

๊ณ„์‚ฐํ•ด์„œ 3์ด๋ผ๋Š” ๋ฐ˜ํ™˜๊ฐ’์„

EAX์— ์ €์žฅํ•ด

EAX์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ดํ›„ RBP ๊ฐ’์„ ๋นผ๋‚ด์„œ RET(Return Address)๋กœ ๋Œ์•„๊ฐ„๋‹ค.

 

 

 

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: ๋™๋นˆ. “์‹œ์Šคํ…œ ํ•ดํ‚น ๊ฐ•์ขŒ 4๊ฐ• - ๋ ˆ์ง€์Šคํ„ฐ์˜ ์šฉ๋„์™€ ์‹œ์Šคํ…œ ์ฝœ ์ดํ•ดํ•˜๊ธฐ (System Hacking Tutorial 2017 #4)” 2017. Video. https://www.youtube.com/watch?v=PsXXjNL_ogc.