songining
<ํ•ดํ‚น: ๊ณต๊ฒฉ์˜ ์˜ˆ์ˆ > ์ฑ…์„ ๋ณด๊ณ  ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค
X86 ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

GDB ์กฐ์‚ฌ ๋ช…๋ น ํ˜•์‹

o : 8์ง„๋ฒ•

x : 16์ง„๋ฒ•

u : ๋ถ€ํ˜ธ๊ฐ€ ์—†๋Š” ํ‘œ์ค€ 10์ง„๋ฒ• 

t : 2์ง„๋ฒ• 

 

๋ฉ”๋ชจ๋ฆฌ ๋‹จ์ผ ์œ ๋‹›์˜ ๊ธฐ๋ณธ ํฌ๊ธฐ๋Š” '์›Œ๋“œ' ๋ผ ๋ถˆ๋ฆฌ๋Š” 4 byte (32bit ํ™˜๊ฒฝ์—์„œ) 

b ๋‹จ์ผ ๋ฐ”์ดํŠธ

h 2byte์˜ ํ•˜ํ”„์›Œ๋“œ

w 4byte์˜ ์›Œ๋“œ

g 8byte์˜ ์ž์ด์–ธํŠธ 

 

eip ๋ ˆ์ง€์Šคํ„ฐ : ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ฝ๊ณ  ์žˆ๋Š” ํ˜„์žฌ ๋ช…๋ น์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ช…๋ น ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ 

i r eip : eip ๋ ˆ์ง€์Šคํ„ฐ์˜ ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ 

x/x $eip : 16์ง„๋ฒ•์œผ๋กœ eip๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ’ ์ถœ๋ ฅ ($eip๋Š” ๊ทธ ์ˆœ๊ฐ„ eip๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.) 

x/xw $eip : 16์ง„๋ฒ•์œผ๋กœ 4byte๋งŒํผ ์ถœ๋ ฅ ( ๋ฆฌํ‹€์—”๋””์•ˆ x )

 x/i $eip :  eip ์œ„์น˜์˜ ์—ญ์–ด์…ˆ๋ธ”๋œ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์˜ ๋ช…๋ น ๋ฉ”๋ชจ๋ฆฌ ํ™•์ธ ex) x/4i ์ด๋ฉด 4์ค„ ์กฐ์‚ฌ 

x/6xb 0x8048484 : ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’ 16์ง„์ˆ˜ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ 6 byte ์กฐ์‚ฌ ( ๋ฆฌํ‹€์—”๋””์•ˆ ) 

 

๋ฌธ์ž์—ด 

- ๋ฌธ์ž ๋ฐฐ์—ด

- ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์€ ๋„ ๋ฐ”์ดํŠธ๋กœ ์ €์žฅ ( ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์—ฌ๊ธฐ์„œ ์ค‘๋‹จํ•˜๋ผ๊ณ  ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•จ) 

 

Signed , Unsigned 

unsigned : ๋ถ€ํ˜ธ ์—†์ด ์„ ์–ธ 

signed : ๋ถ€ํ˜ธ ์กด์žฌ 

 

ํฌ์ธํ„ฐ

- x86 ์•„ํ‚คํ…์ฒ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” 32bit ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋Š” 32bit(4byte)์ด๋‹ค. 

Ex) 

int int_var = 5;
int *int_ptr; # ํฌ์ธํ„ฐ 

int_ptr = &int_var; # int_var์˜ ์ฃผ์†Œ๋ฅผ int_ptr์— ๋„ฃ๋Š”๋‹ค. 

/**
int_ptr = 0xbffff834 # int_var์˜ ์œ„์น˜
&int_ptr = 0xbffff830 # int_ptr์˜ ์œ„์น˜
*int_ptr = 0x00000005 # int_var์˜ ๊ฐ’ 

int_ptr์—๋Š” int_var์˜ ์œ„์น˜ ์ฃผ์†Œ ๊ฐ’์ด ๋“ค์–ด์žˆ์œผ๋ฉฐ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ int_var์˜ ๊ฐ’์ด๋‹ค. 
**/

 

ํ˜•์‹ ๋ฌธ์ž์—ด 

%d , %u, %x -> ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฐ’ ์ž์ฒด๋ฅผ ๋ฐ›์•„๋“ค์ธ๋‹ค. 

%s, %n -> ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์ธ๋‹ค. 

 

- %s ํ˜•์‹ ์ธ์ž๋Š” ์ฃผ์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋„ ๋ฐ”์ดํŠธ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 

- %n ํ˜•์‹ ์ธ์ž๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ถœ๋ ฅํ•œ ๋ฐ”์ดํŠธ์˜ ์ˆ˜๋ฅผ ์ฃผ์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์“ด๋‹ค. 

 

scanf๊ฐ€ printf์™€ ๋‹ค๋ฅธ ์ ? ๋ชจ๋“  ์ธ์ž๊ฐ€ ํฌ์ธํ„ฐ์—ฌ์•ผ ํ•œ๋‹ค. (์ธ์ž๊ฐ€ ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณ€์ˆ˜ ์ฃผ์†Œ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ!!) 

 

ํ˜• ๋ณ€ํ™˜ 

char char_array[5] = {'a','b','c','d','e'}
int int_array[5] = {1,2,3,4,5} 

char *char_pointer;
int *int_pointer; 

# ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ๋งž์ถฐ์ฃผ์–ด์•ผํ•จ 
char_pointer =  char_array;
int_pointer = int_array;

# ํฌ์ธํ„ฐ ์ด๋™ 
# 1->2
int_pointer = int_pointer + 1; # ์ •์ˆ˜ ํƒ€์ž…์ด๋ฏ€๋กœ 4byte ์ด๋™ 
# a->b
char_pointer = char_pointer + 1; # char ํƒ€์ž…์ด๋ฏ€๋กœ 1byte ์ด๋™
char char_array[5] = {'a','b','c','d','e'}
int int_array[5] = {1,2,3,4,5} 

# ํƒ€์ž…์ด ์—†๋Š” ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉ ํ›„ ํ˜• ๋ณ€ํ™˜์„ ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ 
void *void_pointer; 

void_pointer = (void *) char_array;

# ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ 
void_pointer = (void *)((char *) void_pointer + 1);


C์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๊ธฐ์–ตํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์ ์€, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€์ˆ˜ ํƒ€์ž…์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋Š” ์ 

ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‚˜๋ฉด ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์ผ ๋ฟ์ด๋‹ค. 

์–ด๋–ค ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๊ฐ•์ œ์ ์œผ๋กœ ํ˜• ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.