À©32¿¡¼­ ¸®¹ö½º¿£Áö´Ï¾î¸µ

 

ÀÌ ¹®¼­´Â Uninformed ¸Å°ÅÁø Vol.1 Introduction to Reverse Engineering Win32 Applications  - trew¸¦ ¹ø¿ªÇÑ °ÍÀ¸·Î, orpe´ÔÀÌ beist.org¿¡ Á¦°øÇØÁּ̽À´Ï´Ù. Èûµé°Ô ¹ø¿ªÇÑ ¹®¼­¸¦ °øÀ¯ÇØÁֽŠorpe´Ô²² °¨»çµå¸³´Ï´Ù.

 

¿À¸®Áö³¯ ¹®¼­ URL : http://www.uninformed.org/?v=1&a=7&t=txt

¹ø¿ª: orpelove@gmail.com




 


 1) ¼­¹®

 

 ÀÌ ¹®¼­¸¦ ÅëÇØ ¿©·¯ºÐÀº WinDBG¸¦ ÅëÇØ À©32 ÇÁ·Î±×·¥À» Á¦ÀÛÇÒ ¼ö ÀÖ°í ±Ùº»ÀûÀÎ °ÍÀ» ÀÌÇØÇϱâ À§ÇØ ¸¹Àº °³³ä°ú ÅøµéÀÌ ¼Ò°³ µÉ °ÍÀÌ´Ù. ±×¸®°í 'Áö·Úã±â' °ÔÀÓÀ» ÅëÇØ WinDBG¿¡¼­ Á¦°øÇÏ´Â ±â´É°ú ½Ã¿¬À» Åä´ë·Î ¾î¶»°Ô À©32 ÀÀ¿ëÇÁ·Î±×·¥À» ¸®¹ö½º¿£Áö´Ï¾î¸µ ÇÏ´ÂÁö¿¡ ´ëÇØ ä¿öÁú °ÍÀÌ´Ù. IA-32 ¾î¼Àºí¸®, ·¹Áö½ºÅÍÀÇ Á߿伺, º¸È£¸Þ¸ð¸®, ½ºÅÃÀÇ »ç¿ë°úÁ¤, ´Ù¾çÇÑ WinDBGÀÇ ¸í·É¾îµé call stack°³³ä, ¿¡µð¾È ±×¸®°í À©µµ¿ì API µî¿¡ ´ëÇØ ´Ù·ê °ÍÀÌ´Ù. ÀÌ Áö½ÄÀ» ¹ÙÅÁÀ¸·Î Áö·Úã±â °ÔÀÓ¿¡¼­ Áö·Ú¸¦ Á¦°ÅÇÏ°í ³ëÃâ½ÃŰ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¼ °ÍÀÌ´Ù.

 


2) ¼Ò°³ (Introduction)

 °ÔÀÓÀº °£È¤ »ç¶÷À» ÁÂÀý½ÃŲ´Ù. ÀÌ ÁÂÀýÀº °ÔÀÓÀÇ ¼³°è»ó Ç÷¹À̾°Ô ¾Ë·ÁÁöÁö ¾ÊÀº °ÍµéÀ» Á¦°øÇØ¾ß ÇÑ´Ù´Â Çʿ信¼­ ºñ·ÔµÇ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î ³Ñ¹ö 3¹ø ¹® µÚ¿¡ ÀẹÇÑ ¸ó½ºÅÍÀÇ ¼ö°¡ ¾ó¸¶³ª µÇ´ÂÁö, ±×¸®°í 90, 50 ±¸°æÀÇ 8°³ÀÇ ÃÑźÀ¸·Î ÃæºÐÈ÷ Á×ÀÏ ¼ö ÀÖÀ»±î ÇÏ´Â °ÍµéÀÌ´Ù. ¿­ ¹øÀ» Çϰí Űº¸µå°¡ ºÎ½¤Áö°í ³ª¼­¾ß Ç÷¹ÀÌ Çϰí ÀÖ´ø ÇʵåÀÇ ·¹º§»Ó¸¸ ¾Æ´Ï¶ó °ÔÀÓÀÇ ±âÁúÀÌ ³ô¾ÆÁ® °¡´Â ´É·ÂÀ» °¡Áø´Ù. ¾î¶² ºÎ·ùÀÇ »ç¶÷µéÀº ¸í¼ºÀ̳ª Ä«¸£¸¶ µ¥¹ÌÁö¸¦ ÀÔ°íµµ(¿ªÀÚÁÖ: ÇѸ¶µð·Î ¾å»ðÇϰÔ) À̵æÀ» ÃëµæÇÑ´Ù. ¹Ù·Î Ä¡ÆÃ(cheating)À¸·Î ¸»ÀÌ´Ù.

 ¸¹Àº »ç¶÷µéÀº ÀÌ·±Àú·± ÀÌÀ¯·Î ġƮ¸¦ ¸¸µé¾î ºÒ°øÆòÇÑ ÀÌÁ¡À» ì±ä´Ù. ±×·¯³ª ±×¿Í´Â ´Ù¸¥ »ç¶÷Àº ¿ÏÀüÈ÷ ´Ù¸¥ µ¿±â¸¦ °¡Áö°í °ÔÀÓ¿¡ µµÀüÇÑ´Ù. µ¿±â¿¡ °üÇØ¼­ ÀÏ´Ü Á¦Ãĵΰí ÀÌ ¹®¼­ÀÇ ¸ñÀûÀº µ¶ÀÚ¿¡°Ô À©µµ¿ì ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ¸®¹ö½º ¿£Áö´Ï¾î¸µ¿¡ ´ëÇØ µµ¿òÀ» ÁÖ°í ±âº»ÀûÀÎ ¹æ¹ý·Ð°ú Åø »ç¿ë¹ý¿¡ Ä£¼÷Çϵµ·Ï ¸¸µå´Â °ÍÀÌ´Ù. µ¶ÀÚµéÀº WinDBG, IA-32 ¾î¼Àºí·¯, À©µµ¿ì API¿Í °ü·ÃµÈ ºÎºÐµé¿¡ ´ëÇØ ¾Ë°Ô µÉ °ÍÀÌ´Ù. Áö·Úã±â °ÔÀÓÀ¸·Î ޽º·¯¿î 'ºÒ°øÆòÇÑ ÀÌÁ¡'À» ì±â´Â °Í¿¡ ´ëÇØ Â÷±ÙÂ÷±Ù ¿¹¸¦ µé¾î ÀÌ °³³äµéÀ» ¼³¸íÇÒ °ÍÀÌ´Ù.

3) ½ÃÀÛ(Getting Started)

 ÀÌ ¹®¼­¸¦ Àбâ À§ÇØ µ¶ÀÚµéÀº ´ÙÀ½°ú °°Àº ¿ä±¸»çÇ×À» ¸¸Á·ÇØ¾ß ÇÑ´Ù.

    1. HEX °ªÀ» ÀÌÇØÇÔ

    2. ±âº»ÀûÀÎ C ÄÚµù °¡´ÉÇÔ

    3. WinDBG¸¦ ¼³Ä¡Çϰí Àû´çÈ÷ ¼³Á¤ °¡´ÉÇÔ

    4. À© XP¸¦ »ç¿ëÇϰí Áö·Úã±â °ÔÀÓÀÌ ½ÇÇà°¡´ÉÇÔ

 

 ÀÌ ¹®¼­¸¦ ÀÐÀ¸¸ç ¿·¿¡ ÁغñÇϰí ÀÖ¾î¾ß ÇÏ´Â °Íµé:

    1. IA-32 Instruction Set Reference A-M [7]

    2. IA-32 Instruction Set Reference N-Z [7]

    3. IA-32 Volume 1 - Basic Architecture [7]

    4. Microsoft Platform SDK [4]

    5. Debugger Quick Reference [8]

¸ÕÀú, WinDBG¿Í Symbol ÆÐŰÁö°¡ ÇÊ¿äÇѵ¥ WinDBG´Â The Debugging Tools Windows ÆÐŰÁöÀÇ ÇÑ ºÎºÐÀÌ´Ù.

´Ù¿î·Îµå ¸µÅ©Á¤º¸:

 

http://msdl.microsoft.com/download/symbols/packages/windowsxp/WindowsXP-KB835935-SP2-slp-Symbols.exe

http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.4.7.2.exe

 

´Ù¿î·Îµå ¹Þ´Â µ¿¾È ÀáÀçÀûÀÎ ¸ñÀû°ú µð¹ö±ëÀÌ ¹«½¼ ÀÏÀ» ÇØ ÁÙ °ÍÀÎÁö, ±×¿¡ °üÇÑ Á߿伺 ±×¸®°í ½Éº¼Àº ¹«¾ùÀÌ¸ç ½Éº¼ÀÌ ÀÀ¿ëÇÁ·Î±×·¥À» µð¹ö±ë ÇÒ ¶§ ¾î¶»°Ô À¯¿ëÇÑÁö ¾Ë¾Æº¸ÀÚ.


3.1) ¸ñÇ¥

 Áö·Úã±â °ÔÀÓÀ» Çϱâ À§ÇÑ ±âº»ÀûÀÎ Àü·«Àº ÁÖ¾îÁø Áö·ÚÆÇ¿¡¼­ ÆøÅºÀÌ ¾îµð¿¡ À§Ä¡Çϰí ÀÖ´ÂÁö È®ÀÎÇÏ°í °¡´ÉÇÑ ºü¸¥ ½Ã°£³»¿¡ Áö·Ú°¡ ¾ø´Â °ø°£À» Ŭ¸®¾î ÇÏ´Â °ÍÀÌ´Ù. °¢ Ä­¿¡ Ç÷¹À̾î´Â ¹°À½Ç¥¸¦ ÂïÀ» ¼ö ÀÖ°í ÆøÅºÀÓ¿¡ È®½ÅÀÌ µå´Â Ä­À̶ó¸é ±ê¹ßÀ» ÂïÀ» ¼ö ÀÖ´Ù. ÀÌ°É ¸í½ÉÇÏ°í ´ÙÀ½ÀÇ ¸ñÇ¥¸¦ ²ø¾î ³¾ ¼ö ÀÖ´Ù:

 

    1. ŸÀÓ Á¤º¸¸¦ ÄÁÆ®·ÑÇÏ°í ¼öÁ¤Çϱâ

    2. ±ê¹ß°ú ¹°À½Ç¥ ¸¶Å©ÀÇ Á¤È®ÇÑ À§Ä¡ È®ÀÎÇϱâ

    3. ÆøÅºÀÇ À§Ä¡ È®ÀÎÇϱâ

    4. Áö·ÚÆÇ¿¡¼­ ÆøÅºÁ¦°ÅÇϱâ

 

ÀÌ ¸ñÇ¥¸¦ ÀÌ·ç±â À§ÇØ µ¶ÀÚ´Â ´ÙÀ½°ú °°Àº »çÇ×À» ¸ÕÀú È®º¸ÇØ¾ß ÇÑ´Ù.

 

    1. Áö·Úã±â ÇÁ·Î¼¼½º¿¡¼­ Áö·ÚÆÇÀÌ À§Ä¡ÇÏ´Â °÷

    2. Áö·ÚÆÇÀ» ¾î¶»°Ô ÇØºÎÇÒ °ÍÀΰ¡

    3. Áö·Úã±â ÇÁ·Î¼¼½º¿¡¼­ ŸÀÓ(clock)ÀÌ À§Ä¡ÇÏ´Â °÷

 

ÀÌ ¹®¼­ÀÇ ¹üÀ§´Â Áö·ÚÆÇ¿¡¼­ ÆøÅºÀ» Á¦°ÅÇϰí, locating, interpeting, ±×¸®°í reversing ¿¡ ÃÊÁ¡À» µÑ °ÍÀÌ´Ù.

 


3.2) ½Éº¼(Symbols) °ú µð¹ö°Å(Debuggers)

 µð¹ö°Å´Â ÇÁ·Î¼¼½ºÀÇ ¿µ¿ªÀ» ÄÁÆ®·Ñ, ¼öÁ¤, ½ÃÇè ÇØº¸±â À§ÇØ ±× ÇÁ·Î¼¼½º¸¦ ºÒ·¯(attach) µéÀÌ´Â ÇϳªÀÇ Åø¼ÂÀÌ´Ù. Á» ´õ ÀÚ¼¼È÷ ¸»ÇÏ¸é µð¹ö°Å´Â ¿©·¯ºÐ¿¡°Ô ½ÇÇàÈ帧(flow)¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ°Ô Çϰí ÇÁ·Î¼¼½º ¸Þ¸ð¸®¸¦ Àаųª ¾µ ¼ö ÀÖÀ¸¸ç ·¹Áö½ºÅÍ °ªÀ» º¯°æÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. ÀÌ·± ÀÌÀ¯·Î µð¹ö°Å´Â ´ç½ÅÀÌ ¿øÇÏ´Â ´ë·Î °¡°øÇϱâ À§ÇØ ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô ¼öÇà µÇ´ÂÁö ÀÌÇØ ÇÒ ¼ö ÀÖ´Â ÇʼöǰÀÎ °ÍÀÌ´Ù.

 ÀϹÝÀûÀ¸·Î ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ¹èÆ÷(release)´Ü°è¿¡¼­ ÄÄÆÄÀÏ µÇ¾úÀ» ¶§´Â ¼Ò½º¿Í °ü·ÃµÈ Á¤º¸³ª ÇÔ¼ö³ª º¯¼öÀÇ À̸§Àº µð¹ö±ë Á¤º¸¿¡ Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù. ÀÌ·¯ÇÑ Á¤º¸ÀÇ ºÎÀç´Â ¸®¹ö½º¿£Áö´Ï¾î¸µÀ» ÅëÇØ ÀÀ¿ëÇÁ·Î±×·¥À» ÀÌÇØÇϴ°ÍÀ» ´õ ¾î·Æ°Ô ¸¸µç´Ù. ÇÏÁö¸¸ µð¹ö°Å´Â ½Éº¼À̶ó´Â °ÍÀ» µµÀÔÇÏ¿© º¸ÀÌÁö ¾Ê´ø ÇÔ¼ö³ª º¯¼öÀÇ À̸§À» ´ë½ÅÇÏ¿© »ç¿ëÇÑ´Ù. Á» ´õ ½Éº¼¿¡ °üÇÑ Á¤º¸¸¦ ¾Ë°í ½Í´Ù¸é ·¹ÆÛ·±½º ¼½¼Ç[3]ÀÇ °ü·Ã ¹®¼­¸¦ Âü°íÇ϶ó.


3.3) ½Éº¼ ¼­¹ö(Symbol Server)

 ¾Æ±î ´Ù¿î·Îµå ¹ÞÀº À©µµ¿ì¿ë µð¹ö±ë Åø°ú ½Éº¼ ÆÐŰÁö µÎ °³ÀÇ ÆÄÀÏÀ» Áö±ÝÂëÀÌ¸é ´Ù ¹Þ¾ÒÀ» °ÍÀÌ´Ù. ÀÌÁ¦ ¼ø¼­´ë·Î ÀνºÅç ÇÑ ÈÄ ½Éº¼ ÆÐŰÁö°¡ ¼³Ä¡µÈ À§Ä¡¸¦ Àß Àû¾î ³õ´Â´Ù. ¼³Ä¡ ÈÄ ½ÃÀÛ ¸Þ´º¿¡ µé¾î°¡ ÇÁ·Î±×·¥>Debugging Tools for Windows ¾Æ·¡ WinDBG¸¦ ½ÇÇàÇÑ´Ù. WinDBG°¡ ½ÇÇàµÇ¾ú´Ù¸é File ¸Þ´º¿¡¼­ ½Éº¼ ÆÄÀÏ ÆÐ½º(Symbol File Path)¸¦ Ŭ¸¯ÇÑ ÈÄ ¾Æ·¡¿Í °°ÀÌ ÀÔ·ÂÇÑ´Ù:


SRV**http://msdl.microsoft.com/download/symbols

¿¹¸¦ µé¾î, ½Éº¼ÀÌ ´ÙÀ½°ú °°Àº À§Ä¡¿¡ ¼³Ä¡µÇ¾ú´Ù¸é:


C:\Windows\Symbols

´ç½ÅÀº ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇØ¾ß ÇÑ´Ù:


SRV*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols

 ÀÌ ¼³Á¤Àº WinDBG¿¡°Ô ¾Æ±î ¼³Ä¡ÇÑ ½Éº¼ÀÇ À§Ä¡¸¦ ¾Ë·ÁÁÖ±â À§ÇÑ °ÍÀÌ´Ù. ±×¸®°í ¸¸¾à ½Éº¼ÀÌ »ç¿ëÇÒ ¼ö ¾øÀ» ¶§ ½Éº¼ ¼­¹ö·Î ºÎÅÍ ¹Þ¾Æ ¿Ã À§Ä¡¸¦ ¼³Á¤ÇÑ °ÍÀÌ´Ù. ½Éº¼¼­¹ö¿¡ °üÇÑ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â ·¹ÆÛ·±½º ¼½¼Ç[2]¸¦ Âü°íÇ϶ó.

4) WinDBG¿Í Ä£ÇØÁö±â

 ¸¶¿ì½º¸¦ »ç¿ëÇÏ´øÁö ´ÜÃà۸¦ »ç¿ëÇÏ´øÁö WinDBGÀÇ Åø¹Ù´Â ÀÌ ¹®¼­¿¡¼­ »ç¿ëµÇ´Â ±âº»ÀûÀÎ ¿ë¾î¸¦ ³íÀÇÇϱâ À§ÇÑ °£´ÜÇÑ °¡À̵å·Î¼­ ¿ªÇÒÀ» ÇÒ °ÍÀÌ´Ù. ¿ÞÂʺÎÅÍ ¿À¸¥ÂÊÀ¸·Î °¢ ¿É¼ÇÀÇ ±â´ÉÀº ´ÙÀ½°ú °°´Ù:

  1. Open Source Code - Open associated source code for the debugging session.
  2. Cut - Move highlighted text to the clipboard
  3. Copy - Copy highlighted text to the clipboard
  4. Go - Execute the debugee
  5. Restart - Restart the debugee process
  6. Stop - Terminate the debugging session
  7. Break - Pause the currently running debugee process

 ´ÙÀ½ ³×°³ÀÇ ¿É¼Ç ¾ÆÀÌÄÜÀº µð¹ö°Å°¡ Break°¡ °É¸° ÈÄ »ç¿ëµÈ´Ù. µð¹ö°Å´Â À§ÀÇ ¿É¼ÇÀ» ÅëÇØ Break °É¸± ¼öµµ ÀÖ°í »ç¿ëÀÚ°¡ À§Ä¡¸¦ ÁöÁ¤ÇÏ¿© Break (Breakpoint) °É ¼öµµ ÀÖ´Ù. ºê·¹ÀÌÅ©Æ÷ÀÎÆ®´Â ´Ù¾çÇÑ »óȲ¿¡ ÇÒ´ç µÉ ¼ö ÀÖ´Ù. ´ëºÎºÐÀÇ °øÅëÀûÀÎ Á¡Àº ÇÁ·Î¼¼¼­°¡ ƯÁ¤ ÁÖ¼Ò¿¡¼­ ¸í·ÉÇà(instruction)À» ½ÇÇà ÇÒ ¶§³ª ¸Þ¸ð¸®ÀÇ Æ¯Á¤ ¿µ¿ª¿¡ Á¢±Ù µÇ¾úÀ» ¶§ÀÇ »óȲÀÌ´Ù. ºê·¹ÀÌÅ©Æ÷ÀÎÆ®ÀÇ ¿ëµµ¿¡ °üÇØ¼­ ³ªÁß¿¡ ´Ù½Ã ÀÚ¼¼È÷ ¾ð±ÞÇϵµ·Ï ÇϰڴÙ.

 ºê·¹ÀÌÅ©Æ÷ÀÎÆ®°¡ °É¸° À§Ä¡¿¡ µµ´Þ ÇÏ¿´À» ¶§, °¢°¢ÀÇ ¸í·ÉÇàÀ̳ª ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ½ÇÇàÇÏ´Â °ÍÀº ÇÁ·Î¼¼½º¸¦ ¼öÇàÇÏ¸ç ¾î¶»°Ô °Ç³Ê¶Û °ÍÀÎÁö È®ÀÎÇϴµ¥, WinDBG¿¡´Â ½ºÅÜ ¹æ½Ä¿¡ ´ëÇØ ´ÙÀ½°ú °°ÀÌ ³×°¡Áö¸¦ Á¤ÀÇÇϰí ÀÖ´Ù.

  1. Step Into - Execute a single instruction. When a function is called, this will cause the debugger to step into that function and break, instead of executing the function in its entirety.
  2. Step Over - Execute one or many instructions. When a function is called, this will cause the debugger to execute the called function and break after it has returned.
  3. Step Out - Execute one or many instructions. Causes the debugger to execute instructions until it has returned from the current function.
  4. Run to Cursor - Execute one or many instructions. Causes the debugger to execute instructions until it has reached the addresses highlighted by the cursor.


4.1) WinDBG À©µµ¿ì

 

 WinDBG´Â View Åø¹Ù ¿É¼Ç ¾Æ·¡ ³ª¿­µÈ ´Ù¾çÇÑ Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â À©µµ¿ì¸¦ Á¦°øÇÑ´Ù. ¿ì¸®´Â Register, Disassembly, Command À©µµ¿ì¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù.

 

 Register À©µµ¿ì¿¡´Â °ªÀ» Æ÷ÇÔÇϰí ÀÖ´Â ÇÁ·Î¼¼¼­ÀÇ ¸ðµç ·¹Áö½ºÅÍ ¸®½ºÆ®¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. ´«Ä¡Ã«°ÚÁö¸¸ ·¹Áö½ºÅÍÀÇ °ªÀÌ ¹Ù²î¸é °ª ±× ºÎºÐÀÇ »ö±òÀÌ »¡°£»öÀ¸·Î º¯ÇÑ´Ù. °£´ÜÇÏ°Ô eip, ebp, esp, eax, ebx, ecx, edx, esi, and edi ·¹Áö½ºÅÍ Áß ´ÙÀ½ÀÇ ·¹Áö½ºÅÍ¿¡ ´ëÇØ¼­¸¸ Àá±ñ ºê¸®ÇÎ ÇϰڴÙ.

 

1. eip - ´ÙÀ½ ½ÇÇàµÉ ¸í·ÉÇàÀÇ ÁÖ¼Ò°ªÀ» °¡Áü

2. ebp - ÇöÀç ½ºÅÃÇÁ·¹ÀÓÀÇ ÁÖ¼Ò°ªÀ» °¡Áü

3. esp - ½ºÅÃÀÇ ²À´ë±â ÁÖ¼Ò°ªÀ» °¡Áü

 

 ³ª¸ÓÁö´Â ÀϹÝÀûÀ¸·Î »ç¿ëµÇ±â À§ÇÑ ·¹Áö½ºÅÍ´Ù. ÀÌ ·¹Áö½ºÅʹ ƯÁ¤ÇÑ ¸í·É¿¡ ÀÇÇØ ÀÌ¿ëµÇ¸ç ¸í·ÉÇà¿¡ ±âÃÊÇÏ¿© ·¹Áö½ºÅͰ¡ »ç¿ëµÇ´Â °Í¿¡ °üÇØ ´Ù ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸¸é IA-32 Command Reference[7]À» Âü°íÇ϶ó.

 

 Disassembly À©µµ¿ì´Â eip ·¹Áö½ºÅÍ¿¡ ÀúÀåµÈ °ª¿¡ ÀÇÇØ ºÒ·ÁÁø ÁÖ¼Ò¿¡ ¾î¼Àºí¸® ¸í·É¾î(instruction)¸¦ Æ÷ÇÔÇÒ °ÍÀÌ´Ù.

 

 Command À©µµ¿ì´Â µð¹ö°Å·Î ¸¸µé¾îÁø ¿äû¹®ÀÇ °á°ú¸¦ Ãâ·ÂÇÑ´Ù. ¾Æ·¡ º¸ÀÌ´Â ¶óÀÎ À©µµ¿ì´Â ÅØ½ºÆ® ¹Ú½ºÀε¥ ¿©±â µð¹ö°Å ¸í·ÉÀ» ÀÔ·ÂÇÑ´Ù. ±× ¿ÞÂÊ ¿·¿¡ º¸ÀÌ´Â ¹Ú½º´Â ÇÁ·Î¼¼½º¸¦ detachÇÑ »óųª ¿äûÀ» ó¸®ÇÒ ¶§, debugee is running ¸Þ½ÃÁö¸¦ »Ñ·ÁÁÙ ¶§ ºóÄ­À¸·Î º¸ÀÏ °ÍÀÌ´Ù. À¯Àú-¸ðµå¿¡¼­ ´ÜÀÏ ·ÎÄà ÇÁ·Î¼¼½º¸¦ µð¹ö±ë ÇÒ¶§¿¡´Â ÀÌ ¹Ú½º¿¡ "0:001>"ÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù. ÇÁ·ÒÇÁÆ®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¿øÇÏ¸é ·¹ÆÛ·±½º ¼½¼Ç[9]¸¦ Âü°íÇ϶ó.

 

 ¿ì¸®°¡ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¸í·É¾îÀÇ Å¬·¡½º¿¡´Â regular, meta, extention(È®Àå±â´É) ÀÌ ÀÖ´Ù. regular(Á¤±Ô) ¸í·É¾î´Â µð¹ö±× ÀÎÅÍÆäÀ̽º¸¦ Çã¿ëÇϸç meta ¸í·É¾î´Â (.)À» ù±ÛÀÚ¿¡ ¾²°í µð¹ö°ÅÀÇ ¼³Á¤À» Á¤ÇÒ ¶§ ¾²ÀδÙ. ±×¸®°í extention ¸í·ÉÀº (!)¸¦ ù±ÛÀÚ¿¡ ¾²°í WinDBGÀÇ Ç÷¯±×Àΰú ¿¬°á½ÃÄÑ ÁØ´Ù.

 

 

5) Áö·Úã±â ·ÎÄÉÀÌÆÃ ½Ã۱â(Locating the WinMine Playing Grid)

 

À©µµ¿ìÀÇ ½ÃÀÛ ¸Þ´º¿¡¼­ Áö·Úã±â ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ°í ¸Þ´º¿¡¼­ »ç¿ëÀÚ Á¤ÀÇ·Î ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.

 

Level: Custom

    Height: 900

    Width:  800

    Mines:  300

Marks: Enabled

Color: Enabled

Sound: Disabled

 

ÀÌÁ¦ ·¹ÆÛ·±½º ¼½¼Æ[12]¿¡ Æ÷ÇԵǾî ÀÖ´Â SetGrid Äڵ带 ÄÄÆÄÀÏ ÇÏ¿© ½ÇÇà ½ÃŰ¸é ¿©·¯ºÐµéÀÇ Áö·ÚÆÇÀÌ ÀÌ ¹®¼­¿¡¼­ ¾ð±ÞÇÏ´Â °Í°ú ¶È°°Àº Áö·ÚÆÇÀ» °¡Áú ¼ö ÀÖ´Ù. WinDBG·Î µ¹¾Æ¿Í F6۸¦ ´©¸£¸é ÇÁ·Î¼¼½º ¸®½ºÆ®°¡ ¶ß´Âµ¥ winmine.exe¸¦ ¼±ÅÃÇÏ°í ¿£ÅÍ۸¦ Ä£´Ù. ±×·¯¸é WinDBG´Â Áö·Úã±â(winmine) ÇÁ·Î¼¼½º¸¦ attach ÇÏ°Ô µÈ´Ù. ¿©·¯ºÐÀº ÀÌÁ¦ Command, Register ±×¸®°í Disassembly Window¿¡ °ªµéÀÌ µé¾î°¡ ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

5.1) ·ÎµåµÈ ¸ðµâµé (Loaded Modules)

 

Command Window¿¡ ÁÖÀǸ¦ ±í°Ô º¸¸é ÇϳªÀÇ ¸ðµâ ½Ã¸®Áî°¡ ·ÎµåµÈ °ÍÀ» º¼ ¼öÀÖ´Ù. ±×¸®°í  winmine ÇÁ·Î¼¼½º°¡ ºê·¹ÀÌÅ© À̽´¿¡ °É¸° »óŸ¦ È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.

 

ModLoad: 01000000 01020000   C:\WINDOWS\System32\winmine.exe

ModLoad: 77f50000 77ff7000   C:\WINDOWS\System32\ntdll.dll

ModLoad: 77e60000 77f46000   C:\WINDOWS\system32\kernel32.dll

ModLoad: 77c10000 77c63000   C:\WINDOWS\system32\msvcrt.dll

...

ModLoad: 77c00000 77c07000   C:\WINDOWS\system32\VERSION.dll

ModLoad: 77120000 771ab000   C:\WINDOWS\system32\OLEAUT32.DLL

ModLoad: 771b0000 772d4000   C:\WINDOWS\system32\OLE32.DLL

(9b0.a2c): Break instruction exception - code 80000003 (first chance)

eax=7ffdf000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004

eip=77f75a58 esp=00cfffcc ebp=00cffff4 iopl=0   nv up ei pl zr na po nc

cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000   efl=00000246

ntdll!DbgBreakPoint:

77f75a58 cc               int     3

 

 ModLoad ´ÙÀ½¿¡ µÎ°³ÀÇ 32 ºñÆ® ¾îµå·¹½º°¡ Ç¥½ÃµÇ´Âµ¥ À̰ÍÀº °¢ ÇÁ·Î¼¼½º¿¡ ¿¬°üµÈ °¡»ó¸Þ¸ð¸®ÀÇ ¹üÀ§¸¦ ³ªÅ¸³»´Â °ÍÀÌ´Ù. ±×¸®°í À̰͵éÀº Áö·Úã±â ÇÁ·Î¼¼½º¿Í ÀÇÁ¸ÀûÀÎ °ü°è¿¡ ÀÖ´Â ¸ðµâµéÀÌ´Ù. ·ÎµåµÈ ¸ðµâÀÇ ¸®½ºÆ®¸¦ º¸±â À§Çؼ­ ´ÙÀ½°ú °°Àº Ä¿¸Çµå¸¦ »ç¿ëÇÑ´Ù: lm, !lm, !dlls

 

±×¸®°í Command Window¿¡ °¢ ½ºÅÜ¿¡ µµ´ÞµÈ °÷ ȤÀº ºê·¹ÀÌÅ©Æ÷ÀÎÆ®¿¡ °É¸° ·¹Áö½ºÅÍ °ªµéÀ» Á¤È®ÇÏ°Ô ³ªÅ¸³»°í ÀÖ´Â °ÍÀ» È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

 

5.2) ·ÎµåµÈ ½Éº¼µé (Loaded Symbols)

 

 ÀÚ ±×·³ ÀÌÁ¦ ´Ù¿î·Îµå ¹ÞÀº Symbol ÆÐŰÁö¸¦ ¼³Ä¡Çϵµ·Ï ÇÏÀÚ. ±×¸®°í Àá±ñ ÈùÆ®¸¦ ÁÖ¸é Command Window¿¡ ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ³»¸®¸é Áö·Úã±â(winmine)¿¡¼­ »ç¿ë°¡´ÉÇÑ Symbol ¸®½ºÆ®¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

 

x WinMine!*

 

 e(x)amine ¸í·É¾î´Â ¸ðµâ À̸§À» À§ÇØ Á¤±Ô Ç¥Çö ¸¶½ºÅ©¿Í °°ÀÌ ´À³¦Ç¥ ¿ÞÂÊ¿¡´Ù ¾²°í ¿À¸¥ÂÊ¿¡´Â ½Éº¼ À̸§À» ¾´´Ù. ´õ ÀÚ¼¼ÇÑ Ç¥Çö ±¸¹®¹ý Á¤º¸¸¦ ¾Ë°í ½Í´Ù¸é ·¹ÆÛ·±½º ¼½¼Ç[10]À» ÂüÁ¶Ç϶ó.

 

Command À©µµ¿ì¿¡¼­ ½Éº¼ ¸®½ºÆ®¸¦ ½ºÅ©·Ñ ÇÒ ¼ö ÀÖ´Ù.

 

...

01003df6 winmine!GetDlgInt = <no type information>

010026a7 winmine!DrawGrid = <no type information>

0100263c winmine!CleanUp = <no type information>

01005b30 winmine!hInst = <no type information>

01003940 winmine!Rnd = <no type information>

01001b81 winmine!DoEnterName = <no type information>

...

 

 ÀÌ ¸®½ºÆ®¸¦ º¸°í ¾î¶² ½Éº¼ÀÌ ÇÔ¼öÀÎÁö º¯¼öÀÎÁö ¸íÈ®ÇÏ°Ô È®ÀÎÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù. À̰ÍÀº WinDBG¸¦ ¶°³ª¼­ ŸÀÔ Á¤º¸°¡ ¾ø±â ¶§¹®ÀÌ´Ù. À̰ÍÀº ÀüÇüÀûÀÎ public ½Éº¼ ÆÄÀÏÀÌ´Ù. °¨»çÇϰԵµ ÇÔ¼ö°¡ ¾Æ´Ñ °ÍÀ¸·Î ºÎÅÍ ÇÔ¼ö¸¦ ºÐº°Çس»´Â ¹æ¹ý·ÐÀÌ ÀÖ±ä ÀÖ´Ù. ±× ±â¼ú¿¡ ¿ä±¸µÇ´Â °ÍÀ̳ª ¾î¼Àºí¸®¸¦ Àд °Í¿¡ ¿©·¯ºÐÀº ¼÷´ÞµÇÁö ¾Ê¾Æ¼­ Àá±ñ µÚ·Î ¹Ì·ç°Ú´Ù. ±× ¿Ü °¡»ó °¡»ó º¸È£¸Þ¸ð¸®¸¦ ½ÃÇèÇØº¸´Â ±â¼ú °°Àº °ÍÀ¸·Î ½±°Ô ÀÌÇØÇÏ°í »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýµéÀ» ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

 


5.3) º¸È£ ¸Þ¸ð¸® (Memory Protection)

 Áö±Ý±îÁö ÀÀ¿ëÇÁ·Î±×·¥ ¸Þ¸ð¸®¿Í °ü·ÃµÈ ³íÀÇ¿¡ ´ëÇØ ÇÇÇØ ¿Ô¾ú´Ù. ±×·¸´Ù°í Áö±ÝºÎÅÍ À©µµ¿ì ¸Þ¸ð¸®ÀÇ ³»ºÎ °ü¸®°¡ ¾î¶»°Ô µ¹¾Æ°¡´ÂÁö µéÃç³¾ »ý°¢Àº ¾ø´Ù. ¿ì¸®°¡ Á¢±ÙÇØ °¡´Â °ü½É»ç´Â °£°áÇÔÀ» À¯ÁöÇϸ鼭µµ ´ç¸éÇÑ ½Ç¸®À§ÁÖÀÇ ÇÊ¿ä»çÇ׸¸ ¾ð±ÞÇϵµ·Ï ÇÒ °ÍÀÌ´Ù.

 ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸®¸¦ ¿äû ÇÒ ¶§, ±× ¿äûµÈ ¿ë·®ÀÌ Çã¿ë °¡´ÉÇÏ´Ù¸é ¾î¶² ¿µ¿ª(region)¸¦ È®º¸ÇÏ°Ô µÈ´Ù. ÇÒ´ç(allocation)ÀÌ ¼º°øÀûÀ¸·Î µÇ¾ú´Ù¸é ÀÌ ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀº ´Ù¸¥ ¹«¾ùÀ¸·ÎºÎÅÍ º¸È£ µÈ´Ù. ´õ ¼¼ºÎÀûÀ¸·Î ¾ê±âÇϸé ÀÌ ¿µ¿ª¿¡´Â ƯÁ¤ ¾×¼¼½º ŸÀÔÀ» Çã¿ëÇÒ °ÍÀÎÁö °ÅºÎÇÒ °ÍÀÎÁö puedo access control ¸®½ºÆ®¸¦ ÅëÇØ Àû¿ëµÈ´Ù. ÀÌ ¾×¼¼½º ŸÀÔÀÇ ¿¹¸¦ µé¾î º¸¸é Á¤º¸¸¦ ÀÐÀ» ¼ö ÀÖ´Â ¾×¼¼½º ŸÀÔ, Á¤º¸¸¦ ¾µ ¼ö ÀÖ´Â ¾×¼¼½º ŸÀÔ, ¸í·ÉÀ» ½ÇÇàÇÏ´Â °ÍµéÀÌ´Ù. ÀÌ·± ¾×¼¼½º ŸÀÔÀº ½Éº¼ÀÌ ÇÔ¼öÀÎÁö ¾Æ´ÑÁö °¡´ÉÇÑ ³ôÀº ¼öÁØÀ¸·Î È®ÀÎÇÒ ¼ö ÀÖ´Â ¿©·ÂÀ» Á¦°øÇÑ´Ù. ÇÔ¼ö·Î¼­ Á¸ÀçÇÑ´Ù´Â °ÍÀÇ ÀÌÁ¡À¸·Î ±× ¸Þ¸ð¸® ¿µ¿ª¿¡¼­´Â '½ÇÇà'À» Çã¶ôÇÑ´Ù´Â ÀǹÌÀÌ´Ù. °Å²Ù·Î ÀÌ ¸Þ¸ð¸® ¿µ¿ªÀÌ º¯¼ö¸¦ À§ÇÑ ¿µ¿ª ÀÏ ¶§´Â ½ÇÇàÀ» Çã¶ôÇÏÁö ¾Ê´Â´Ù. IA-32 ¾ÆÅ°ÅØÃÄÀÇ ¸Þ¸ð¸® ÆäÀÌÁö´Â º¸È£ ¸Þ¸ð¸®ÀÓ¿¡µµ ºÒ±¸Çϰí Çϵå¿þ¾î ·¹º§¿¡¼­ ½ÇÇàµÈ´Ù. Æí¸®ÇϰԵµ WinDBG´Â »ç¿ëÀÚ¿¡°Ô ÁÖ¾îÁø ÁÖ¼ÒÁöÀÇ º¸È£¸Þ¸ð¸®¸¦ °Ë»ö ÇÒ ¼ö ÀÖµµ·Ï Çã¶ôÇÏ´Â È®Àå±â´ÉÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ÀÌ È®Àå±â´ÉÀÇ ¸í·É¾î´Â '!vprot' ÀÌ´Ù. ÀÌ ±â´ÉÀ» È®ÀÎÇϱâ À§ÇØ ÀûÀýÇÑ ½Éº¼ À̸§À» ¼±ÅÃÇÏ°í ´ÙÀ½°ú °°ÀÌ Command Window¿¡ ŸÀÌÇÎÇÑ´Ù:

!vprot WinMine!ShowBombs

 

ShowBombs´Â ÇÔ¼öÀÓÀ» ¾Ï½ÃÇϰí ÀÖ´Ù.
±×·³ !vprot ÀÌ ¹«¾ùÀ» ¸»Çϰí ÀÖ´ÂÁö »ìÆìº¸ÀÚ:

BaseAddress:       01002000
AllocationBase:    01000000
AllocationProtect: 00000080 PAGE_EXECUTE_WRITECOPY
RegionSize:        00003000
State:             00001000 MEM_COMMIT
Protect:           00000020 PAGE_EXECUTE_READ
Type:              01000000 MEM_IMAGE

 

 ´ëÃæ ºÃÀ» ¶§ ¾î·Æ°Ô º¸ÀÏ ¼öµµ ÀÖ´Ù. ±×·¯³ª AllocationProtect Çʵå´Â Àüü ¸Þ¸ð¸® ¿µ¿ªÀ» À§ÇÑ µðÆúÆ® º¸È£¸ðµå¸¦ ³ªÅ¸³»´Â °ÍÀÌ´Ù. Protect Çʵå´Â óÀ½¿¡ ¸»Çß´ø ´ë·Î Ưº°ÇÑ ¿µ¿ª¿¡ ´ëÇÑ ÇöÀçÀÇ º¸È£¸ðµå¸¦ ³ªÅ¸³½´Ù. À̰ÍÀº PAGE_EXECUTE_READ¿¡ Ç¥½ÃµÈ °Íó·³ ÀÐ°í ½ÇÇàÇϱâ À§ÇØ ¼¼ÆÃµÇ¾î ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ´ÙÀ½Àº WinMine!scClass¿Í °°ÀÌ º¯¼ö·Î ÀǽɵǴ °Í¿¡ À§Ä¡ÇÑ ¿µ¿ªÀÇ º¸È£¸ðµå¿¡ °üÇØ »ìÆìº¸ÀÚ.

!vprot WinMine!szClass

¿ì¸®ÀÇ ±â´ë´ë·Î¶ó¸é !vprotÀº ±× ¿µ¿ª¿¡ ´ëÇØ ÀÐ°í ¾µ ¼ö ÀÖ´Â °Í¸¸ Çã¶ôÇÏ´Â ÆäÀÌÁö º¸È£¸ðµå¸¦ Ãâ·ÂÇØ¾ß ÇÑ´Ù.

BaseAddress:       01005000
AllocationBase:    01000000
AllocationProtect: 00000080 PAGE_EXECUTE_WRITECOPY
RegionSize:        00001000
State:             00001000 MEM_COMMIT
Protect:           00000004 PAGE_READWRITE
Type:              01000000 MEM_IMAGE


 ¿ì¸®°¡ ±â´ëÇß´ø ´ë·Î Ãâ·ÂµÇ¾ú´Ù. À̸§¿¡ ´ëÇÑ ±ÔÄ¢À¸·Î ÆÇ´ÜÇØ º¼ ¶§(¾Õ¿¡ ºÙÀº sz °°Àº °Í), ½ºÆ®¸µ ŸÀÔÀÓÀ» ¾Ï½ÃÇϰí Àִµ¥ ÀÌ ¸Þ¸ð¸® À§Ä¡¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ½ÇÇèÇØº½À¸·Î½á ¿ì¸®°¡ °¡Á¤Çϰí ÀÖ´Â°É È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù. ÀÌ ÀÛ¾÷À» Çϱâ À§Çؼ­ ¸Þ¸ð¸® Ãâ·Â ¸í·É¾î¸¦ ´ÙÀ½°ú °°ÀÌ Å¸ÀÔÇÎÇÑ´Ù:

du WinMine!szClass

'u' º¯°æÀÚ´Â ¸Þ¸ð¸® Ãâ·Â ¸í·É¾î¿Í ÇÔ²² ¾²¸é À¯´ÏÄÚµå ½ºÆ®¸µÀ» ÇØ¼®ÇÒ ¼ö ÀÖ´Ù. Ãâ·Â °á°ú´Â ´ÙÀ½°ú °°ÀÌ:

01005aa0 "Minesweeper" (ÇÑ±ÛÆÇ¿¡¼­´Â Áö·Úã±â·Î Ãâ·Â µÊ)

È®ÀÎÇÒ ¼ö ÀÖ´Ù.

5.4) ¾î¼Àºí¸®ÀÇ ÀÌÇØ (Understanding Assemblies)
 ÀÌ Ã©ÅÍÀÇ ¸ñÀûÀº Áö·ÚÆÇÀÌ Á¸ÀçÇÏ´Â °÷¿¡ À§Ä¡ÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀ» ¸í½ÉÇÏ°í ¾Õ¼­ È®ÀÎµÈ ShowBombs ÇÔ¼ö¸¦ ´Ù½Ã È®ÀÎÇÏÀÚ. ´ÙÀ½°ú °°Àº ¸í·ÉÀ¸·Î ÀÌ ÇÔ¼ö¿¡ ºê·¹ÀÌÅ©Æ÷ÀÎÆ®¸¦ °É¾îº¸ÀÚ:

bp WinMine!ShowBombs

 

 WinDBG´Â ºê·¹ÀÌÅ©Æ÷ÀÎÆ®°¡ ¼º°øÀûÀ¸·Î ¼¼ÆÃ µÇ¾ú´ÂÁö ¸íÈ®ÇÑ Çǵå¹éÀ» ÁÖÁö ¾Ê´Â´Ù. ±×·¯³ª WinDBG´Â ¿äûµÈ À̸§À̳ª ÁÖ¼Ò¸¦ ÇØ¼®ÇÏÁö ¸øÇÒ ¶§ »ç¿ëÀÚ¿¡°Ô °æ°íÇÒ °ÍÀÌ´Ù. ºê·¹ÀÌÅ©Æ÷ÀÎÆ®°¡ °É¸° ¸®½ºÆ®¸¦ º¸±â À§Çؼ­´Â ´ÙÀ½°ú °°Àº ¸í·É¾î¸¦ ÀÔ·ÂÇÑ´Ù:

bl

ÀÌ ¸í·É¾î´Â ´ÙÀ½°ú °°Àº Ãâ·ÂÀ» ÇÒ °ÍÀÌ´Ù:

0 e 01002f80     0001 (0001)  0:*** WinMine!ShowBombs

 

 °¡Àå ¾ÕÀÇ ¼ö´Â ºê·¹ÀÌÅ© Æ÷ÀÎÆ®ÀÇ ¼ýÀÚ¸¦ ³ªÅ¸³½´Ù. ¹Ù·Î µÚ´Â (e)nable ȤÀº (d)isable ÀÎÁö ºê·¹ÀÌÅ©Æ÷ÀÎÆ® »óÅ Á¤º¸¸¦ ¾Ë·ÁÁØ´Ù. ´ÙÀ½Àº ºê·¹ÀÌÆ®ÄÚÀÎÆ®ÀÇ °¡»óÁÖ¼Ò´Ù. ´ÙÀ½ 4ÀÚ¸® ¼ö´Â ºê·¹ÀÌÅ©Æ÷ÀÎÆ®°¡ Ȱ¼ºÈ­µÉ ¶§±îÁöÀÇ ³²Àº ¼ö¸¦ ÀǹÌÇÑ´Ù. ±× ´ÙÀ½ °ýÈ£¾ÈÀÇ ¼ö´Â óÀ½À¸·Î Åë°úµÈ Ä«¿îÆ®ÀÌ´Ù. ´ÙÀ½Àº ÇÁ·Î¼¼½º ¹øÈ£Àε¥ ÇÁ·Î¼¼½º ID¿Í È¥µ¿ÇÏÁö ¸¶¶ó. ÄÝ·ÐÀ¸·Î ºÐ¸®µÈ °ÍÀº ƯÁ¤ ¾²·¹µåÀÇ ºê·¹ÀÌÅ©Æ÷ÀÎÆ®À϶§ ¾²·¹µå ID¸¦ ³ªÅ¸³½´Ù. ¾²·¹µå°¡ ¾Æ´Ï¹Ç·Î º°Ç¥·Î ³ªÅ¸³½´Ù. ¸¶Áö¸·À¸·Î ¸ðµâ À̸§À̰ųª WinDBG°¡ ºê·¹ÀÌÅ©°¡ °É¸° ½Éº¼/ÇÔ¼ö ÀÌ´Ù.

 

 Áö·Úã±â¸¦ µ¿ÀÛ»óÅ·Πµ¹¸®±â À§ÇØ F5(Go) ³ª 'g'¸¦ Command Window¿¡ ÀÔ·ÂÇÑ´Ù. ±×·¯¸é ¿©·¯ºÐÀº WinDBG¿¡¼­ "Debugee is running"À̶ó´Â ¸Þ½ÃÁö¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. Áö·Úã±â À©µµ¿ì·Î ÀüȯÇÏ¿© °¡Àå À§ÂÊÀÇ ¿ÞÂÊ ¹Ú½º¸¦ Ŭ¸¯ÇÏ¸é ¹Ú½º¿¡ 2¼ýÀÚ°¡ ³ªÅ¸³­´Ù. ´ÙÀ½ ¿À¸¥ÂÊ ¹Ú½º¸¦ Ŭ¸¯ÇÏ¸é ºÐ¸í ÆøÅºÀÌ ³ªÅ¸³ª¸é¼­ Áö·Úã±â¸¦ ´õÀÌ»ó ÄÁÆ®·Ñ ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. À̰ÍÀº WinDBG°¡ ºê·¹ÀÌÅ©Æ÷ÀÎÆ® »óŸ¦ ¸¸³ª¼­ ¸í·ÉÀ» ±â´Ù¸®°í Àֱ⠶§¹®ÀÌ´Ù. WinDBG·Î µ¹¾Æ¿Í Command Window¿¡ ´ÙÀ½ÀÇ ¸í·ÉÇà ºÎºÐ¿¡ ÇÏÀ̶óÀÌÆ® µÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

01002f80 a138530001       mov     eax,[WinMine!yBoxMac (01005338)]

 

 À̰ÍÀº ShowBombs ÇÔ¼öÀÇ Ã³À½ ¸í·ÉÇà ºÎºÐÀÌ´Ù. ÀÌ ÁÖ¼Ò´Â ¾Æ±î ºê·¹ÀÌÅ©Æ÷ÀÎÆ® ¸®½ºÆ®¿¡¼­ È®ÀÎÇß´ø °Í°ú ÀÏÄ¡ÇÑ´Ù. ÀÌ ¸í·ÉÇàÀ» ÀÌÇØÇϱâ Àü¿¡ IA-32 ¾î¼Àºí¸®¿¡ °üÇØ ¾Ë¾Æº¸ÀÚ.  À̰ÍÀ¸·Î ¿©·¯ºÐÀº éÅÍ 2¿¡¼­ ¾ð±ÞµÇ¾ú´ø °Í¿¡ ´ëÇØ È®½ÅÀ» °¡Áú ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 µð½º¾î¼Àºí µÈ °¢ ÇàÀº ÇϳªÀÇ ¸í·ÉÀ» ¶æÇÑ´Ù. À§ÀÇ ¸í·ÉÇàÀ» Ç®ÀÌ ÇÏ¸é ´ÙÀ½°ú °°Àº ½ÄÀ¸·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.

 

<address> <opcodes> <mnemonic> <operand1>, <operand2>

 

 <address>´Â ÀÇ °¡»óÁÖ¼Ò À§Ä¡¸¦ ³ªÅ¸³½´Ù. <opcode>´Â ÇÁ·Î¼¼¼­°¡ ÇØ¼®ÇÏ¿© ¼öÇàÇÒ ¼ö ÀÖ´Â ¹®ÀÚ ±×´ë·ÎÀÇ ¸í·É(instruction)ÀÌ´Ù. ±× ÀÌÈÄ ¿À¸¥ÂÊ¿¡ ³ª¿­µÈ °ÍµéÀº ¾î¼Àºí¸® ¾ð¾î·Î ¹ø¿ªµÈ °ÍµéÀε¥ <mnemonic> ´Â °¢ <operand>(¸Å°Ôº¯¼ö °°Àº ¿ªÇÒ)¸¦ ´Ù·ç±â À§ÇÑ µ¿»ç ¿ªÇÒÀ» ÇÑ´Ù. ÀÎÅÚ°è¿­ ¾î¼Àºí¸®¿¡¼­´Â ¿À¸¥ÂÊÀÇ °ÍÀ» ¿ÞÂÊÀ¸·Î À̵¿½ÃŲ´Ù´Â °Í¿¡ ÁÖÀÇÇÏÀÚ. Áï »ê¼úÀ̳ª µ¥ÀÌÅ͸¦ À̵¿½Ãų ¶§ ¿¡ <operand1>¿¡ °á°ú¸¦ ÀúÀåÇÑ´Ù.

 ´Ù½Ã ¿ø·¡ÀÇ ¸í·ÉÇàÀ» ÇØ¼®Çغ¸¸é eax¿¡ 0x1005338ÀÇ À§Ä¡ÇÑ 32ºñÆ®ÀÇ ¿öµå °ªÀ» À̵¿½Ã۶ó´Â Àǹ̰¡ µÈ´Ù. ´ë°ýÈ£([,])´Â ±× ÁÖ¼Ò¿¡ Æ÷ÇÔµÈ °ªÀ» »ç¿ëÇÒ ¶§ ¾²ÀδÙ. À̰ÍÀº C¿¡¼­ Æ÷ÀÎÅÍ(*)¸¦ »ç¿ëÇÏ´Â °Í°ú ºñ½ÁÇÏ´Ù. eax ·¹Áö½ºÅÍ¿¡ mov ¸í·ÉÀ» ¼öÇà ÇÒ ¶§ÀÇ opcode¸¦ º¸¸é 0xa1ÀÌ Æ÷ÇÔ µÇ¾î ÀÖ´Ù´Â °ÍÀ» ã¾Æ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

Opcode Instruction      Description
...
A0     MOV AL,moffs8*   Move byte at (seg:offset) to AL.
A1     MOV AX,moffs16*  Move word at (seg:offset) to AX.
A1     MOV EAX,moffs32* Move doubleword at (seg:offset) to EAX.
...

 

 opcodeÀÇ Ã¹¹øÂ° ¹ÙÀÌÆ®°¡ 0xa1·Î ¸ðµÎ µ¿ÀÏÇÏÁö ¾Ê´Ù. <operand2>¿Í °ü·ÃÇØ¼­´Â ´ÙÀ½¿¡ »ìÆìº¼ endianness Àå¿¡¼­ ³íÀÇÇϵµ·Ï ÇϰڴÙ.


5.5) Endianness

 ¸ÖƼ¹ÙÀÌÆ®°¡ ÀúÀå µÉ ¶§ ±× ¼ø¼­¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ Endianness(¿¡µð¾È)ÀÌ´Ù. Ednianness¿¡´Â µÎ°¡ÁöÀÇ ¹æ½ÄÀÇ ±ÔÄ¢ÀÌ Àִµ¥ ±×°ÍÀÌ ¹Ù·Î little ¿¡µð¾È °ú big ¿¡µð¾È ÀÌ´Ù.  IA-32 ¾ÆÅ°ÅØÃÄ¿¡¼­ little ¿¡µð¾ÈÀº ¸¶Áö¸· ¹ÙÀÌÆ®¸¦ °¡Àå óÀ½ ¹ÙÀÌÆ®·Î ÀúÀåÇÏ´Â ¹æ½ÄÀ̰í big ¿¡µð¾ÈÀº ±× ¹Ý´ë´Ù. ¿¹¸¦ µé¾î 0x11223344 °¡ ÀÖÀ»¶§ little ¿¡µð¾ÈÀº 0x44332211·Î ÀúÀåÇϰí big ¿¡µð¾ÈÀº 0x11223344·Î ÀúÀåÇÑ´Ù.

0x01005338 ÀÌ ÀÖÀ» ¶§ little ¿¡µð¾ÈÀÇ ¹ÙÀÌÆ® ¼ø¼­´ë·Î ³ª¿­ÇÏ¸é ´ÙÀ½°ú °°ÀÌ ¿¡ ÀúÀåµÈ´Ù.

0x01005338, rewritten for clarity: 0x01 0x00 0x53 0x38
                                      |    |    |    |
                                      |    |    +----|-+
                                      |     +--------|-|-+
                                      +--------------|-|-|-+
                                                     V V V V
                                                  0x38530001


¿¡µð¾È¿¡ °üÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ·¹ÆÛ·±½º ¼½¼Ç[5]¸¦ Âü°í Ç϶ó.


5.6) Conditions

 Áö·ÚÆÇÀÇ À§Ä¡¸¦ ã¾Æ ³»´Â ¸ñÀû¿¡ µµ´ÞÇϱâ À§ÇØ »õ·Î¿î Á¤º¸¸¦ »ìÆìº¸µµ·Ï ÇÏÀÚ. ÇöÀç ÇÑ ¸í·ÉÇุ ¼öÇàÇÏ°í ºê·¹ÀÌÅ©¸¦ °É±â À§ÇØ F10 ۸¦ ´©¸£°Å³ª Command Window(ÀÌÇÏ Ä¿¸ÇµåÀ©µµ¿ì) ¿¡¼­ 'p'¸¦ Ä£´Ù. ¸ÕÀú ¹æ±Ý ÀüÀÇ ¸í·ÉÇàÀÌ »¡°£»öÀ¸·Î ÇÏÀ̶óÀÌÆ® µÇ°í ¹Ù·Î ¾Æ·¡ ÆÄ¶õ»öÀ¸·Î ÇÏÀ̶óÀÌÆ® µÇ´Â °ÍÀ» ´«Ä¡Ã§ °ÍÀÌ´Ù. ±âº»ÀûÀ¸·Î WinDBG¿¡¼­ ºê·¹ÀÌÅ©Æ÷ÀÎÆ® ÄÁµð¼Ç¿¡ »¡°£»ö, ÇöÀçÀÇ ´ë±âÁßÀÎ ¸í·ÉÇàÀº ÆÄ¶õ»öÀ¸·Î Ç¥½ÃÇÑ´Ù. ±×¸®°í Register Window ÀÇ ·¹Áö½ºÅÍ °ªµé Áß »¡°£»öÀ¸·Î º¯ÇÑ °ÍÀº °ªÀÌ º¯°æµÇ¾ú´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. eax °ª¿¡´Â 0x18 °ªÀ¸·Î ¾÷µ¥ÀÌÆ® µÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿©±â¼­ 0x18Àº 10Áø¼ö·Î 24ÀÌ´Ù. Áö±Ý ¿ì¸®°¡ Ç÷¹ÀÌ Çϰí ÀÖ´Â Áö·ÚÆÇÀº 800x900À¸·Î »ç¿ëÀÚÁ¤ÀÇ ¿É¼Ç¿¡ ³Ö¾úÀ½¿¡µµ ºÒ±¸Çϰí 30x24·Î ¸¸µé¾î Á³À½À» ¾Ë ¼ö ÀÖ´Ù. Áö·Úã±â¸¦ ´Ù½Ã ½ÇÇà½ÃÄÑ ¿©·¯°¡Áö Áö·ÚÆÇ Å©±â·Î º¯°æÇØ º¸¸é ½±°Ô È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¾î°ư ¹®¼­ÀÇ °£°áÇÔÀ» À§ÇØ ´ÙÀ½°ú °°Àº »óŸ¦ ¿ì¸®´Â È®ÀÎÇÒ ¼ö ÀÖ´Ù.

winmine!yBoxMac == Height of Playing Grid

 

±×¸®°í ´ÙÀ½ ¸í·ÉÇàµéÀ» »ìÆìº¸ÀÚ:

 

01002f85 83f801 cmp     eax,0x1
01002f88 7c4    jl      winmine!ShowBombs+0x58 (01002fd8)

 

 Ã¹¹øÂ° ÇàÀº ÃÖ´ë Áö·ÚÆÇÀÇ ³ôÀÌ °ª°ú 0x1À» ºñ±³Çϰí ÀÖ´Ù. ¾Æ·¡ÀÇ ·¹ÆÛ·±½ºÀÇ ¹®¼­¸¦ È®ÀÎÇØ º¸¸é ¾Ë°ÚÁö¸¸ cmp ¸í·ÉÀº ±× °á°ú°¡ EFLAG[6]¿¡ ºñÆ®°ªÀ¸·Î ¼¼ÆÃµÈ´Ù. ±× ´ÙÀ½ ¸í·ÉÇàÀº Á¡ÇÁÇ϶ó´Â ÀǹÌÀε¥ ÀÌ ¸í·ÉÇàÀº "±× °ªÀÌ 0x1º¸´Ù ÀÌÇÏÀÏ ¶§" 0x01002fd8·Î Á¡ÇÁÇ϶ó´Â ÀǹÌÀÌ´Ù. jlÀÇ ¾Õ ¹®ÀÚ 'j'¸¦ ÅëÇØ jmp¸¦ ÀǹÌÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. 'l'Àº 'less' ¸¦ ÀǹÌÇÑ´Ù. ÀÌ ¸í·ÉÇàÀ» ÀϹÝÀûÀ¸·Î ´ÙÀ½°ú °°Àº ÄÚµå·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.

 

if(iGridHeight < 1) {
        //jmp winmine!ShowBombs+0x58
}

 

 ÀÌ·¸°Ô ÀÇ»çCÄÚµå·Î Ç¥ÇöÇÏ´Ù º¸¸é º¹ÀâÇÑ ÇÔ¼ö¸¦ ÀÌÇØÇϴµ¥ ¸¹Àº µµ¿òÀÌ µÈ´Ù. ±×·³ 0x18°ú ºñ±³µÇ¾úÀ¸¹Ç·Î Á¡ÇÁ¸¦ ÇÇÇØ°¥ °ÍÀÓÀ» ¿¹»óÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ¿ì¸®ÀÇ Çб¸¿åÀ» À§ÇØ Command Window¿¡ ´ÙÀ½°ú °°Àº ¸í·ÉÀ» ½ÇÇà ½ÃÄÑ º¸ÀÚ.

u 0x1002fd8

 

±×·¯¸é ÀÌ ¸í·ÉÀ» ÅëÇØ, ¸¸¾à Á¡ÇÁµÇ¾úÀ» ¶§ÀÇ ¸í·É¾îµéÀ» º¸¿© ÁÙ °ÍÀÌ´Ù.


5.7) ½ºÅðú ÇÁ·¹ÀÓ(Stack and Frames)

¿ì¸®´Â 'u' ¸í·É¾î¸¦ ÅëÇØ WinDBG¿¡¼­ (u)nassemble µÈ Á¤º¸¸¦ ´ÙÀ½°ú °°Àº ÁÖ¼Ò À§Ä¡¿¡¼­ ã¾Æ º¼ ¼ö ÀÖ´Ù.

01002fd8 e851f7ffff     call    WinMine!DisplayGrid (0100272e)
01002fdd c20400         ret     0x4

 

 ÀÌ ÄÚµå´Â ShowBombsÇÔ¼ö°¡ DisplayGridÇÔ¼ö¸¦ È£ÃâÇϰí ÀÚ½Å(ShowBombs ÇÔ¼ö)À» ºÒ·¶´ø È£ÃâÀÚ¿¡°Ô ¸®ÅÏÇÏ´Â °ÍÀÌ´Ù. ±×·±µ¥ 'È£Ãâ(=call)'Àº µµ´ëü ¹«½¼ ÀÏÀ» ÇÏ´Â °ÍÀ̸ç, retÀº ¾îµð·Î µ¹·ÁÁÖ´Â °ÍÀ̰í 0x4´Â ¶Ç ¹¹¶õ ¸»Àΰ¡? IA-32 Command Reference¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ ¼­¼úÇϰí ÀÖ´Ù. "½ºÅÿ¡ ÇÁ·Î½ÃÁ®¸¦ ¿¬°áÇÒ ¼ö ÀÖ´Â Á¤º¸¸¦ ÀúÀåÇϰí destination operand(Ÿ°Ù) ¿¡ ÁöÁ¤µÈ ÇÁ·Î½ÃÀú·Î ºÐ±âÇÑ´Ù. ÀÌ Å¸°Ù operand´Â È£ÃâµÈ ÇÁ·Î½ÃÀú ³»ÀÇ ÃÖÃÊÀÇ instruction ÁÖ¼Ò¸¦ ±âÀÔÇÑ´Ù."  Command Reference¿¡´Â call ŸÀÔ¿¡ Á¾¼ÓµÇ¾î ÀÖ´Â call instructionÀ» À§ÇÑ º¯¼ö ÇàÀ§¿¡ ´ëÇØ ¾ð±ÞÇϰí ÀÖ´Ù. ±×·¯´Ï±î callÀÌ ¹«½¼ ÀÏÀ» ÇÏ´ÂÁö È®ÀÎÇϱâ À§ÇØ opcode¸¦ »ìÆìºÃÀ» ¶§ ¿ì¸®´Â 0xe8À» ãÀ» ¼ö ÀÖ´Ù. 0xe8Àº near call(±ÙÁ¢È£Ãâ) À» ÀǹÌÇÑ´Ù. "near call ÀÌ ½ÇÇà µÉ ¶§, ÇÁ·Î¼¼¼­´Â EIP ·¹Áö½ºÅÍÀÇ °ª(CALL ¸í·ÉÇà¿¡ µû¸£´Â ´ÙÀ½ ¸í·ÉÇàÀÇ offset °ªÀ» °¡Áö°í ÀÖÀ½)À» ½ºÅÃ(º¹±Í ¸í·ÉÇàÀ» °¡¸®Å°´Â °ª)¿¡ ÀúÀå(push) ÇÑ´Ù." À̰ÍÀÌ ÇÁ·¹ÀÓÀ» ¸¸µå´Â ù¹øÂ° ´Ü°èÀÌ´Ù. °¢°¢ ÇÔ¼ö ÄÝÀÌ ¸¸µé¾î Áú ¶§ È£ÃâµÈ ÇÔ¼ö°¡ ¸Å°Ôº¯¼ö¿¡ ¾×¼¼½º Çϰųª, ·ÎÄà º¯¼ö¸¦ ¸¸µé°Å³ª, È£ÃâÇÑ ÇÔ¼ö¿¡ º¹±ÍÇÏ´Â ¸ÞÄ¿´ÏÁòÀ» À§ÇØ ¶Ç´Ù¸¥ ÇÁ·¹ÀÓÀÌ »ý¼ºµÇ¾îÁø´Ù. ÇÁ·¹ÀÓÀÇ ±¸Á¶¿¡ ´ëÇØ¼­´Â ÇÔ¼ö È£Ãâ ±ÔÄ¢¿¡ µû¸£´Âµ¥ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â ·¹ÆÛ·±½º ¼½¼Ç[1]À» Âü°íÇ϶ó.  ÇöÀç call stackÀ» º¸°í ½Í°Å³ª °¢°¢ ¿¬°áµÈ ÇÁ·¹ÀÓ ½Ã¸®Á º¸±â À§ÇØ 'k' ¸í·É¾î¸¦ ÀÌ¿ëÇÑ´Ù.:

ChildEBP RetAddr
0006fd34 010034b0 winmine!ShowBombs
0006fd40 010035b0 winmine!GameOver+0x34
0006fd58 010038b6 winmine!StepSquare+0x9e
0006fd84 77d43b1f winmine!DoButton1Up+0xd5
0006fdb8 77d43a50 USER32!UserCallWinProcCheckWow+0x150
0006fde4 77d43b1f USER32!InternalCallWinProc+0x1b
0006fe4c 77d43d79 USER32!UserCallWinProcCheckWow+0x150
0006feac 77d43ddf USER32!DispatchMessageWorker+0x306
0006feb8 010023a4 USER32!DispatchMessageW+0xb
0006ff1c 01003f95 winmine!WinMain+0x1b4
0006ffc0 77e814c7 winmine!WinMainCRTStartup+0x174
0006fff0 00000000 kernel32!BaseProcessStart+0x23

 

 ÀÌ Á¤º¸¸¦ Åä´ë·Î ¿©·¯ºÐÀº ÀÀ¿ëÇÁ·Î±×·¥ÀÇ È帧À» ¿ª¼ø¼­·Î ÃßÀûÇØ ³ª°¥ ¼ö ÀÖ´Ù. Call Stack Window ¿¡¼­ Alt+6À» ´­·¯ ºÒ·¯ ³»¸é º¸´Ù ½±°Ô call stackÀ» »ìÆìº¼ ¼ö ÀÖ´Ù. ÀÌ À©µµ¿ì¿¡ ³ªÅ¸³­ call stack Á¤º¸´Â Ç¥ Çü½ÄÀ¸·Î ³ªÅ¸³»¾î Á» ´õ Àß °£Ãß·Á º¸¿©ÁÖ°í ÀÖ´Ù. ÀÌ call stack Á¤º¸¸¦ ÅëÇØ ÀÌÁ¦ retÀÌ µµ´ëü ¾îµð·Î ÇâÇϴ°¡¿¡ ´ëÇØ ¾Õ¼­ Áú¹®Çß´ø ¹°À½¿¡ ´ë´äÀ» ã¾Æ ³¾ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ShowBombs°¡ ¸®Å쵃 ¶§ eip(Instruction Pointer) ·¹Áö½ºÅÍ¿¡´Â 0x010034b0À¸·Î ¼¼ÆÃ µÉ °ÍÀÌ´Ù. ¸¶Áö¸·À¸·Î ¿ì¸®´Â 0x4ÀÇ Á߿伺À» ret ¸í·É¿¡ ÀÇÇØ Á¤ÀÇµÇ¾î °ªÀ» ³ªÅ¸³»´Â ÇüŸ¦ ÅëÇØ ¾Ë ¼ö°¡ ÀÖ´Ù. "....¸®ÅÏ ¾îµå·¹½º°¡ popµÈ ÈÄ ¹æÃâµÇ´Â ½ºÅÃÀÇ ¹ÙÀÌÆ® ¼ö´Â, ±âº»°ªÀ¸·Î noneÀÌ´Ù. ÀÌ operand(retÀ» ¸»ÇÔ)´Â ´õ ÀÌ»ó Çʿ䰡 ¾ø¾îÁö°Å³ª È£ÃâµÈ ÇÁ·Î½ÃÁ®°¡ ³¡³­ »óÅÂÀÇ ½ºÅÿ¡¼­ ÆÄ¶ó¹ÌÅ͸¦ ¹æÃâÇÑ´Ù."  Á» ´õ ¸íÈ®ÇÏ°Ô ÇÁ·Î¼¼¼­°¡ ret(º¹±Í) instruction(¸í·É)À» ¸¸³ª¸é ½ºÅÃÀÇ ²À´ë±â¿¡ ÀÖ´Â Áï ESP°¡ °¡¸®Å°°í ÀÖ´Â °ªÀ» ºÒ·¯ µé¿© EIP ·¹Áö½ºÅÍ¿¡ ÀúÀåÇÑ´Ù. ¸¸¾à ret instruction ÀÌ operand °ªÀ» °¡Áö¸é operand´Â ½ºÅÃÀÇ ²À´ë±â(Top of the Stack)¿¡¼­ ¾ó¸¶³ª ¸¹Àº ¹ÙÀÌÆ®°¡ Á¦°ÅµÇ¾î¾ß ÇÏ´ÂÁö Ç¥½ÃÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ Áö½ÄÀ» Åä´ë·Î ÀÌÁ¦ ¿ì¸®´Â '32ºñÆ®ÀÇ ÁÖ¼Ò´Â 4¹ÙÀÌÆ® ±æÀ̸¦ °¡Áö´Ï±î ShowBombs ÇÔ¼ö´Â ÇϳªÀÇ Àμö(argument)¸¦ ¼ö¿ëÇϰí ÀÖ´Ù'´Â °ÍÀ¸·Î ÆÇ´Ü ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

ÀÚ ´Ù½Ã ÇÏ´ø ÀÏ·Î µ¹¾Æ¿Í ShowBombs ÇÔ¼ö°¡ ÇÏ´Â ÀÏÀ» ´ÙÀ½°ú °°Àº ÄÚµå·Î ³ªÅ¸³¾ ¼ö ÀÖ´Ù:

 

if(iGridHeight < 1) {
        DisplayGrid();
        return;
} else {
        //do stuff
}

 

°è¼ÓÇØ¼­ Disassemble Window¿¡ ³ª¿ÍÀÖ´Â ´ÙÀ½ Çà(//do stuff ºÎºÐ)µéÀ» »ìÆìº¸ÀÚ.

 

01002f8a 53               push    ebx
01002f8b 56               push    esi
01002f8c 8b3534530001     mov     esi,[winmine!xBoxMac (01005334)]
01002f92 57               push    edi
01002f93 bf60530001       mov     edi,0x1005360

 

 EIP °¡ 0x1002f8a°¡ µÉ ¶§±îÁö WinDBG¿¡¼­ ½ºÅÜÇÎ('p'¸¦ µÎ¹ø ¼öÇà) ÇØº¸ÀÚ. ¾ÕÀÇ µÎ ¸í·ÉÇàÀº ebx¿Í esi ·¹Áö½ºÅ͸¦ ½ºÅÿ¡ ÀúÀåÇÏ´Â °ÍÀÌ´Ù.  À̰ÍÀº ESP¿¡ ÂüÁ¶µÇ¾î ÀÖ´Â ½ºÅà ¸Þ¸ð¸® À§Ä¡¸¦ È®ÀÎÇØ º½À¸·Î½á ebx°¡ ½ºÅÿ¡ ÀúÀåµÇ´Â °ÍÀ» È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. 'p'¸¦ ´­·¯ push ebx ¸í·ÉÇàÀ» ¼öÇàÇÏ¿© esp¿¡ À§Ä¡ÇÑ °ªÀ» »ìÆìº¸ÀÚ. esp¿¡ ebx°ªÀÌ µé¾î°¡ ÀÖ´Â °ÍÀ» ´ÙÀ½°ú °°ÀÌ È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.

 

0:000> dd esp
0006fd38  010034b0 0000000a 00000002 010035b0
0006fd48  00000000 00000000 00000200 0006fdb8
...
0:000> r ebx
ebx=00000001
0:000> p
eax=00000018 ebx=00000001 ecx=0006fd14 edx=7ffe0304 esi=00000000 edi=00000000
eip=01002f8b esp=0006fd34 ebp=0006fdb8 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000206
winmine!ShowBombs+0xb:
01002f8b 56               push    esi
0:000> dd esp
0006fd34  00000001 010034b0 0000000a 00000002
0006fd44  010035b0 00000000 00000000 00000200

 

 esp ÀÇ °ªÀÌ 4¹ÙÀÌÆ® ÁÙ¾î µé°í ±× À§Ä¡¿¡ ebxÀÇ °ªÀÌ ÀúÀåµÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ´Ù½Ã push esi¸¦ ½ÇÇà½ÃÄÑ ¶È°°Àº ¹æ¹ýÀ¸·Î È®ÀÎÇØº¸¸é esp°¡ ¶Ç 4¸¸Å­ ÁÙ¾î µé¾î ÀÖ°í ±×ÀÚ¸®¿¡ esi°ªÀÌ ÀúÀåµÇ¾î ÀÖÀ½À» È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. À̰ÍÀÌ ±Ùº»ÀûÀ¸·Î ½ºÅÃÀÌ ÀÏÇÏ´Â ¹æ½ÄÀÌ´Ù. ÀÌ·±½ÄÀ¸·Î ½ºÅà Æ÷ÀÎÅÍ´Â °¨¼ÒÇÏ°í »õ·Î¿î esp°¡ °¡¸®Å°°í ÀÖ´Â À§Ä¡¿¡ push µÈ °ªÀÌ ÀúÀåµÇ´Â °ÍÀÌ´Ù. ¿©±â¼­ ½ºÅÃÀÌ ³ôÀº°÷¿¡¼­ ³·Àº°÷À¸·Î ÀúÀåµÇ°í ÀÖÀ½¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. °ªÀÌ ÀúÀåµÉ¶§´Â ½ºÅà Æ÷ÀÎÅͰ¡ °¨¼ÒÇÏ¿© ±× ÀúÀåµÉ °ø°£À» È®º¸ÇÑ´Ù. ±×·¸´Ù¸é ½ºÅÃÀÇ °¡Àå ³ôÀº °÷°ú ³·Àº °÷ÀÇ ÇѰè(limit)°¡ Àִ°¡? °è¼ÓÇØ¼­ ½ºÅÃÀÌ Ä¿Áú ¼ö´Â ¾ø´Ù. ½ºÅÃÀº õÀå°ú ¹Ù´ÚÀÌ ºÐ¸íÈ÷ ÀÖ´Ù. À̰ÍÀº Thread Environment Block À̳ª TEB¸¦ ÅëÇØ È®ÀÎÇÒ ¼ö ÀÖ´Ù. WinDBG¿¡¼­ !tebÀ» ÅëÇØ È®ÀÎÇÒ ¼ö ÀÖ´Ù.

 

0:000> !teb
TEB at 7ffde000
    ExceptionList:        0006fe3c
    StackBase:            00070000
    StackLimit:           0006c000
    SubSystemTib:         00000000
    FiberData:            00001e00
    ArbitraryUserPointer: 00000000
    Self:                 7ffde000
    EnvironmentPointer:   00000000
    ClientId:             00000ff4 . 00000ff8
    RpcHandle:            00000000
    Tls Storage:          00000000
    PEB Address:          7ffdf000
    LastErrorValue:       183
    LastStatusValue:      c0000008
    Count Owned Locks:    0
    HardErrorMode:        0

 StackBase¿Í StackLimit ¸¦ À§ÇÑ °ªÀ» º¸¸é ½ºÅÃÀÇ ÃµÀå°ú ¹Ù´ÚÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. TEB¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â ·¹ÆÛ·±½º ¼½¼Ç[11]¹øÀ» ÂüÁ¶Ç϶ó.  ´Ù½Ã µ¹¾Æ¿Í ´ÙÀ½ ¸í·ÉÇàÀ» º¸ÀÚ:

 

01002f8c 8b3534530001     mov     esi,[winmine!xBoxMac (01005334)]

 

 À̰ÍÀº ºÐ¸í Áö·ÚÆÇÀÇ °¡·ÎÅ©±âÀÇ °ªÀ» esi¿¡ ÀúÀåÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. 'p'¸¦ ´­·¯ esi ·¹Áö½ºÅÍ¿¡ 0x1e °ªÀÌ ÀúÀåµÇ´Â °ÍÀ» È®ÀÎÇÏÀÚ. 0x1e´Â 10Áø¼ö·Î 30ÀÌ´Ù. À̰ÍÀº Áö±Ý Ç÷¹ÀÌ Çϰí ÀÖ´Â Áö·ÚÆÇÀÇ °¡·ÎÅ©±âÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ±×·¡¼­ xBoxMacÀº °¡·ÎÅ©±âÀÇ °ªÀ» Ç¥½ÃÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.  ´ÙÀ½ ¸í·ÉÇàÀÎ push edi´Â edi ·¹Áö½ºÅÍÀÇ °ªÀ» ½ºÅÿ¡ ÀúÀåÇÏ´Â °ÍÀε¥ À̰ÍÀº ´ÙÀ½ ¸í·ÉÇà(mov edi, 0x1005360)À» ¼öÇàÇϱâ À§ÇÑ »çÀü ÁغñÀÛ¾÷¿¡ ÇØ´çÇÑ´Ù. ¿©±â¼­ ºÎÅÍ Èï¹Ì·Î¿ö Áö´Âµ¥ µµ´ëü 0x1005360Àº ¹«½¼ °ªÀÎÁö Àǹ®½º·´´Ù. Áö±Ý±îÁöÀÇ ¸í·ÉÇàµéÀ» µ¹ÀÌÄÑ º¼ ¶§ ¾Æ¸¶ ÀÌ ÁÖ¼Ò´Â Áö·ÚÆÇ¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖÀ»Áö ¸ð¸¥´Ù. ÀÌ Á¡À» È®ÀÎÇϱâ À§ÇØ ÀÌ ¸Þ¸ð¸® ÁÖ¼ÒÀÇ ÇüŸ¦ µé¿©´Ù º¸ÀÚ.  ¾Õ¼­ ¸»ÇÑ !vprot ±â´ÉÀ» ÅëÇØ ÀÌ ¸Þ¸ð¸® ÁÖ¼ÒÁö¿¡ ´ëÇÑ Á¢±Ù ±ÇÇÑ Å¸ÀÔÀ» È®ÀÎÇϸé, PAGE_READWRITEÀÓÀ» ¾Ë¼ö ÀÖ´Ù. ÀÌ »ç½ÇÀº ÃæºÐÈ÷ °¡Ä¡ÀÖÁö´Â ¾ÊÁö¸¸ ÀÌ ÁÖ¼Ò¿¡´Â ½ÇÇàÀ» À§ÇÑ ¿µ¿ªÀÌ ¾Æ´Ï°í º¯¼öµéÀÇ °ªÀÌ À§Ä¡Çϰí ÀÖÀ½ÀÌ ´À²¸Áø´Ù. »ç½Ç ÀÌ À§Ä¡´Â Áö·ÚÆÇ¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Ù. À̰ÍÀº ´©±¸³ª ¸Þ¸ð¸®¸¦ µé¿©´Ù º¸¸ç ÆÐÅÏÀ» È®ÀÎÇØ º¸¸é ¾Ë ¼ö ÀÖ´Â ¹®Á¦´Ù. ´ÙÀ½°ú °°ÀÌ Memory Window¿¡ 0x1005360ÀÇ °ªÀ» ÀԷ½ÃŰ¸é ¾Æ·¡¿Í °°ÀÌ ¸Þ¸ð¸®ÀÇ ³»¿ëÀÌ ´ýÇÁµÉ °ÍÀÌ´Ù.

01005360 10 42 cc 8f 8f 8f 8f 0f 8f 8f 8f 8f 0f 0f 8f 0f  .B..............
01005370 0f 8f 8f 8f 8f 8f 8f 0f 0f 0f 8f 0f 0f 8f 8f 10  ................
01005380 10 8f 0f 0f 8f 8f 0f 0f 0f 0f 0f 8f 0f 0f 8f 8f  ................
01005390 0f 8f 0f 0f 0f 8f 8f 8f 0f 0f 8f 8f 8f 8f 8f 10  ................
010053a0 10 0f 0f 8f 0f 0f 8f 0f 0f 0f 0f 0f 8f 0f 0f 0f  ................
010053b0 8f 0f 0f 0f 8f 8f 0f 0f 8f 0f 8f 0f 8f 8f 0f 10  ................
010053c0 10 0f 0f 8f 0f 0f 8f 0f 0f 0f 8f 0f 0f 8f 0f 0f  ................
010053d0 8f 0f 0f 8f 0f 0f 0f 8f 0f 0f 0f 8f 0f 0f 0f 10  ................
010053e0 10 0f 0f 8f 0f 8f 8f 0f 0f 8f 8f 0f 0f 8f 0f 0f  ................
010053f0 0f 0f 0f 0f 8f 0f 0f 0f 0f 0f 0f 0f 8f 0f 0f 10  ................
01005400 10 8f 0f 0f 0f 0f 0f 0f 8f 8f 0f 8f 8f 0f 0f 8f  ................
01005410 0f 8f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 8f 8f 0f 10  ................
01005420 10 8f 0f 8f 8f 0f 8f 8f 0f 0f 0f 8f 8f 0f 8f 0f  ................


6) Áö·ÚÆÇ ºÐ¼® (Interpreting the Playing Grid)

 µ¶ÀÚµéÀº ÀÌ ¸Þ¸ð¸®ÀÇ ¿µ¿ª¿¡ Á¦ÇÑµÈ °ªµéÀÌ ¿©±âÀú±â Èð¾îÁ® ÀÖÀ½À» °üÂû ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. °¡Àå ¸¹ÀÌ º¸ÀÌ´Â °ÍµéÀº 0x8f, 0x0f, 0x10, 0x42, 0xcc ÀÌ´Ù. Ãß°¡ÀûÀ¸·Î À̰͵éÀÌ ´ÙÀ½°ú °°Àº ÆÐÅÏÀ¸·Î ¹Ýº¹µÊÀÌ È®ÀεȴÙ:

 

0x10 <30 bytes> 0x10.

 

 30 À̶ó´Â ¼ö´Â ¾Æ±î ¹ß°ßÇß´ø °¡·ÎÅ©±âÀÇ °ª°ú ºñ½ÁÇØ º¸ÀδÙ. ±×·¸´Ù¸é À̰ÍÀÌ Áö·ÚÆÇÀÇ °¢ ÇàÀ» ³ªÅ¸³»°í ÀÖ´Â ÆÐÅÏÀ̶ó´Â ÃßÃøÀ» ÇØ º¼ ¼ö ÀÖ´Ù. À̰ÍÀ» È®ÀÎÇϱâ À§ÇØ WinDBG·Î µ¹¾Æ¿Í Command Window¿¡¼­ 'g'۸¦ ´­·¯ ´Ù½Ã Áö·Úã±â ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. Áö·Úã±â À©µµ¿ì·Î ÀüȯÇÑ ÈÄ ¸Þ¸ð¸®ÀÇ °ªµé°ú Áö·ÚÆÇ°ú ºñ±³Çغ¸ÀÚ. ÀÌ·¸°Ô ºñ±³ÇØ º¼¶§ °¢ ÆøÅºÀÇ À§Ä¡¿¡ 0x8f°¡ À§Ä¡Çϰí ÀÖ°í ºóÄ­Àº 0x0f°ªÀÌ À§Ä¡Çϰí ÀÖÀ½ÀÌ È®ÀεȴÙ. ±×¸®°í Æø¹ßµÈ ÆøÅºÀº 0xcc, ¼ýÀÚ 2´Â 0x42 ·Î ³ªÅ¸³»°í ÀÖ´Ù.

 ÀÌ ¸ðµç °ÍµéÀ» È®ÀÎÇß´Ù¸é ±× row(°¢ Çà) ÆÐÅÏÀÇ ±æÀÌ 32¿¡ ÃÑ ³ôÀÌ(°¢ Çà)°¡ 24Ä­À» °öÇϸé 768 (0x300)ÀÌ ³ª¿À°Ô µÈ´Ù. ±¸ÇØÁø ÀÌ °ªÀ¸·Î ¾Æ±î óÀ½ÀÇ ÁÖ¼ÒÁö 0x01005360¿¡¼­ ½ÃÀÛÇÑ Áö·ÚÆÇÀÌ 0x01005660¿¡¼­ ³¡³­´Ù´Â °ÍÀ¸·Î °è»êÀÌ µÈ´Ù. Áö·Úã±â °ÔÀÓÀ» Àç½ÃÀÛÇϰí SetGrid ÇÁ·Î±×·¥À» Àç½ÇÇà ½ÃŰÀÚ. ±×¸®°í ¿À¸¥ÂÊ ¾Æ·¡ Ä­À» Ŭ¸¯ÇÏ¸é ¼ýÀÚ 2°¡ º¸ÀÏ °ÍÀÌ´Ù. ¹Ù·Î ¿ÞÂÊ Ä­À» Ŭ¸¯ÇÏ¸é ´Ù½Ã ÆøÅºÀÌ ³ªÅ¸³ª°í ´Ù½Ã ºê·¹ÀÌÅ©Æ÷ÀÎÆ® °É¸± °ÍÀÌ´Ù. WinDBG·Î ÀüȯÇÏ¿© Momory Window¿¡ ÁÖÀDZí°Ô »ìÆìº¸ÀÚ. ¾Æ·¡ÀÇ ¿µ¿ªÀÌ ³ª¿Ã ¶§ ±îÁö Next ¹öưÀ» ´©¸¥´Ù.

 

01005640 10 8f 0f 0f 0f 8f 0f 0f 8f 0f 8f 0f 0f 0f 0f 8f  ................
01005650 0f 8f 0f 0f 0f 8f 0f 0f 0f 0f 0f 0f 0f cc 42 10  ..............B.
01005660 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10  ................
01005670 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10  ................


 ÀÌ 0x1005640ÀÇ ¿µ¿ªÀº ¹Ù·Î °¡Àå Áö·ÚÆÇÀÇ °¡Àå ¾Æ·¡ row(Çà) ÀÌ´Ù. °¢ ÆøÅºÀÌ 0x8f·Î ³ªÅ¸³ª´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÌÁ¦ À̰ÍÀÌ È®½ÇÈ÷ Áö·ÚÆÇÀ» ³ªÅ¸³»´Â ¸Þ¸ð¸® ¿µ¿ªÀÓÀ» ¿ì¸° È®½ÅÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù.


7) Áö·Ú Á¦°Å (Removing Mines)

 (e)nter ¸í·É¾î´Â °¡»ó¸Þ¸ð¸®ÀÇ Æ¯Á¤ À§Ä¡¿¡ °ªÀ» ÀÔ·ÂÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. ÀÚ ±×·³ Áö·Ú¸¦ Á¦°Å ÇØ º¸µµ·Ï ÇÏÀÚ. ¸ÕÀú Áö·Úã±â¸¦ WinDBG¿¡¼­ Àç½ÃÀÛÇϰí SetGrid ÅøÀ» ½ÇÇà ½ÃŲ´Ù. ±×¸®°í °¡Àå À§ÂÊÁÙÀÇ Ã¹¹øÂ° Ä­À» Ŭ¸¯ÇÏ¸é ¼ýÀÚ 2°¡ ³ª¿Â´Ù. ±×·³ ´Ù½Ã WinDBG·Î ´Ù½Ã µ¹¾Æ¿Í Ctrol+Break ۸¦ ´­·¯ Áö·Úã±â ÇÁ·Î±×·¥¿¡ ºê·¹ÀÌÅ©¸¦ °Ç´Ù. ÀÌÁ¦ ¸Þ¸ð¸® 0x01005362¿¡ ÀÖ´Â ¿µ¿ªÀ» ºÒ¾î¿Í ¹Ù·Î ¿À¸¥ÂÊ Ä­¿¡´Â ÆøÅºÀÌ µé¾î ÀÖ´Â °ÍÀÌ È®ÀÎ µÉ °ÍÀÌ´Ù. Command Window¿¡ ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ¼öÇàÇØ º¸ÀÚ:

 

eb 0x01005362 0x0f

 

 F5¸¦ ´©¸£°í Áö·Úã±â ÇÁ·Î±×·¥À¸·Î ´Ù½Ã µ¹¾Æ¿Í ¿À¸¥ÂÊ Ä­À» È®ÀÎ ÇØº¸¸é ÆøÅºÀÌ ¾Æ´Ñ ¼ýÀÚ 2°¡ Ç¥½Ã µÉ °ÍÀÌ´Ù. ÀÚ ÀÌÁ¦ ÆøÅºÀ» Á¦°Å ÇÒ ¼ö ÀÖÁö¸¸ ÇϳªÇϳª ¼ÕÀ¸·Î Çϱ⿡´Â ³Ê¹« Èûµé´Ù. ±×·¡¼­ ¿ì¸®´Â ÆøÅºÀ» ŽÁöÇϰí Á¦°ÅÇÏ´Â ÅøÀ» ¸¸µé¾î º¼ °ÍÀÌ´Ù.


7.1) °¡»ó Áö·Ú ŽÁö±â( Vitual Mine Sweepr)

À̹ø ¼½¼Ç¿¡¼­´Â ´ÙÀ½°ú °°Àº °ÍµéÀ» ¼öÇàÇÏ°í °³¹ßÇϱâ À§ÇØ À©µµ¿ì API ºÎºÐ¿¡ ´ëÇØ ¼Ò°³ ÇÒ °ÍÀÌ´Ù.

  1. Áö·Úã±â ÇÁ·Î¼¼½º¸¦ attach Çϰí locate ÇÑ´Ù.
  2. Áö·ÚÆÇ ¿µ¿ªÀ» read ÇÑ´Ù.
  3. ÆøÅºÀ» Á¦°ÅÇϰųª ³ªÅ¸³ª°Ô ¼öÁ¤ÇÑ´Ù.
  4. Áö·Úã±â ÇÁ·Î±×·¥ °ø°£¿¡ ÀÓÀÇÀÇ Áö·ÚÆÇÀ» ¼öÁ¤ÇÏ¿© ³Ö¾îº»´Ù.


ù¹øÂ° ÀÛ¾÷À» ¼öÇàÇϱâ À§ÇØ ¿ì¸®´Â Tlhelp32.h¿¡ °üÇØ ¾Ë¾Æ º¼ ¼ö ÀÖ´Â Tool Help LibraryÀÇ ¼­ºñ½ºµéÀ» Âü°íÇÑ´Ù. ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º¸¦ ÀÇ ½º³À¼¦À» Àâ±â À§ÇØ CreateToolhelp32Snapshot¸¦ È£Ãâ ÇÑ´Ù. ¾Æ·¡´Â ÇÁ·ÎÅäŸÀÔÀÌ´Ù:

 

HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

 

ÀÌ ÇÔ¼öÀÇ dwFlag°¡ TH32CS_SNAPPROCESS·Î ¼¼ÆÃµÇ¾î È£ÃâµÇ¸é ÇöÀçÀÇ ÇÁ·Î¼¼½º ¸®½ºÆ®ÀÇ ÇÚµéÀ» È®º¸ ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¸®½ºÆ®¸¦ ¿­°ÅÇϱâ À§ÇØ Process32First ÇÔ¼ö¸¦ ¸ÕÀú ºÒ·¯³»¾ß ÇÑ´Ù. ´ÙÀ½Àº ÇÁ·ÎÅäŸÀÔÀÌ´Ù.

 

BOOL WINAPI Process32First(
  HANDLE hSnapshot,
  LPPROCESSENTRY32 lppe
);

 

¹Ýº¹Çؼ­ ÀϾ´Â ÀÌ ÇÁ·Î¼¼½º ¸®½ºÆ®¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â Process32Next ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ´ÙÀ½Àº ÇÁ·ÎÅäŸÀÔÀÌ´Ù.

 

BOOL WINAPI Process32Next(
  HANDLE hSnapshot,
  LPPROCESSENTRY32 lppe
);

 

À§ µÎ ÇÔ¼ö ¸ðµÎ ÀÎÀÚ·Î LPPROCESSENTRY32 ±¸Á¶Ã¼¸¦ °¡Áö°í ÀÖ´Ù. ´ÙÀ½Àº ±× ±¸Á¶Ã¼ÀÇ ¸ð½ÀÀÌ´Ù.

 

typedef struct tagPROCESSENTRY32 {
  DWORD dwSize;
  DWORD cntUsage;
  DWORD th32ProcessID;
  ULONG_PTR th32DefaultHeapID;
  DWORD th32ModuleID;
  DWORD cntThreads;
  DWORD th32ParentProcessID;
  LONG pcPriClassBase;
  DWORD dwFlags;
  TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32, *PPROCESSENTRY32;

 

 ÀÚ ¿©±â¼­ szExeFile¿¡ ´«¿©°Ü º¼ Çʿ䰡 Àִµ¥ À̰ÍÀº Áö·Úã±â ÇÁ·Î¼¼½º¸¦ locate ÇÒ ¼ö ÀÖµµ·Ï ¸¸µç´Ù. ±×¸®°í th32ProcessID´Â Áö·Úã±â ÇÁ·Î¼¼½º°¡ ¹ß°ßµÇ¾úÀ» ¶§ attach ÇÒ ¼ö ÀÖµµ·Ï ÇÁ·Î¼¼½º ID¸¦ Á¦°øÇØ ÁØ´Ù. Áö·Úã±â°¡ locateµÇ¾ú´Ù¸é OpenProcess ÇÔ¼ö·Î attach ½Ãų ¼ö ÀÖ´Ù. ´ÙÀ½Àº ±× ÇÁ·ÎÅäŸÀÔÀÌ´Ù.

 

HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL bInheritHandle,
  DWORD dwProcessId
);

 

 Áö·Úã±â ÇÁ·Î¼¼½º°¡ ¿ÀǵǸé ReadProcessMemory ÇÔ¼ö¸¦ ÅëÇØ °¡»ó¸Þ¸ð¸®¿¡ Á¸ÀçÇÏ´Â Áö·ÚÆÇ Á¤º¸¸¦ ȹµæ ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ±× ÇÁ·ÎÅäŸÀÔÀÌ´Ù.

 

BOOL ReadProcessMemory(
  HANDLE hProcess,
  LPCVOID lpBaseAddress,
  LPVOID lpBuffer,
  SIZE_T nSize,
  SIZE_T* lpNumberOfBytesRead
);

 

 ¹öÆÛ¿¡ ±× Áö·ÚÆÇ ¿µ¿ªÀÇ ¸Þ¸ð¸®¸¦ ÀÐ¾î ¿Ã ¼ö ÀÖ°Ô µÇ¾ú´Ù¸é 0x8f¸¦ 0x8a(³ëÃâ) ȤÀº 0x0f(Á¦°Å)·Î º¯°æ Çϵµ·Ï ·çÇÁ¸¦ µ¹·Á¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ º¯°æµÈ ¹öÆÛ¸¦ ´Ù½Ã Áö·Úã±â ÇÁ·Î¼¼½º·Î ÀçÀÛ¼º µÇ¾î¾ß ÇÑ´Ù. À̰ÍÀ» À§ÇØ WriteProcessMemory ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ´ÙÀ½Àº ÇÁ·ÎÅäŸÀÔÀÌ´Ù.

 

BOOL WriteProcessMemory(
  HANDLE hProcess,
  LPVOID lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T nSize,
  SIZE_T* lpNumberOfBytesWritten
);

 

 ÀÌ Á¤º¸¸¦ Åä´ë·Î ÀÌÁ¦ ¿©·¯ºÐÀº Áö±Ý±îÁöÀÇ Áö·Ú ³ëÃâ ȤÀº Á¦°Å¸¦ À§ÇÑ ¸ñÀûÀ» À§ÇØ ÅøÀ» ÀÛ¼º ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. À̰ÍÀ» È®ÀÎÇϱâ À§ÇÑ ¼Ò½ºÄÚµå´Â ·¹ÆÛ·±½º ¼½¼Æ 13¹ø¿¡ Æ÷ÇÔ½ÃÄ×´Ù.


8) °á¸»

 Áö±Ý±îÁö ÀÌ ¹®¼­¸¦ ÀÐÀº µ¶ÀÚ´Â ¼º°øÀûÀ¸·Î À§Ä¡¸¦ ¹ß°ßÇÏ´Â °Í, Á¤È®È÷ ÆÄ¾ÇÇÏ´Â °Í, Áö·Úã±âÀÇ ¹ÙµÏÆÇ ¹«´Ì¸¦ ±³¹¦È÷ ´Ù·ç´Â °Í ±îÁö ¸¹Àº °³³äÀÇ ºÎºÐµéÀ» ¾Ë°Ô µÇ¾úÀ» °ÍÀÌ´Ù. ÀÌ °³³äµé »Ó¸¸ ¾Æ´Ï¶ó ´õ ¸¹Àº ¼¼ºÎÀûÀÎ °Íµé¿¡ °üÇØ¼­´Â ¹®¼­ÀÇ °£°áÇÔÀ» À¯ÁöÇϱâ À§ÇØ ¾²Áö ¾Ê¾Ò´Ù. ´õ ¸¹Àº ÀüüÀûÀÎ °³³äµé¿¡ ´ëÇØ ¾²¿©Áø °ÍÀ» ¿øÇÑ´Ù¸é ·¹ÆÝ·±½ºÀÇ °¢ ¼¼¼ÇÀ» Âü°íÇ϶ó.


9) ·¹ÆÛ·±½º(References)

    1. Calling Conventions  http://www.unixwiz.net/techtips/win32-callconv-asm.html
    2. Symbol Server  http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx
    3. Symbols  ms-help://MS.PSDK.1033/debug/base/symbolfiles.htm
    4. Platform SDK  www.microsoft.com/msdownload/platformsdk/sdkupdate/
    5. Endianness  http://www.intel.com/design/intarch/papers/endian.pdf
    6. EFLAGS  ftp://download.intel.com/design/Pentium4/manuals/25366514.pdf Appendix B
    7. Intel Command References  http://www.intel.com/design/pentium4/manuals/indexnew.htm
    8. Debugger Quick Reference  http://www.tonyschr.net/debugging.htm
    9. WinDBG Prompt  Reference WinDBG Help, Search, Command Window Prompt
    10. Regular Expressions  Reference WinDBG Help, Search, Regular Expression Syntax
    11. TEB  http://msdn.microsoft.com/library/en-us/dllproc/base/teb.asp
    12. SetGrid.cpp
/**********************************************************************
 * SetGrid.cpp - trew@exploit.us
 *
 * This is supplemental code intended to accompany 'Introduction to
 * Reverse Engineering Windows Applications' as part of the Uninformed
 * Journal.  This application sets the reader's playing grid in a
 * deterministic manner so that demonstrations made within the paper
 * correlate with what the reader encounters in his or her instance of
 * WinMine.
 *
 *********************************************************************/

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

#pragma comment(lib, "advapi32.lib")

#define GRID_ADDRESS     0x1005360
#define GRID_SIZE        0x300

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

    HANDLE    hProcessSnap        = NULL;
    HANDLE    hWinMineProc        = NULL;
       
    PROCESSENTRY32 peProcess      = {0};

    unsigned int procFound        = 0;
    unsigned long bytesWritten    = 0;

    unsigned char grid[] =       
   
    "\x10\x0f\x8f\x8f\x8f\x8f\x8f\x0f\x8f\x8f\x8f\x8f\x0f\x0f\x8f\x0f"
    "\x0f\x8f\x8f\x8f\x8f\x8f\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x8f\x8f\x10"
    "\x10\x8f\x0f\x0f\x8f\x8f\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x0f\x8f\x8f"
    "\x0f\x8f\x0f\x0f\x0f\x8f\x8f\x8f\x0f\x0f\x8f\x8f\x8f\x8f\x8f\x10"
    "\x10\x0f\x0f\x8f\x0f\x0f\x8f\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x0f\x0f"
    "\x8f\x0f\x0f\x0f\x8f\x8f\x0f\x0f\x8f\x0f\x8f\x0f\x8f\x8f\x0f\x10"
    "\x10\x0f\x0f\x8f\x0f\x0f\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x8f\x0f\x0f"
    "\x8f\x0f\x0f\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x10"
    "\x10\x0f\x0f\x8f\x0f\x8f\x8f\x0f\x0f\x8f\x8f\x0f\x0f\x8f\x0f\x0f"
    "\x0f\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x0f\x10"
    "\x10\x8f\x0f\x0f\x0f\x0f\x0f\x0f\x8f\x8f\x0f\x8f\x8f\x0f\x0f\x8f"
    "\x0f\x8f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x8f\x8f\x0f\x10"
    "\x10\x8f\x0f\x8f\x8f\x0f\x8f\x8f\x0f\x0f\x0f\x8f\x8f\x0f\x8f\x0f"
    "\x0f\x0f\x0f\x8f\x0f\x8f\x0f\x8f\x0f\x0f\x8f\x8f\x0f\x8f\x0f\x10"
    "\x10\x8f\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x0f\x8f\x8f\x8f\x8f\x0f"
    "\x0f\x0f\x0f\x0f\x0f\x8f\x8f\x8f\x0f\x0f\x0f\x0f\x8f\x8f\x8f\x10"
    "\x10\x8f\x0f\x8f\x8f\x8f\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x8f\x0f\x0f"
    "\x8f\x8f\x0f\x0f\x0f\x8f\x0f\x8f\x0f\x8f\x0f\x0f\x0f\x0f\x0f\x10"
    "\x10\x0f\x0f\x8f\x8f\x0f\x8f\x8f\x8f\x8f\x0f\x0f\x0f\x0f\x0f\x0f"
    "\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x10"
    "\x10\x0f\x0f\x0f\x8f\x8f\x8f\x0f\x8f\x8f\x0f\x0f\x0f\x8f\x0f\x0f"
    "\x0f\x8f\x0f\x8f\x0f\x0f\x0f\x8f\x8f\x0f\x0f\x0f\x0f\x8f\x8f\x10"
    "\x10\x0f\x8f\x8f\x0f\x8f\x0f\x8f\x0f\x8f\x0f\x8f\x8f\x0f\x0f\x8f"
    "\x0f\x0f\x0f\x0f\x0f\x0f\x8f\x8f\x0f\x0f\x8f\x0f\x8f\x0f\x0f\x10"
    "\x10\x0f\x0f\x8f\x8f\x0f\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x8f\x0f"
    "\x8f\x0f\x8f\x8f\x8f\x0f\x0f\x8f\x0f\x8f\x0f\x8f\x8f\x8f\x8f\x10"
    "\x10\x8f\x8f\x0f\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x8f\x0f\x0f\x8f\x0f"
    "\x0f\x0f\x8f\x8f\x8f\x8f\x8f\x0f\x0f\x8f\x8f\x0f\x0f\x8f\x8f\x10"
    "\x10\x8f\x0f\x0f\x0f\x8f\x0f\x8f\x8f\x8f\x8f\x0f\x0f\x8f\x8f\x0f"
    "\x0f\x8f\x0f\x0f\x8f\x8f\x8f\x8f\x0f\x8f\x0f\x8f\x0f\x8f\x8f\x10"
    "\x10\x0f\x8f\x8f\x0f\x0f\x8f\x8f\x8f\x0f\x8f\x0f\x0f\x0f\x0f\x0f"
    "\x0f\x8f\x8f\x8f\x0f\x0f\x8f\x0f\x8f\x8f\x8f\x0f\x8f\x8f\x0f\x10"
    "\x10\x8f\x0f\x0f\x8f\x8f\x8f\x8f\x0f\x0f\x8f\x0f\x0f\x0f\x8f\x8f"
    "\x8f\x8f\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x8f\x8f\x0f\x0f\x8f\x0f\x10"
    "\x10\x0f\x8f\x8f\x0f\x0f\x0f\x0f\x8f\x0f\x8f\x0f\x8f\x0f\x0f\x0f"
    "\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x8f\x0f\x8f\x0f\x10"
    "\x10\x0f\x0f\x0f\x0f\x8f\x8f\x8f\x8f\x8f\x0f\x0f\x0f\x8f\x0f\x0f"
    "\x8f\x8f\x8f\x0f\x0f\x8f\x8f\x8f\x0f\x0f\x8f\x0f\x0f\x8f\x0f\x10"
    "\x10\x8f\x8f\x0f\x8f\x8f\x0f\x8f\x8f\x0f\x0f\x0f\x0f\x8f\x8f\x8f"
    "\x8f\x0f\x8f\x0f\x0f\x0f\x8f\x0f\x8f\x8f\x8f\x0f\x8f\x0f\x0f\x10"
    "\x10\x0f\x8f\x8f\x0f\x0f\x8f\x8f\x8f\x0f\x0f\x8f\x0f\x0f\x0f\x0f"
    "\x0f\x0f\x8f\x8f\x0f\x8f\x0f\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x8f\x10"
    "\x10\x0f\x0f\x8f\x0f\x8f\x0f\x8f\x8f\x0f\x0f\x0f\x0f\x0f\x0f\x0f"
    "\x0f\x8f\x0f\x0f\x0f\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x0f\x0f\x8f\x10"
    "\x10\x0f\x8f\x8f\x8f\x0f\x8f\x0f\x8f\x0f\x0f\x8f\x0f\x0f\x8f\x0f"
    "\x0f\x8f\x8f\x0f\x0f\x0f\x0f\x8f\x0f\x8f\x8f\x0f\x0f\x0f\x8f\x10"
    "\x10\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x8f\x0f\x8f\x0f\x0f\x0f\x0f\x8f"
    "\x0f\x8f\x0f\x0f\x0f\x8f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x8f\x8f\x10";


    //Get a list of running processes
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
       
    if(hProcessSnap == INVALID_HANDLE_VALUE) {
        printf("Unable to get process list (%d).\n", GetLastError());
        return 0;
    }
               
    peProcess.dwSize = sizeof(PROCESSENTRY32);

    //Get first process in list
    if(Process32First(hProcessSnap, &peProcess)) {

        do {
            //Is it's winmine.exe?
            if(!stricmp(peProcess.szExeFile, "winmine.exe")) {

                printf("Found WinMine Process ID (%d)\n", peProcess.th32ProcessID);
                procFound = 1;

                //Get handle on winmine process
                hWinMineProc = OpenProcess(PROCESS_ALL_ACCESS,
                                           1,
                                           peProcess.th32ProcessID);
                       
                //Make sure the handle is valid

                if(hWinMineProc == NULL) {
                    printf("Unable to open minesweep process (%d).\n", GetLastError());
                    return 0;
                }

                //Write grid
                if(WriteProcessMemory(hWinMineProc,
                                      (LPVOID)GRID_ADDRESS,
                                      (LPCVOID)grid,
                                      GRID_SIZE,
                                      &bytesWritten) == 0) {
                    printf("Unable to write process memory (%d).\n", GetLastError());       
                    return 0;
                } else {
                    printf("Grid Update Successful\n");
                }

                //Let go of minesweep
                CloseHandle(hWinMineProc);
                break;
            }

        //Get next process
        } while(Process32Next(hProcessSnap, &peProcess));  
    }
           
    if(!procFound)
        printf("WinMine Process Not Found\n");

    return 0;
}


    13. MineSweeper.cpp
/**********************************************************************
 * MineSweeper.cpp - trew@exploit.us
 *
 * This is supplemental code intended to accompany 'Introduction to
 * Reverse Engineering Windows Applications' as part of the Uninformed
 * Journal.  This application reveals and/or removes mines from the
 * WinMine grid.  Note, this code only works on the version of WinMine
 * shipped with WinXP, as the versions differ between releases of
 * Windows.
 *
 *********************************************************************/

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

#pragma comment(lib, "advapi32.lib")

#define BOMB_HIDDEN      0x8f
#define BOMB_REVEALED    0x8a
#define BLANK            0x0f
#define GRID_ADDRESS     0x1005360
#define GRID_SIZE        0x300

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

    HANDLE    hProcessSnap        = NULL;
    HANDLE    hWinMineProc        = NULL;
       
    PROCESSENTRY32 peProcess      = {0};

    unsigned char procFound       = 0;
    unsigned long bytesWritten    = 0;
    unsigned char *grid           = 0;
    unsigned char replacement     = BOMB_REVEALED;
    unsigned int x                = 0;

    grid = (unsigned char *)malloc(GRID_SIZE);

    if(!grid)
        return 0;

    if(argc > 1) {
        if(stricmp(argv[1], "remove") == 0) {
            replacement = BLANK;
        }
    }

    //Get a list of running processes
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
       
    //Ensure the handle is valid
    if(hProcessSnap == INVALID_HANDLE_VALUE) {
        printf("Unable to get process list (%d).\n", GetLastError());
        return 0;
    }
               
    peProcess.dwSize = sizeof(PROCESSENTRY32);

    //Get first process in list
    if(Process32First(hProcessSnap, &peProcess)) {

        do {
            //Is it's winmine.exe?
            if(!stricmp(peProcess.szExeFile, "winmine.exe")) {

                printf("Found WinMine Process ID (%d)\n", peProcess.th32ProcessID);
                procFound = 1;

                //Get handle on winmine process
                hWinMineProc = OpenProcess(PROCESS_ALL_ACCESS,
                                           1,
                                           peProcess.th32ProcessID);
                       
                //Make sure the handle is valid
                if(hWinMineProc == NULL) {
                    printf("Unable to open minesweep process (%d).\n", GetLastError());
                    return 0;
                }

                //Read Grid
                if(ReadProcessMemory(hWinMineProc,
                                     (LPVOID)GRID_ADDRESS,
                                     (LPVOID)grid, GRID_SIZE,
                                     &bytesWritten) == 0) {
                    printf("Unable to read process memory (%d).\n", GetLastError());       
                    return 0;
                } else {
                    //Modify Grid
                    for(x=0;x<=GRID_SIZE;x++) {
                        if((*(grid + x) & 0xff) == BOMB_HIDDEN) {
                            *(grid + x) = replacement;
                        }
                    }
                }

                //Write grid
                if(WriteProcessMemory(hWinMineProc,
                                      (LPVOID)GRID_ADDRESS,
                                      (LPCVOID)grid,
                                      GRID_SIZE,
                                      &bytesWritten) == 0) {
                    printf("Unable to write process memory (%d).\n", GetLastError());       
                    return 0;
                } else {
                    printf("Grid Update Successful\n");
                }

                //Let go of minesweep
                CloseHandle(hWinMineProc);
                break;
            }

        //Get next process
        } while(Process32Next(hProcessSnap, &peProcess));  
    }
   
    if(!procFound)
        printf("WinMine Process Not Found\n");

    return 0;
}