๐Ÿ“Œ ๋ถ„์„ ์‹ค์Šต ๋ณด๊ณ ์„œ ์ž‘์„ฑ

  1. ๋ฉ”์ธํ•จ์ˆ˜ ์ฐพ๊ธฐ
  2. ์„œ๋ธŒํ•จ์ˆ˜ ์ฐพ๊ธฐ
  3. ๋ ˆ์ง€์Šคํ„ฐ(EAX, EIP) ๋ณ€๊ฒฝ ํ™•์ธ
  4. ์Šคํƒ(RETURN์ฃผ์†Œ ๋“ฑ) ๋ณ€๊ฒฝ ํ™•์ธ

 

 ๐Ÿ“Œ ์†Œ์Šค ์ฝ”๋“œ ๋ฐ ๋ถ„์„ ๋ฐฉ๋ฒ• ์„ค๋ช…

์†Œ์Šค ์ฝ”๋“œ: sum.c

#include <stdio.h>

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

int minus(int a, int b) {
	return a - b;
}

int main() {
	int x = 9;
    int y = 7;
    printf("sum: %d \n", sum(x, y));
    printf("minus: %d \n", minus(x, y));
}

sum.c๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ ์ดํ›„ sum.exe๋ฅผ Immunity Debugger์—์„œ ์‹คํ–‰ ์‹œํ‚ต๋‹ˆ๋‹ค.

 

 

 1๏ธโƒฃ ๋ฉ”์ธํ•จ์ˆ˜ ์ฐพ๊ธฐ

์ฒ˜์Œ sum.exe ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ด๋Ÿฐ ํ™”๋ฉด์ด ๋œฌ๋‹ค.

step over(F8)๋กœ ๋„˜์–ด๊ฐ€๋‹ค ๋ณด๋ฉด 4๋ฒˆ์งธ ์ค„์˜ CALL sum.00401000์„ ๋งŒ๋‚œ ํ›„

ํ„ฐ๋ฏธ๋„์— ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ณ  ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.

๊ทธ๋Ÿผ CALL sum.00401000์— break point๋ฅผ ๊ฑธ๊ณ  ์žฌ์‹œ์ž‘(ctrl+F2) ํ›„

ํ•ด๋‹น ๋ช…๋ น์–ด์—์„œ step into(F7)์„ ํ•ด์„œ ํ•ด๋‹น ํ•จ์ˆ˜ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค. ์—ฌ๊ธฐ์„œ main ํ•จ์ˆ˜๋กœ ์ถ”์ •๋˜๋Š” ๋ช…๋ น์—์„œ step over๋ฅผ ํ•˜๋ฉด์„œ ํ„ฐ๋ฏธ๋„์— ๊ฐ’์ด ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

์ด ๋‘ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด๋„ ํ„ฐ๋ฏธ๋„์— ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค์ง€ ์•Š์œผ๋‹ˆ main ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Step over๋กœ ๋„˜์–ด๊ฐ€๋‹ค๊ฐ€ CALL sum.00401368์„ ๋งŒ๋‚˜ ์‹คํ–‰ํ•˜๋ฉด

ํ„ฐ๋ฏธ๋„์— ๊ฒฐ๊ณผ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ sum.00401368์ด main ํ•จ์ˆ˜์ด๋‹ค.
ํ•ด๋‹น ๋ช…๋ น์–ด์— break point๋ฅผ ๊ฑธ๊ณ  ์žฌ์‹œ์ž‘ ํ›„ step into(F7)์„ ํ•ด์„œ main ํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

 

 

 2๏ธโƒฃ ๋ฉ”์ธ ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„ ์Šคํƒ, ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’ ํ™•์ธ

Main ํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๋จผ์ € returnํ•ด์•ผํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ์Œ“๊ณ  ์ฒ˜์Œ์— ์›๋ž˜์˜ EBP๊ฐ’์„ ์Šคํƒ์— pushํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์›๋ž˜์˜ ESP๊ฐ’์„ ์ƒˆ๋กญ๊ฒŒ EBP๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.

์ด EBP๊ฐ’์€ ํ•ด๋‹น ํ•จ์ˆ˜๋งŒ์˜ EBP๊ฐ’์ด๋‹ค. ์ดํ›„ EBP๊ฐ’์„ 16์ง„์ˆ˜ 20๋งŒํผ ๋Š˜๋ ค ๋†“๋Š”๋‹ค.

์ด๋Š” ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•ด ๋†“๋Š” ๊ณณ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์‹ค์ œ๋กœ immunity debugger์—์„œ ๋ณด์ž๋ฉด

์•„๊นŒ mainํ•จ์ˆ˜ ๋‹ค์Œ ๋ช…๋ น์–ด ์ฃผ์†Œ์ธ 004010FD๊ฐ€ main ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์ž ๋งˆ์ž ์Šคํƒ์— ์Œ“์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ 6, 7๋ฒˆ์งธ ์ค„์„ ์‹คํ–‰์‹œํ‚ค๋ฉด int x = 9, int y = 7์ธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค.

๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์€ ๋ช…๋ น์–ด์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ์Šคํƒ์— 9, 7 ์ˆœ์œผ๋กœ ์Œ“์˜€๋Š”๋ฐ ์Šคํƒ์€ LIFO ๊ตฌ์กฐ์ด๋ฏ€๋กœ 7์ด ๋จผ์ € EAX์— ๋“ค์–ด๊ฐ„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

EIP๊ฐ’์€ ๋Š˜ ๋ฐ”๋กœ ์ดํ›„์— ์‹คํ–‰ํ•  ๋ช…๋ น์–ด ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

 

 

 3๏ธโƒฃ ์„œ๋ธŒ  ํ•จ์ˆ˜ ์ฐพ๊ธฐ (sum, minus)

์„œ๋ธŒ ํ•จ์ˆ˜๋„ ๋ฉ”์ธ ํ•จ์ˆ˜ ์ฐพ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํ„ฐ๋ฏธ๋„์„ ํ™•์ธํ•˜๋ฉฐ ์ง„ํ–‰ํ•œ๋‹ค.

์„œ๋ธŒ ํ•จ์ˆ˜(sum, minus) ์ฐพ๋Š” ๊ฒƒ์€ ๋น„๊ต์  ์‰ฌ์› ๋Š”๋ฐ, ์˜ค๋ฅธ์ชฝ์— ๋ณด๋ฉด ํ”„๋ฆฐํŠธ๋ฌธ์ด ๋‚˜์™€์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ญ์‹œ๋‚˜ ํ•ด๋‹น ์ฝ”๋“œ๊นŒ์ง€ ์‹คํ–‰ํ•ด๋ณด๋‹ˆ ํ„ฐ๋ฏธ๋„์— sum()๊ณผ minus() ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์™”๋‹ค.

์„œ๋ธŒ ํ•จ์ˆ˜์ธ sum(), minus()์—๋„ breakpoint๋ฅผ ๊ฑธ๊ณ  step into(F7)๋กœ ๋ ˆ์ง€์Šคํ„ฐ์™€ ์Šคํƒ์˜ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•ด๋ณด๋„๋ก ํ•œ๋‹ค.

 

 

4๏ธโƒฃ ์„œ๋ธŒ ํ•จ์ˆ˜์˜ ๋ ˆ์ง€์Šคํ„ฐ ์Šคํƒ ๊ฐ’ ํ™•์ธ

๋จผ์ € sum() ํ•จ์ˆ˜์—์„œ step into(F7)๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ์ผ๋‹จ ๋Œ์•„ ๊ฐ€์•ผ ํ•  ๋ฆฌํ„ด ์ฃผ์†Œ ๊ฐ’์„ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

์ดํ›„ mainํ•จ์ˆ˜ ์‹คํ–‰ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด ์›๋ž˜์˜ EBP๊ฐ’์€ ์Šคํƒ์œผ๋กœ, ์›๋ž˜์˜ ESP๊ฐ’์„ ์ƒˆ๋กœ์šด EBP๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

sumํ•จ์ˆ˜๋ฅผ ์‹ค์ œ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ถ€๋ถ„์€ 5๋ฒˆ์งธ ์ค„์ด๋‹ค. ๊ทธ ์ „์— EDX์— 9๋ฅผ, EAX์— 7์„ ๋„ฃ๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.

์ด๊ฒƒ์€ 4๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์‹คํ–‰์‹œํ‚จ ํ›„์˜ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์ด๋‹ค.

5๋ฒˆ์งธ ์ค„์„ ์‹คํ–‰ํ•˜๋ฉด EAX, EDX๋ฅผ ๋”ํ•ด ๋‹ค์‹œ EAX์— ์ €์žฅํ•œ๋‹ค.

EIP๊ฐ’์€ ์—ฌ์ „ํžˆ ๋Š˜ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง์•„์•ผํ•  ์ ์€ ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์Œ์— ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

์ด๋ ‡๊ฒŒ 0030125B POP EBP๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฐ‘์— ์ค„์— ํŒŒ๋ž€ ์ค„์ด ์ƒ๊ธฐ๊ณ 

๋ ˆ์ง€์Šคํ„ฐ์—๋Š” ์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค.

EIP๊ฐ’์ด ํŒŒ๋ž€ ์ค„ ์ฃผ์†Œ์™€ ๊ฐ™์œผ๋ฏ€๋กœ ํ˜ผ๋ž€์ด ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ ์„ ์œ ์˜ํ•œ๋‹ค.

sum()์—์„œ RETN์„ ๋งŒ๋‚˜์„œ ๋‚˜์˜จ ํ›„ print๋ฌธ์„ ๋งŒ๋‚˜๋ฉด ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ๋œ๋‹ค.

 

minusํ•จ์ˆ˜๋„ sumํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜๊ฒŒ ์ž‘์šฉํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ minus()ํ•จ์ˆ˜์ธ CALL sum.0040135D์—์„œ step into(F7)์„ ํ•œ๋‹ค.

sum()๊ณผ์˜ ์ฐจ์ด์ ์€ EDX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ๋ณด๋ฉด

์ด๋Ÿฐ ์‹์œผ๋กœ ํ•ด๋‹น ๋ช…๋ น์–ด์— ๋”ฐ๋ผ ESP, EBP, EAX๊ฐ€ ๋ณ€ํ™”ํ•˜๊ณ  EIP๋Š” ๋‹ค์Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋กœ ๊ณ„์† ๋ฐ”๋€๋‹ค.

์Šคํƒ ๊ฐ’์€ sum๊ณผ ๋˜‘๊ฐ™์ด ์ž‘์šฉํ•œ๋‹ค. ํ•˜๋‚˜๋งŒ ๋ณด์ž๋ฉด

์ฒ˜์Œ minus ์‹คํ–‰ํ•˜๋ฉด ๋ฆฌํ„ด ๊ฐ’์ด ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค.

๋ฆฌํ„ด ํ›„ print๋ฌธ์„ ๋งŒ๋‚˜๋ฉด ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ๋œ๋‹ค.

์ดํ›„ step over(F8)๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ExitProcess๋ฅผ ๋งŒ๋‚˜๋ฉด ์ข…๋ฃŒ๋œ๋‹ค.

 

 ๐Ÿ“Œ ๋Š๋‚€ ์ 

 ์ž๋ฃŒ๊ตฌ์กฐ ๋•Œ ๋ฐฐ์› ๋˜ ์Šคํƒ์˜ ํŠน์ง•์„ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ํ†ตํ•ด ์‹ค์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์‹คํ–‰ ํŒŒ์ผ์ด๋‹ค ๋ณด๋‹ˆ ์ด๋ฏธ ์‹คํ–‰ํ•œ ์ฝ”๋“œ ํ•œ ์ค„์„ ๋‹ค์‹œ ๋˜๋Œ๋ฆด ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๋‹ค์‹œ ์žฌ์‹œ์ž‘ ํ›„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ด์•ผํ•ด์„œ ๊ท€์ฐฎ์•˜๋‹ค ,,

Immunity Debugger๋„ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ, ํŒŒ๋ž€ ์ค„๋กœ ๋œจ๋Š” ๊ฒƒ์ด ํ˜„์žฌ ์‹คํ–‰ํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค์Œ ์‹คํ–‰ํ•  ์ฝ”๋“œ์ธ ๊ฒŒ ์ƒ๋‹นํžˆ ํ—ท๊ฐˆ๋ ธ๋‹ค. ์ด๋Ÿด ๋• EIP๋ฅผ ๊ผญ ์ฐธ๊ณ ํ•˜๋Š” ๊ฑธ๋กœ !

+ Recent posts