Study/Reversing

๋ฆฌํ‹€์—”๋””์–ธ ํ‘œ๊ธฐ๋ฒ• / ๋ ˆ์ง€์Šคํ„ฐ / ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด / ์Šคํƒ ํ”„๋ ˆ์ž„

mnzy๐ŸŒฑ 2022. 9. 26. 05:17

1. ๋ฆฌํ‹€์—”๋””์–ธ ํ‘œ๊ธฐ๋ฒ•

(1) ๋ฐ”์ดํŠธ ์˜ค๋”๋ง

  • ์ปดํ“จํ„ฐ์—์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹
  • ๋น… ์—”๋””์–ธ(Big Endian)๊ณผ ๋ฆฌํ‹€ ์—”๋””์–ธ(Little Endian) ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌ
  • ๋น…์—”๋””์–ธ - ์ˆœ์„œ๋Œ€๋กœ ํ‘œ๊ธฐ
  • ๋ฆฌํ‹€ ์—”๋””์–ธ - ์—ญ์ˆœ์œผ๋กœ ํ‘œ๊ธฐ
    • intel x86 CPU(Windows ๊ณ„์—ด)์ด ์‚ฌ์šฉ
BYTE b = 0x12;  //0x.. -> 16์ง„์ˆ˜
WORD w = 0x1234;
DWORD dw = 0x12345678;
char str[] = "abcde";
Type Name Size ๋น… ์—”๋””์–ธ ๋ฆฌํ‹€ ์—”๋””์–ธ
BYTE b 1 [12] [12]
WORD w 2 [12][34] [34][12]
DWORD dw 4 [12][34][56][78] [78][56][34][12]
char [] str 6 [61][62][63][64][65][00] [61][62][63][64][65][00]

 

์•„์Šคํ‚ค ๋ฌธ์ž์—์„œ 'a'๋Š” 0x61๊ณผ ๊ฐ™๊ณ , ๋ฌธ์ž์—ด์˜ ๋งˆ์ง€๋ง‰์€ null๋กœ ๋๋‚œ๋‹ค. 

(2) ๋””๋ฒ„๊น…ํ•˜์—ฌ ํ™•์ธํ•˜๊ธฐ 

#include "windows.h"

BYTE b = 0x12;
WORD w = 0x1234;
DWORD dw = 0x12345678;
char str[] = "abcde";

int main(int argc, char *argv[]) {
	BYTE Ib = b;
	WORD Iw = w;
	DWORD Idw = dw;
	char  *Istr = str;
   
	return 0;
}

 

 

- main() ํ™•์ธ

exit ์ง์ „์˜ call์ด main์ธ ํ™•๋ฅ ์ด ๋†’์Œ

main()ํ•จ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์‰ฝ๊ฒŒ ์ฝ”๋”ฉํ•˜๋ ค๋ฉด printf ๋“ฑ์„ ๋„ฃ์œผ๋ฉด ์ข‹์Œ

  • ์‹คํ–‰ํ•ด๋ณด์•˜์„ ๋•Œ exit ๋œจ๊ธฐ ์ „์˜ call์„ ๋“ค์–ด๊ฐ€๋ณด๋ฉด, ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์ด ๋ณด์ธ๋‹ค.

 

- ๋ฐ”์ดํŠธ์˜ค๋”๋ง ํ™•์ธ

  • 403018 ํ™•์ธ (BYTE)
    • ๋ฐ”์ดํŠธ ํƒ€์ž…์˜ b ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•  ๋•Œ์—๋Š” ์ž…๋ ฅํ•œ ๊ทธ๋Œ€๋กœ ์ €์žฅ์ด ๋จ 

 

  • 403020 ํ™•์ธ (WORD)
    • 2๋ฐ”์ดํŠธ ์ด์ƒ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ ์ž๋ฃŒํ˜•์„ ์ €์žฅํ•  ๋•Œ๋ถ€ํ„ฐ ๋ฆฌํ‹€ ์—”๋””์•ˆ ํ™•์ธ ๊ฐ€๋Šฅ  
    • 12 34๊ฐ€ ์•„๋‹Œ ๋ฆฌํ‹€ ์—”๋””์•ˆ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ญ์ˆœ์œผ๋กœ 34 12๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ์ด ๋˜์–ด์žˆ๋‹ค.
    • ๋ฆฌํ‹€ ์—”๋””์–ธ์ด๋ผ๋„ ๋ฐ”์ดํŠธ ์ž์ฒด๋Š” ์ •์ƒ์ ์ธ ์ˆœ์„œ๋กœ ์ €์žฅ๋œ๋‹ค. ์˜ค๋กœ์ง€ ๋ฉ€ํ‹ฐ ๋ฐ”์ดํŠธ ๊ฐ™์€ ๊ฒฝ์šฐ ๊ฐ ๋ฐ”์ดํŠธ๊ฐ€ ์—ญ์ˆœ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

  • 40301c ํ™•์ธ (DWORD)
    • DWORD ๋˜ํ•œ ๋ฆฌํ‹€ ์—”๋””์•ˆ ๋ฐฉ์‹์œผ๋กœ 78 56 34 12๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

 

  • 403024 ํ™•์ธ (char)
    • abcde๋Š” char์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ‹€์—”๋””์•ˆ๊ณผ ๋น…์—”๋””์•ˆ ๋ฐฉ์‹์˜ ์ˆœ์„œ๊ฐ€ ๋˜‘๊ฐ™๋‹ค.
    • ๋ฌธ์ž์—ด์€ ๊ฒฐ๊ตญ ์บ๋ฆญํ„ฐ(char)์˜ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋ฐ”์ดํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ์—ฐ์†ํ•ด์„œ ์ €์žฅํ•˜๋Š” ๊ฐœ๋…


2. ๋ ˆ์ง€์Šคํ„ฐ 

https://en.wikibooks.org/wiki/A-level_Computing/OCR/Unit_1.1.1_Structure_and_Function_of_the_Processor

 

- CPU ๋ ˆ์ง€์Šคํ„ฐ: CPU ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ๋‹ค๋ชฉ์  ์ €์žฅ ๊ณต๊ฐ„

  • CPU๊ฐ€ RAM์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ์—‘์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌผ๋ฆฌ์ ์ธ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ
  • ๋”ฐ๋ผ์„œ, CPU์— ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ
  • ๋ ˆ์ง€์Šคํ„ฐ 'CPU๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜' ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.

IA-32์˜ ๋ ˆ์ง€์Šคํ„ฐ

๊ฐ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ 32๋น„ํŠธ์ด์ง€๋งŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐœ์˜ ๊ตฌํš์œผ๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด 32๋น„ํŠธ์ธ EAX๋Š” ์ค‘ 16๋น„ํŠธ๋งŒ ํ•„์š”ํ•  ๋–„ ํ•˜์œ„ 16๋น„ํŠธ์ธ AX๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

AX๋Š” ๋˜ ์ƒ์œ„ 8๋น„ํŠธ AH์™€ ํ•˜์œ„ 8๋น„ํŠธ AL๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 8๋น„ํŠธ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- Basic program execution registers

  • ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ(General Purpose) : ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋จ
    • ํฌ๊ธฐ: 32๋น„ํŠธ (4๋ฐ”์ดํŠธ)  
      • ์ฃผ๋กœ ์‚ฐ์ˆ ์—ฐ์‚ฐ ๋“ฑ์˜ ๋ช…๋ น์–ด์—์„œ ์ƒ์ˆ˜/๋ณ€์ˆ˜ ๊ฐ’์˜ ์ €์žฅ์šฉ๋„๋กœ ์‚ฌ์šฉ
      • ์–ด๋–ค ๋ช…๋ น์–ด๋“ค์€ ํŠน์ • ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ธฐ๋„ ํ•จ (MUL, DIV ๋“ฑ) 
        • EAX (Extended Accumlator Regiser):  ์ฃผ๋กœ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋จ(ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋ฆฌํ„ด๊ฐ’์„ ์ „๋‹ฌํ•ด์คŒ)
          • ๋ฐ˜๋ณต๋ฌธ ๋ช…๋ น์–ด(๋ฃจํ”„)์—์„œ ๋ฐ˜๋ณต ์นด์šดํŠธ๋กœ ์‚ฌ์šฉ๋จ //๋ฐ˜๋ณต์„ ๋Œ ๋•Œ๋งˆ๋‹ค ECX๋ฅผ 1์”ฉ ๊ฐ์†Œ์‹œํ‚ด 
          • ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ํ”ํžˆ ์“ฐ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๊ณ , ์‚ฌ์น™์—ฐ์‚ฐ ๋“ฑ์— ์ž์ฃผ ๋“ฑ์žฅํ•œ๋‹ค
          • ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์ด๋‚˜ return100, return Fa-lse ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ return ๋’ค์˜ ๊ฐ’์ด EAX์— ๊ธฐ๋ก๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
        • ECX (Extended Count Register): ๋ฃจํ”„๋ฌธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์นด์šดํŒ…ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค
          • for (int i; i < 10; i++) { .. } ์˜ i ์—ญํ• ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ž
          • C/C++์—์„œ๋Š” ๋ณดํ†ต 0๋ถ€ํ„ฐ ํŠน์ • ์กฐ๊ฑด์œผ๋กœ ๋ฃจํ”„๋ฅผ ๋Œ๋ฆฌ์ง€๋งŒ, ECX๋Š” ๋ฐ˜๋Œ€๋กœ ๋ฏธ๋ฆฌ ๋ฃจํ”„๋ฅผ ๋Œ ๊ฐ’์„ ์ •ํ•ด๋‘๊ณ  0๊นŒ์ง€ i-- ์ฒ˜๋Ÿผ ์—ฐ์‚ฐํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค. 
          • ์นด์šดํŒ… ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ๋Š” ์ผ๋ฐ˜ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค
        • EDX (Extended Data Register): ์ผ๋ฐ˜ ์ž๋ฃŒ ์ €์žฅ (์ž…์ถœ๋ ฅ ๋™์ž‘์— ์‚ฌ์šฉ)
          • ์–˜๋„ EAX์ฒ˜๋Ÿผ ๋ณ€์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฌ์›€
          • EAX์™€ ์—ญํ•  ๊ฑฐ์˜ ๊ฐ™์ง€๋งŒ, ๋ฆฌํ„ด๊ฐ’์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉX
          • ๊ณฑํ•˜๊ฑฐ๋‚˜ ๋”ํ•  ๋•Œ ๋“ฑ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ ๋ค์œผ๋กœ ์“ฐ์ด๊ธฐ๋„ ํ•œ๋‹ค
        • EBX (Extended Base Register): ๋ฒ ์ด์Šค ๋ ˆ์ง€์Šคํ„ฐ, ํŠน์ • ์ฃผ์†Œ ์ €์žฅ
          • ๋ณ„๊ฑฐ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ
          • ์–ด๋–ค ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค์–ด์ง„ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์•„๋‹˜ 
          • ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ํ•˜๋‚˜ ๋” ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฐ„์ด ํ•„์š”ํ•  ๋•Œ ์ ๋‹นํ•œ ์šฉ๋„๋ฅผ ์•Œ์•„์„œ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค
          • EAX, EDX, ECX๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•จ 
  • ์ธ๋ฑ์Šค ๋ ˆ์ง€์Šคํ„ฐ
    • ํฌ๊ธฐ: 32๋น„ํŠธ(4๋ฐ”์ดํŠธ)  
    • ESI (Extended Source Index): ์ถœ๋ฐœ์ง€ ์ธ๋ฑ์Šค (์ถœ๋ฐœ์ง€ ์ฃผ์†Œ์— ๋Œ€ํ•œ ๊ฐ’ ์ €์žฅ)
    • EDI  (Extended Destination Index): ๋ชฉ์ ์ง€ ์ธ๋ฑ์Šค (๋ชฉ์ ์ง€ ์ฃผ์†Œ์— ๋Œ€ํ•œ ๊ฐ’ ์ €์žฅ)
      • ๋ฌธ์ž์—ด์ด๋‚˜ ๊ฐ์ข… ๋ฐ˜๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ฎ๊ธฐ๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค 
  • ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ(Pointer Register)
    • ํฌ๊ธฐ: 32๋น„ํŠธ(4๋ฐ”์ดํŠธ) 
    • ์Šคํƒ์€ ๋†’์€ ์ฃผ์†Œ ๋ถ€ํ„ฐ ๋‚ฎ์€ ์ฃผ์†Œ๋กœ ์“ฐ์—ฌ์ง€๋Š” ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค. (์ฆ‰ ๋†’์€ ์ฃผ์†Œ์— ๋จผ์ € ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.)
    • EBP (Extended Base Pointer): ํ˜„์žฌ ์Šคํƒ์˜ ๊ฐ€์žฅ ๋‚ฎ์€ ์œ„์น˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ํฌ์ธํ„ฐ
    • ESP (Extended Stack Pointer): ํ˜„์žฌ ์Šคํƒ์˜ ๊ฐ€์žฅ ๋†’์€ ์œ„์น˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ํฌ์ธํ„ฐ
      • ์–ด๋–ค ๋ช…๋ น์–ด๋“ค์€ ESP๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ธฐ๋„ ํ•จ 
      • ESP๋Š” ๋งค์šฐ ์ค‘์š”ํ•˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ
      • ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฐ€์žฅ ๋†’์€ ์œ„์น˜๊ฐ€ ํฐ ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜ (๊ฐ€์žฅ ๋†’์€ ์œ„์น˜๋Š” ์˜คํžˆ๋ ค ์ž‘์€ ์ฃผ์†Œ ์ผ ๊ฒƒ)
        https://velog.io/@ilhoon93
    • EIP (Extended Instructure Pointer): ๋‹ค์Œ์— ์ˆ˜ํ–‰ํ•  ๋ช…๋ น์˜ ์ฃผ์†Œ ์ €์žฅ  
      • CPU๋Š” EIP์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚œ ํ›„ ์ž๋™์œผ๋กœ ๊ทธ ๋ช…๋ น์–ด ๊ธธ์ด๋งŒํผ EIP๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. 
      • ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ EIP๋Š” ๊ทธ ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ๋˜์–ด์žˆ์–ด์„œ ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ๊ฐ„์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ 
        • ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด JMP, CALL ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐ๋ŸฝํŠธ, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•ด์•ผ ํ•จ
  •  ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ
    • 16๋น„ํŠธ (2๋ฐ”์ดํŠธ)  
      • ์„ธ๊ทธ๋จผํŠธ: IA-32์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ชจ๋ธ์—์„œ ๋‚˜์˜ค๋Š” ์šฉ์–ด
        • IA-32 ๋ณดํ˜ธ ๋ชจ๋“œ์—์„œ ์„ธ๊ทธ๋จผํŠธ๋ž€, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์กฐ๊ฐ๋‚ด์–ด ๊ฐ ์กฐ๊ฐ๋งˆ๋‹ค ์‹œ์ž‘ ์ฃผ์†Œ, ๋ฒ”์œ„, ์ ‘๊ทผ ์ œํ•œ ๋“ฑ์„ ๋ถ€์—ฌํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•จ 
        • ์„ธ๊ทธ๋จผํŠธ๋Š” ํŽ˜์ด์ง• ๊ธฐ๋ฒ•๊ณผ ํ•จ๊ป˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ๋จ
        • ์„ธ๊ทธ๋จผํŠธ ๋ฉ”๋ชจ๋ฆฌ๋Š” SDT๋ผ๊ณ  ํ•˜๋Š” ๊ณณ์— ๊ธฐ์ˆ ๋˜์–ด์žˆ๋Š”๋ฐ, ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋ฐ”๋กœ ์ด SDT์˜ index๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
        • CS, SS. DS, ES, FS, GS
  • EFLAGS: ํ”Œ๋ž˜๊ทธ ๋ ˆ์ง€์Šคํ„ฐ
    • ํฌ๊ธฐ: 32๋น„ํŠธ(4๋ฐ”์ดํŠธ)
    •  ๊ฐ ๋น„ํŠธ๋Š” 1 ๋˜๋Š” 0์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” On/Off ๋˜๋Š” True/False ๋ฅผ ์˜๋ฏธํ•จ
      • Zero Flag(ZF): ์—ฐ์‚ฐ ๋ช…๋ น ํ›„์— ๊ฒฐ๊ณผ๊ฐ’์ด 0์ด ๋˜๋ฉด, ZF๊ฐ€ 1(True)๋กœ ์„ธํŒ…๋จ
      • Overflow FLag(OF): ๋ณดํ˜ธ ์žˆ๋Š” ์ˆ˜์˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ 1๋กœ ์„ธํŒ…๋จ. ๊ทธ๋ฆฌ๊ณ  MSB(Most Significant Bit)๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋–„ 1๋กœ ์„ธํŒ…๋จ
      • Carry Flag(CF): Unsigned integer ์˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ 1๋กœ ์„ธํŒ… 

3. ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด

(1) ๊ตฌ๋ฌธ

  intel AT&T
๋ ˆ์ง€์Šคํ„ฐ ํ‘œํ˜„ EAX %eax
๊ฐ’์˜ ํ‘œํ˜„ AABBCCDDh ๋˜๋Š” 
0xAABBCCDD
%0xAABBCCDD
๋ช…๋ น์–ด ํฌ๊ธฐ ํ‘œํ˜„ MOV movl (longํ˜•)
movb (byteํ˜•)
๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ [์ฃผ์†Œ] (์ฃผ์†Œ)
์˜คํผ๋žœ๋“œ ๋ฐฉํ–ฅ  ๋ชฉ์ ์ง€(dst) <- ์†Œ์Šค(src) ์†Œ์Šค(src) -> ๋ชฉ์ ์ง€(dst)

 

(2) ๋ฐ์ดํ„ฐ ์ด๋™ ๋ช…๋ น์–ด

  • MOV dst, src : ๋ชฉ์ ์ง€๋กœ ๊ฐ’์„ ์ €์žฅ //๋’ค์˜ ๊ฐ’(src)์„ dst์— ์ €์žฅ 
    • MOV eax, ebx : EBX์˜ ๊ฐ’์„ EAX์— ๋ณต์‚ฌํ•˜์—ฌ ์ €์žฅ
    • MOV eax, 0x42 : 0x42(16์ง„์ˆ˜)๋ฅผ EAX์— ์ €์žฅ 
    • MOV eax, [ebx]  : ์ฃผ์†Œ[ebx]์— ์žˆ๋Š” ๊ฐ’์„ eax์— ์ €์žฅ 
  • LEA dst, src : ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ชฉ์ ์ง€์— ์ €์žฅ 
    • LEA EAX, [EBX+8] : EBX์— 8์„ ๋”ํ•œ ์ฃผ์†Œ๊ฐ’์„ EAX์— ์ €์žฅ 
  • PUSH/POP : ์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์Œ / ๊บผ๋ƒ„,
    • EBP ๊ฐ์†Œ / ์ฆ๊ฐ€ (EBP: ์Šคํƒ์˜ ์ œ์ผ ๋‚ฎ์€ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ด)
    • PUSH EBP
    • POP EAX

(3) ์‚ฐ์ˆ  ์—ฐ์‚ฐ ๋ช…๋ น์–ด

  • ADD dst, src : ๋Žƒ์…ˆ (dst = dst + src)
    • dst์— src ๊ฐ’์„ ๋”ํ•œ๋‹ค.
    • ADD eax, 3 : eax = eax + 3
  • SUB dst, src :  ๋บ„์…ˆ (dst = dst - src) 
    • dst์—์„œ src์˜ ๊ฐ’์„ ๋บ€๋‹ค.
    • SUB EAX, 3 : EAX = EAX - 3
  • INC op : ์˜คํผ๋žœ๋“œ์˜ ๊ฐ’์„ 1 ์ฆ๊ฐ€ (op = op + 1)  
    • INC EAX : EAX = EAX  + 1
  • DEC op : ์˜คํผ๋žœ๋“œ์˜ ๊ฐ’์„ 1 ๊ฐ์†Œ (op = op - 1)
    • DEC EAX : eax = eax - 1
  • MUL(๋ถ€ํ˜ธ)/IMUG(๋ฌด๋ถ€ํ˜ธ) op : EAX์— ์˜คํผ๋žœ๋“œ๋ฅผ ๊ณฑ์…ˆํ•˜์—ฌ EAX์— ์ €์žฅ (EAX = EAX * op)
    • MUL ECX: EAX = EAX * ECX
  • DIV(๋ถ€ํ˜ธ)/IDIV(๋ฌด๋ถ€ํ˜ธ) op : EAX์— ์˜คํผ๋žœ๋“œ๋ฅผ ๋‚˜๋ˆ„์–ด ๋ชซ์„ EAX์— ์ €์žฅ (๋‚˜๋จธ์ง€๋Š” EDX์— ์ €์žฅ)
    • DIV EDX: EAX = EAX / EDX 
  • NEG : ์–‘์ˆ˜๋ฅผ ์Œ์ˆ˜๋กœ, ์Œ์ˆ˜๋ฅผ ์–‘์ˆ˜

(4) ๋น„ํŠธ ์—ฐ์‚ฐ ๋ช…๋ น์–ด

  • AND dst, src 
    • dst์™€ src์˜ ๋น„ํŠธ๊ฐ€ ๋ชจ๋‘ 1์ด๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์„ ํ•˜์—ฌ dst์— ๊ฐ’์„ ์“ด๋‹ค.
  • OR dst, src
    • dst์™€ src์˜ ๋น„ํŠธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ 1์ด๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์„ ํ•˜์—ฌ dst์— ๊ฐ’์„ ์“ด๋‹ค.
  •  XOR dst, src
    • dst์™€ src์˜ ๋น„ํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉด 1, ๊ฐ™์œผ๋ฉด 0 ํ•˜์—ฌ dst์— ๊ฐ’์„ ์“ด๋‹ค. 
  • NOT op
    • op์˜ ๋น„ํŠธ ์ „๋ถ€ ๋ฐ˜์ „
  • SHL
    • ์™ผ์ชฝ์œผ๋กœ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ
    • ์ตœ์ƒ์œ„ ๋น„ํŠธ๋Š” 0์œผ๋กœ ์ฑ„์›Œ์ง€๊ณ  ๊ธฐ์กด๊ฐ’์€ CF ํ”Œ๋ž˜๊ทธ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ 
  • SHR
    • ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ
    • ์ตœ์ƒ์œ„ ๋น„ํŠธ๋Š” ๋ถ€ํ˜ธ๋น„ํŠธ๋กœ ์ฑ„์›Œ์ง€๊ณ  CF ํ”Œ๋ž˜๊ทธ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ 
  • ROL/RCL
    • ์™ผ์ชฝ์œผ๋กœ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ, ์ตœํ•˜์œ„ ๋น„ํŠธ๋Š” ์ตœ์ƒ์œ„ ๋น„ํŠธ๋กœ ์ฑ„์›Œ์ง 
  • ROR/RCR
    • ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ, ์ตœ์ƒ์œ„ ๋น„ํŠธ๋Š” ์ตœํ•˜์œ„ ๋น„ํŠธ๋กœ ์ฑ„์›Œ์ง 

(5) ์ œ์–ด ๋ช…๋ น

  • CMP : ๋‘ ๊ฐœ์˜ ์˜คํผ๋žœ๋“œ ๋น„๊ต (๋บ„์…ˆ ์—ฐ์‚ฐ ํ›„ ํ”Œ๋ž˜๊ทธ ์„ค์ •)
    • CMP EAX, 0 : EAX์˜ ๋น„ํŠธ๊ฐ€ 0์ธ์ง€ ๊ฒ€์‚ฌ
    • Zero Flag (ZF): ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ 0์ด๋ฉด ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ๋‹ค. (0์ผ ๋•Œ, 1) ์ฆ‰, ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ZF๊ฐ€ 1์ด ๋จ
    • CMP EAX, 0์—์„œ EAX๊ฐ€ 0์ด๋ฉด ZF๋Š” 1์ด ๋œ๋‹ค.
    • Sign Flag (SF): ์—ฐ์‚ฐ ๊ฒฐ๊ณผ์˜ ์ตœ์ƒ์œ„ ๋น„ํŠธ(๋ถ€ํ˜ธ ๋น„ํŠธ)์— ๋”ฐ๋ผ ์„ค์ •๋œ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์Œ์ˆ˜๋ฉด SF๋Š” 1์ด ๋œ๋‹ค.
    • Overflow Flag (OF): ์—ฐ์‚ฐ์—์„œ ๋ถ€ํ˜ธ ์žˆ๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ๋‹ค.
    • Carry Flag (CF): ๋ฌด๋ถ€ํ˜ธ ์ˆ˜๋กœ ๊ณ„์‚ฐํ–ˆ์„ ๋•Œ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด CF๊ฐ€ ์„ค์ •๋œ๋‹ค.
  • TEST : ๋‘ ๊ฐœ์˜ ์˜คํผ๋žœ๋“œ ๋น„๊ต (AND ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ํ›„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •)
    • TEST EAX, 0 :  EAX์˜ ๋น„ํŠธ๊ฐ€ 0์ธ์ง€ ๊ฒ€์‚ฌ
  • CALL : ํ•ด๋‹น๋˜๋Š” ์ฃผ์†Œ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ˆ˜ํ–‰ ์ฝ”๋“œ ์œ„์น˜๋กœ ์˜ฎ๊น€
    • CALL 00401990
  • INT : ์˜คํผ๋žœ๋“œ๋กœ ์ง€์ •๋œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰ 
    • INT 3 : ๋””๋ฒ„๊ฑฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ. ์ฃผ๋กœ ๋””๋ฒ„๊น… ์ค‘์— ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • LEAVE : ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋œ ์ง€์—ญ๋ณ€์ˆ˜ ์Šคํƒ์„ ๋น„์›€
    • ์ฃผ๋กœ ์Šคํƒ ํ”„๋ ˆ์ž„ ์ •๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ
    • ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋˜์–ด ํ•จ์ˆ˜์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜ ๊ณต๊ฐ„์„ ์ •๋ฆฌํ•˜๊ณ  ์ด์ „ ์Šคํƒ ํ”„๋ ˆ์ž„์œผ๋กœ ๋ณต๊ท€ํ•œ๋‹ค.
  • RET : ์Šคํƒ์— ์ €์žฅ๋œ ์ฃผ์†Œ๋กœ ๋ณต๊ท€
      • RET: ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜.
      • RET 4: ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์Šคํƒ ํฌ์ธํ„ฐ๋ฅผ 4๋ฐ”์ดํŠธ๋งŒํผ ์ถ”๊ฐ€ ์กฐ์ • (์˜ˆ: 4๋ฐ”์ดํŠธ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ๊ฒฝ์šฐ).
  • NOP : ์•„๋ฌด๋™์ž‘๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ (๊ธฐ๊ณ„์–ด ์ฝ”๋“œ: 0x90

(6) ๋ถ„๊ธฐ ๋ช…๋ น

  • JMP (Jump): ๋ฌด์กฐ๊ฑด EIP ๊ฐ’์œผ๋กœ ์ ํ”„
  • ์กฐ๊ฑด๋ถ€ ์ ํ”„: ์ด๋Ÿฌํ•œ ๋ช…๋ น์–ด๋“ค์€ CPU์˜ ํ”Œ๋ž˜๊ทธ ์ƒํƒœ(Zero Flag, Carry Flag ๋“ฑ)์— ๋”ฐ๋ผ EIP ์ฃผ์†Œ๊ฐ’์œผ๋กœ ์ 
    • JE (Jump if Equal): Zero Flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์ ํ”„ (ZF = 1)
    • JNE (Jump if Not Equal): Zero Flag๊ฐ€ ํด๋ฆฌ์–ด๋˜์–ด ์žˆ์œผ๋ฉด ์ ํ”„ (ZF = 0)
    • JG (Jump if Greater): Signed ๋น„๊ต์—์„œ ํฌ๋ฉด ์ ํ”„
    • JGE (Jump if Greater or Equal): Signed ๋น„๊ต์—์„œ ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ์ ํ”„
    • JL (Jump if Less): Signed ๋น„๊ต์—์„œ ์ž‘์œผ๋ฉด ์ ํ”„
    • JLE (Jump if Less or Equal): Signed ๋น„๊ต์—์„œ ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ์ ํ”„
    • JC (Jump if Carry): Carry Flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์ ํ”„
    • JNC (Jump if No Carry): Carry Flag๊ฐ€ ํด๋ฆฌ์–ด๋˜์–ด ์žˆ์œผ๋ฉด ์ ํ”„
    • JECXZ : ECX๊ฐ€ 0์ด๋ฉด ์ ํ”„
MOV EAX, value1
CMP EAX, value2   ; EAX์™€ value2๋ฅผ ๋น„๊ต
JE equal_label    ; EAX์™€ value2๊ฐ€ ๊ฐ™์œผ๋ฉด equal_label๋กœ ์ ํ”„
; ์—ฌ๊ธฐ๋Š” EAX์™€ value2๊ฐ€ ๋‹ค๋ฅผ ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ
...
equal_label:
; EAX์™€ value2๊ฐ€ ๊ฐ™์„ ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ
...

(7) ๋ฐ˜๋ณต ๋ช…๋ น

  • REP : ECX ๋ ˆ์ง€์Šคํ„ฐ ์ง€์ • ํšŸ์ˆ˜ ๋˜๋Š” ZF ํ”Œ๋ž˜๊ทธ ์กฐ๊ฑด์— ๋งž์„ ๋™์•ˆ ๋ฐ˜๋ณต
    • REP : ECX๊ฐ€ 0์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    • REPE, REPZ : ECX๊ฐ€ 0์ด๊ฑฐ๋‚˜ ZF๊ฐ€ 0์ผ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    • REPNE, REPNZ : ECX๊ฐ€ 0์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ZF๊ฐ€ 1์ผ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
  • LOOP [์ฃผ์†Œ] : ECX ๋ ˆ์ง€์Šคํ„ฐ(์นด์šดํ„ฐ)๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚ค๊ณ , ECX๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ์ฃผ์–ด์ง„ ์ฃผ์†Œ๋‚˜ ๋ ˆ์ด๋ธ”๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.
  • LOOPE/LOOPZ (Loop while Equal/Loop while Zero) [์ฃผ์†Œ] : ECX๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๊ณ , Zero Flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ ECX๊ฐ€ 0์ด ์•„๋‹ ๋•Œ ์ฃผ์–ด์ง„ ์ฃผ์†Œ๋‚˜ ๋ ˆ์ด๋ธ”๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.
  • LOOPNE/LOOPNZ (Loop while Not Equal/Loop while Not Zero) [์ฃผ์†Œ]: ECX๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๊ณ , Zero Flag๊ฐ€ ํด๋ฆฌ์–ด๋˜์–ด ์žˆ์œผ๋ฉฐ ECX๊ฐ€ 0์ด ์•„๋‹ ๋•Œ ์ฃผ์–ด์ง„ ์ฃผ์†Œ๋‚˜ ๋ ˆ์ด๋ธ”๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

4. ์Šคํƒ 

(1) ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์—ญํ• 

  • ํ•จ์ˆ˜ ๋‚ด์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜ ์ž„์‹œ ์ €์žฅ
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ
  • ๋ณต๊ท€ ์ฃผ์†Œ(return address) ์ €์žฅ

(2) ์Šคํƒ์˜ ํŠน์ง•

- FILO (First In Last Out) 

  • PUSH ๋ฐฉํ–ฅ: ์Šคํƒ์˜ ๋ฐ”๋‹ฅ์—์„œ ์œ„๋กœ
  • POP ๋ฐฉํ–ฅ: ์Šคํƒ์˜ ์œ„์—์„œ ๋ฐ”๋‹ฅ์œผ๋กœ 
์Šคํƒ์€ ๋ฐ”๋‹ฅ์˜ ์ฃผ์†Œ๊ฐ’์ด ๊ฐ€์žฅ ํฌ๋‹ค 

 

(3) ์Šคํƒ ๋™์ž‘ ์˜ˆ์ œ 

 

- ์ดˆ๊ธฐ ์ƒํƒœ์˜ ์Šคํƒ 

  • ESP(์Šคํƒ ํฌ์ธํ„ฐ): 19FF74 

//๊ถ๊ธˆํ•œ ์ : ESP์™€ EBP์˜ ์‹œ์ž‘๊ฐ’์ด ์™œ ๋‹ค๋ฅด์ง€?? 

= ์Šคํƒ์— ๋‹ค๋ฅธ ๊ฒŒ ๋“ค์–ด์žˆ์„ ์ˆ˜ ์žˆ์Œ(๋ฆฌํ„ด์ด๋‚˜ ์ด๋Ÿฐ๊ฒŒ ๋ณดํ†ต ๋“ค์–ด์žˆ์Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค) 

 

- F8: Push 100 ๋ช…๋ น ์‹คํ–‰ 

  • ์Šคํƒ์— ์ •์ˆ˜ 100์„ pushํ•ด์คŒ (๊ฐ’์„ ๋„ฃ์–ด์คŒ)
  • ESP: 19FF70 (4๋ฐ”์ดํŠธ ๊ฐ์†Œ)
    • 4๋ฐ”์ดํŠธ: ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ (์ •์ˆ˜์˜ ํฌ๊ธฐ = 4๋ฐ”์ดํŠธ)
  • ์Šคํƒ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์ฃผ์†Œ(19FF70)์—๋Š” PUSH๋ช…๋ น์— ์˜ํ•ด 100์ด ์ €์žฅ๋˜์–ด์žˆ์Œ 
    • ์Šคํƒ์— ๊ฐ’์„ ์ €์žฅํ–ˆ๊ณ  ESP๋Š” ์Šคํƒ์˜ ๊ฐ€์žฅ ์œ„์ชฝ์„ ๊ฐ€๋ฅดํ‚ค๊ธฐ ๋•Œ๋ฌธ 
  • ์ฆ‰, ๊ฐ’์„ ์ง‘์–ด ๋„ฃ์Œ = ESP ๊ฐ€ ๊ฐ€์žฅ ์ตœ์ƒ๋‹จ์œผ๋กœ ์ด๋™ํ•จ
    • ESP๊ฐ€ 4๋งŒํผ ์ค„์–ด๋“ฆ
    • ์Šคํƒ์€ ์œ„๋กœ๊ฐˆ์ˆ˜๋ก ์ฃผ์†Œ๊ฐ’์ด ์ž‘์•„์ง (ํฐ -> ์ž‘)

 

- F8: POP EAX

  • ์Šคํƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๊ทธ ๊ฐ’์„ eax ๋ ˆ์ง€์Šคํ„ฐ๋กœ ์˜ฎ๊น€
  • ESP: 19FF74 (4 ๋ฐ”์ดํŠธ ์ฆ๊ฐ€) 
  • ์Šคํƒ์—์„œ ๊ฐ’์„ ๊บผ๋ƒ„
    • ESP๋Š” ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ => ESP 4๋ฐ”์ดํŠธ ์ฆ๊ฐ€
  • eax ๋ ˆ์ง€์Šคํ„ฐ์—๋Š” 100์ด ์ €์žฅ๋จ 

 

 

์Šคํƒ์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ์Šคํƒ ํฌ์ธํ„ฐ(ESP)๋Š” ๊ฐ์†Œํ•˜๊ณ , ์Šคํƒ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด๋ฉด ์Šคํƒ ํฌ์ธํ„ฐ๋Š” ์ฆ๊ฐ€ํ•œ๋‹ค. 

์Šคํƒ ํฌ์ธํ„ฐ์˜ ์ดˆ๊ธฐ๊ฐ’์€ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์•„๋ž˜์ชฝ์— ์žˆ๋‹ค. 


5. ์Šคํƒ ํ”„๋ ˆ์ž„ 

(1) ์Šคํƒ ํ”„๋ ˆ์ž„

- ์Šคํƒ ํฌ์ธํ„ฐ(ESP)๊ฐ€ ์•„๋‹Œ ๋ฒ ์ด์Šค ํฌ์ธํ„ฐ(EBP) ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ ๋‚ด์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ณต๊ท€ ์ฃผ์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๊ธฐ๋ฒ•

  • ESP ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์€ ์ˆ˜์‹œ๋กœ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์—์„œ ์ €์žฅ๋œ ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ ESP๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ํž˜๋“ค๊ณ , CPU๊ฐ€ ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ์ฐธ๊ณ ํ•  ๋•Œ ์–ด๋ ค์›€์ด ์žˆ์Œ
  • ๋”ฐ๋ผ์„œ, ํ•จ์ˆ˜ ์‹œ์ž‘์˜ ESP ๊ฐ’์„ EBP์— ์ €์žฅํ•˜๊ณ  ์œ ์ง€ํ•ด์ฃผ๋ฉด ESP ๊ฐ’์ด ๋ณ€ํ•˜๋”๋ผ๋„ EBP๋ฅผ ๊ธฐ์ค€(base)์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ณต๊ท€ ์ฃผ์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€‹

(2) ์Šคํƒ ํ”„๋ ˆ์ž„์˜ ๊ตฌ์กฐ

  • PUSH EBP โ€‹= ํ•จ์ˆ˜ ์‹œ์ž‘ (EBP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ธฐ์กด์˜ ๊ฐ’์„ ์Šคํƒ์— ์ €์žฅ)
  • MOV EBP, ESP โ€‹= ํ˜„์žฌ์˜ ESP๋ฅผ EBP์— ์ €์žฅ
  • . . . = ํ•จ์ˆ˜์˜ ๋ณธ์ฒด // ์—ฌ๊ธฐ์„œ ESP๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ EBP๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋กœ์ปฌ๋ณ€์ˆ˜์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—‘์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ
  • MOV ESP, EBP = ESP๋ฅผ ์ •๋ฆฌ (ํ•จ์ˆ˜ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ์˜ ๊ฐ’์œผ๋กœ ๋ณต์›)
  • POP EBP โ€‹= ๋ฆฌํ„ด๋˜๊ธฐ ์ „์— ์ €์žฅํ•ด ๋†“์•˜๋˜ ์›๋ž˜ EBP ๊ฐ’์œผ๋กœ ๋ณต์›
  • RETN = ํ•จ์ˆ˜ ์ข…๋ฃŒ

 

(3) ์‹ค์Šต - stackframe.exe

#include "stdio.h"

long add(long a, long b)
{
    long x = a, y = b;
    return (x + y);
}

int main(int argc, char* argv[])
{
    long a = 1, b = 2;
    
    printf("%d\n", add(a, b));

    return 0;
}

 

 

#1 main() ํ•จ์ˆ˜ ์‹œ์ž‘, ์Šคํƒ ํ”„๋ ˆ์ž„ ์ƒ์„ฑ 

int main(int argc, char* argv[])
{

 

- main() ํ•จ์ˆ˜์—์„œ EBP๊ฐ€ ๋ฒ ์ด์Šค ํฌ์ธํ„ฐ ์—ญํ• ์„ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ EBP๊ฐ€ ์ด์ „์— ๊ฐ–๊ณ  ์žˆ๋˜ ๊ฐ’์„ ์Šคํƒ์— ๋ฐฑ์—…ํ•ด๋‘๊ธฐ ์œ„ํ•œ ๊ฒƒ

 

push EBP (EBP๊ฐ’์„ ์Šคํƒ์— ๋„ฃ์–ด๋ผ)

 

- ์Šคํƒ์— ์ €์žฅ๋œ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋กœ์ปฌ ๋ณ€์ˆ˜๋“ค์€ EBP๋ฅผ ํ†ตํ•ด ์—‘์„ธ์Šคํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค

 

MOV EBP, ESP (ESP ๊ฐ’์„ EBP๋กœ ์˜ฎ๊ฒจ๋ผ)

 

-> ์ด ๋‘ ๋ช…๋ น์–ด์— ์˜ํ•ด main()ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋œ ๊ฒƒ์ด๋‹ค. 

 

* ์Šคํƒ ์ฐฝ์„ ์„ ํƒ ํ›„ address -> Relative to EBP ์„ ํƒํ•˜์—ฌ EBP ์œ„์น˜ ํ™•์ธ ๊ฐ€๋Šฅ 

 

- EBP ๊ฐ’์€ 0019FF28๋กœ ESP์™€ ๋™์ผํ•˜๊ณ ,19FF28 ์ฃผ์†Œ์—๋Š” 19FF70 ์ด๋ผ๋Š” ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

(main()ํ•จ์ˆ˜ ์‹œ์ž‘ํ•  ๋•Œ EBP๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ดˆ๊ธฐ๊ฐ’)

 

#2 ๋กœ์ปฌ ๋ณ€์ˆ˜ ์„ธํŒ… 

 long a = 1, b = 2;

SUB ESP,8 (ESP ๊ฐ’์—์„œ 8์„ ๋บด๋ผ)

 

- ํ˜„์žฌ ESP: 0019FF28 -> 19FF20

- 8์„ ๋นผ๋Š” ์ด์œ : ํ•จ์ˆ˜์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ์Šคํƒ์— ์ €์žฅ๋˜๋Š”๋ฐ, main()ํ•จ์ˆ˜์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ๊ฐ 'a'์™€ 'b'์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 'a'์™€ 

'b'๋Š” long ํƒ€์ž…์ด๋ฏ€๋กœ ๊ฐ ๊ฐ 4๋ฐ”์ดํŠธ์”ฉ ๊ฐ€์ง„๋‹ค. ์ฆ‰, ์ด ๋‘๋ณ€์ˆ˜๋ฅผ ์Šคํƒ์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ด 8๋ฐ”์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋‘ ๋ณ€์ˆ˜์—๊ฒŒ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณด(์˜ˆ์•ฝ)ํ•œ ๊ฒƒ์ด๋‹ค.

 

 

 

- DWORD PTR SS:[EBP-4]): EBP-4 ์ฃผ์†Œ์—์„œ 4๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์šฉ //ํฌ์ธํ„ฐ

=> '[EBP-4] ์—๋Š” 1์„ ๋„ฃ๊ณ  (a) , [EBP-8]์—๋Š” 2๋ฅผ ๋„ฃ์–ด๋ผ' (b)

 

#3 add() ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ž…๋ ฅ ๋ฐ add() ํ•จ์ˆ˜ ํ˜ธ์ถœ

 printf("%d\n", add(a, b));

 

  • ์œ„ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋Š” ์ „ํ˜•์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ณผ์ •์„ ๋ณด์—ฌ์ค€๋‹ค
    • 40103C ์ฃผ์†Œ์˜ CALL 401000 ๋ช…๋ น์–ด์—์„œ 401000 ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ add()ํ•จ์ˆ˜์ด๋‹ค
    •  add()ํ•จ์ˆ˜๋Š”ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ a์™€ b๋ฅผ ๋ฐ›๋Š”๋‹ค
    • ์œ„ 401034~40103B์ฃผ์†Œ์˜ ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜ a,b๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ์žˆ๋‹ค

* ์ฃผ๋ชฉํ•  ๋‚ด์šฉ์€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ C ์–ธ์–ด์˜ ์ž…๋ ฅ ์ˆœ์„œ์™€๋Š” ๋ฐ˜๋Œ€๋กœ ์Šคํƒ์— ์ €์žฅ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (์ด๋ฅผํ•จ์ˆ˜ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์—ญ์ˆœ์ €์žฅ์ด๋ผ๊ณ  ํ•จ)

์ฆ‰, ๋ณ€์ˆ˜ b ([EBP-8])๊ฐ€ ์Šคํƒ์— ๋จผ์ € ๋“ค์–ด๊ฐ€๊ณ  ๋ณ€์ˆ˜ a ([EBP-4])๊ฐ€ ๋‚˜์ค‘์— ๋“ค์–ด๊ฐ„๋‹ค. 

 

 

#5 ๋ณต๊ท€ ์ฃผ์†Œ

 

 

- CALL ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์–ด ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— CPU๋Š” ๋ฌด์กฐ๊ฑด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋ณต๊ท€ํ•  ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ์ €์žฅํ•œ๋‹ค

 

 

#6 add() ํ•จ์ˆ˜ ์‹œ์ž‘, ์Šคํƒ ํ”„๋ ˆ์ž„ ์ƒ์„ฑ

long add(long a, long b)

 

// F7๋กœ ํ•ด๋‹น ํ•จ์ˆ˜ ๋“ค์–ด๊ฐ€๊ธฐ

 

- main()๊ณผ ์™„์ „ํžˆ ๋™์ผํ•จ 

 

 

#7 add() ํ•จ์ˆ˜์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜ x, y ์„ธํŒ…

long x = a, y = b;

 

  • ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ x, y์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ํ™•๋ณด
  • [EBP+8]: ํŒŒ๋ผ๋ฏธํ„ฐ a
  • [EBP+C]: ํŒŒ๋ผ๋ฏธํ„ฐ b
  • [EBP-8]: add() ํ•จ์ˆ˜์˜ ๋กœ์ปฌ x
  • [EBP-4]: add() ํ•จ์ˆ˜์˜ ๋กœ์ปฌ y

 

 

 

#8 ADD

return (x + y);

 

  • [EBP-8]์˜ ๋ณ€์ˆ˜ x์˜ ๊ฐ’ 1์„ MOV ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด EAX๋กœ ๋„ฃ๋Š”๋‹ค
  • [EBP-4]์˜ ๋ณ€์ˆ˜ y์˜ ๊ฐ’ 2์„ ADD ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด EAX์˜ ๊ฐ’ 1๊ณผ ๋”ํ•ด 3์ด ๋˜์—ˆ๋‹ค
  • EAX๋Š” '๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ'๋กœ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ๋„ ์‚ฌ์šฉ๋œ๋‹ค

 

#9 add() ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„ ํ•ด์ œ & ํ•จ์ˆ˜ ์ข…๋ฃŒ(๋ฆฌํ„ด)

    return (x + y);
}

 

  • add() ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๋˜๊ธฐ ์ „์— add()ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค
  • ํ˜„์žฌ EBP ๊ฐ’์„ ESP์— ๋Œ€์ž…ํ•œ๋‹ค //์ด ๋ช…ใ…‡๋ น์–ด๋Š” ์•ž์˜ MOV EBP, ESP ๋ช…๋ น์–ด์— ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค
  • ์ฆ‰ add() ํ•จ์ˆ˜ ์‹œ์ž‘ํ•  ๋•Œ์˜ ESP๊ฐ’์„ EBP์— ๋„ฃ์–ด๋‘์—ˆ๋‹ค๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ESP๋ฅผ ๋ณต์›์‹œํ‚ค๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค
  • add() ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜๋ฉด์„œ ์Šคํƒ์— ๋ฐฑ์—…ํ•œ EBP๊ฐ’์„ ๋ณต์›ํ•œ๋‹ค //PUSH EBP์— ๋Œ€์‘ 
    • ์ด์ œ add() ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์€ ํ•ด์ œ๋˜์—ˆ๋‹ค 
  • RETN ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋ฉด ์Šคํƒ์— ์ €์žฅ๋œ ๋ณต๊ท€ ์ฃผ์†Œ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค //RETN

     

#10 add() ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ๊ฑฐ 

#11 printf() ํ•จ์ˆ˜ ํ˜ธ์ถœ 

 printf("%d\n", add(a, b));

  • ADD ESP, 8
    • ADD ๋ช…๋ น์œผ๋กœ ESP์— 8์„ ๋”ํ•˜๊ณ  ์žˆ๋‹ค
    • add() ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ a, b ๊ฐ€ ํ•„์š”๊ฐ€ ์—†๋‹ค
    • ๋”ฐ๋ผ์„œ 8์„ ๋”ํ•ด ์Šคํƒ์„ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค
  • EAX ๋ ˆ์ง€์Šคํ„ฐ์—๋Š” add() ํ•จ์ˆ˜์—์„œ ์ €์žฅ๋œ ๋ฆฌํ„ด ๊ฐ’(3)์ด ๋“ค์–ด์žˆ๋‹ค
  • printf() ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๋Š” 2๊ฐœ์ด๊ณ  ํฌ๊ธฐ ์—ญ์‹œ 8๋ฐ”์ดํŠธ์ด๋‹ค
  • ๋”ฐ๋ผ์„œ ADD ESP, 8 ๋ช…๋ น์œผ๋กœ ์Šคํƒ์—์„œ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค

#12 ๋ฆฌํ„ด ๊ฐ’ ์„ธํŒ…

#13 ์Šคํƒ ํ”„๋ ˆ์ž„ ํ•ด์ œ & main() ํ•จ์ˆ˜ ์ข…๋ฃŒ

  return 0;
}
  • XOR ๋ช…๋ น์–ด๋Š” Exclusive OR bit ์—ฐ์‚ฐ์œผ๋กœ, ๊ฐ™์€ ๊ฐ’๋ผ๋ฆฌ XORํ•˜๋ฉด 0์ด ๋˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค
  • MOV EAX, 0 ๋ช…๋ น์–ด๋ณด๋‹ค ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์„œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”์‹œํ‚ฌ ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค

 

#14 ์˜ฌ๋ฆฌ๋””๋ฒ„๊ฑฐ ์˜ต์…˜ ๋ณ€๊ฒฝ