|
ÀÌ ¹®¼´Â 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ÀÇ Åø¹Ù´Â ÀÌ ¹®¼¿¡¼ »ç¿ëµÇ´Â ±âº»ÀûÀÎ ¿ë¾î¸¦ ³íÀÇÇϱâ
À§ÇÑ °£´ÜÇÑ °¡À̵å·Î¼ ¿ªÇÒÀ» ÇÒ °ÍÀÌ´Ù. ¿ÞÂʺÎÅÍ ¿À¸¥ÂÊÀ¸·Î °¢ ¿É¼ÇÀÇ ±â´ÉÀº ´ÙÀ½°ú °°´Ù:
- Open Source
Code - Open associated source code for the debugging session.
- Cut - Move
highlighted text to the clipboard
- Copy - Copy
highlighted text to the clipboard
- Go - Execute
the debugee
- Restart - Restart
the debugee process
- Stop - Terminate
the debugging session
- Break - Pause
the currently running debugee process
´ÙÀ½ ³×°³ÀÇ ¿É¼Ç ¾ÆÀÌÄÜÀº µð¹ö°Å°¡ Break°¡ °É¸° ÈÄ »ç¿ëµÈ´Ù.
µð¹ö°Å´Â À§ÀÇ ¿É¼ÇÀ» ÅëÇØ Break °É¸± ¼öµµ ÀÖ°í »ç¿ëÀÚ°¡ À§Ä¡¸¦ ÁöÁ¤ÇÏ¿© Break
(Breakpoint) °É ¼öµµ ÀÖ´Ù. ºê·¹ÀÌÅ©Æ÷ÀÎÆ®´Â ´Ù¾çÇÑ »óȲ¿¡ ÇÒ´ç µÉ ¼ö ÀÖ´Ù. ´ëºÎºÐÀÇ °øÅëÀûÀÎ Á¡Àº ÇÁ·Î¼¼¼°¡ ƯÁ¤ ÁÖ¼Ò¿¡¼ ¸í·ÉÇà(instruction)À» ½ÇÇà ÇÒ ¶§³ª ¸Þ¸ð¸®ÀÇ Æ¯Á¤ ¿µ¿ª¿¡ Á¢±Ù µÇ¾úÀ» ¶§ÀÇ »óȲÀÌ´Ù. ºê·¹ÀÌÅ©Æ÷ÀÎÆ®ÀÇ
¿ëµµ¿¡ °üÇØ¼ ³ªÁß¿¡ ´Ù½Ã ÀÚ¼¼È÷ ¾ð±ÞÇϵµ·Ï ÇϰڴÙ.
ºê·¹ÀÌÅ©Æ÷ÀÎÆ®°¡ °É¸° À§Ä¡¿¡ µµ´Þ ÇÏ¿´À» ¶§, °¢°¢ÀÇ ¸í·ÉÇàÀ̳ª ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ½ÇÇàÇÏ´Â °ÍÀº ÇÁ·Î¼¼½º¸¦ ¼öÇàÇÏ¸ç ¾î¶»°Ô °Ç³Ê¶Û °ÍÀÎÁö È®ÀÎÇϴµ¥, WinDBG¿¡´Â ½ºÅÜ ¹æ½Ä¿¡ ´ëÇØ ´ÙÀ½°ú °°ÀÌ ³×°¡Áö¸¦ Á¤ÀÇÇϰí
ÀÖ´Ù.
- 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.
- 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.
- Step Out - Execute
one or many instructions. Causes the debugger to execute instructions
until it has returned from the current function.
- 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 ºÎºÐ¿¡ ´ëÇØ ¼Ò°³ ÇÒ °ÍÀÌ´Ù.
- Áö·Úã±â ÇÁ·Î¼¼½º¸¦ attach Çϰí locate ÇÑ´Ù.
- Áö·ÚÆÇ ¿µ¿ªÀ» read ÇÑ´Ù.
- ÆøÅºÀ» Á¦°ÅÇϰųª ³ªÅ¸³ª°Ô ¼öÁ¤ÇÑ´Ù.
- Áö·Úã±â ÇÁ·Î±×·¥ °ø°£¿¡ ÀÓÀÇÀÇ Áö·ÚÆÇÀ» ¼öÁ¤ÇÏ¿©
³Ö¾îº»´Ù.
ù¹øÂ° ÀÛ¾÷À» ¼öÇàÇϱâ À§ÇØ ¿ì¸®´Â 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;
}
|