Creating Arbitrary Shellcode In Unicode Expanded Strings
The "Venetian" exploit


[ÀÌ ¹®¼­´Â orpe´ÔÀÌ ¹ø¿ªÇϽþî beist.org¿¡ Á¦°øÇØÁּ̽À´Ï´Ù. °¨»çÇÕ´Ï´Ù.]




Creating Arbitrary Shellcode In Unicode Expanded Strings
The "Venetian" exploit

Chris Anley (chris@nextgenss.com)
8th January 2002
www.ngssoftware.com

 

 

[°³¿ä]

ÀÌ ¹®¼­´Â "shellcode" ŸÀÔÀÇ º¸¾È °áÁ¡À» ¸·±âÀ§ÇÑ º¸È£ ¸ÞÄ¿´ÏÁò °³¹ß¿¡ Ã¥ÀÓÀ» °¡Áø º¸¾È°èÀÇ ÀϺκÐÀ» À§ÇÑ °ÍÀÌ´Ù.; À¯´ÏÄÚµå ¹öÆÛ¿À¹öÇ÷ο찡 ÀͽºÇ÷ÎÀÕ µÉ ¼ö ¾ø´Â °ÍÀ¸·Î ÀνÄÇÏ´Â °ÍÀ» ±ú¶ß¸®°í ±×°ÍÀ¸·Î ÀÎÇÑ ÀϹÝÀûÀÎ ³×Æ®¿öÅ© º¸¾È »óŸ¦ °³¼±½ÃŰ·Á´Â Àǵµ·Î ÀÛ¼ºÇÑ °ÍÀÌ´Ù. »ç½Ç»ó ÀÓÀÇÀû Äڵ尡 ½ÇÇà °¡´ÉÇÒ ¶§ ¸î¸îÀÇ ¿À¹öÇ÷ο쳪 Æ÷¸Ë½ºÆ®¸µ ¹ö±×ÀÇ Á¾·ù´Â "denial of service" °ø°ÝÀ¸·Î ºÐ·ùµÇ´Â °æ¿ì°¡ Àִµ¥ ÀÌ ¹®¼­´Â ÀÌ·± ¿À¹öÇ÷οìÀÇ ºÎ·ù¿¡ °üÇØ ´Ù·é´Ù.

 

ÀÌ ¹®¼­´Â, ÀÎÅÚ x86 ÇÁ·Î¼¼¼­¿¡¼­, "Unicode" ½ºÆ®¸µÀÌ ÀÖ´Â °÷¿¡¼­ ¹öÆÛ ¿À¹öÇ÷ο찡 ¹ß»ý ÇÒ ¶§ ÀÛÀº ¿ë·®ÀÇ ÀÓÀÇÀû ÄÚµå·Î ½ÇÇàÀ» ÇØ ³¾ ¼ö ÀÖ´Â ±â¼ú(º£³×Ä¡¾Æ½Ä ÀͽºÇ÷ÎÀÕ-Venetian Exploit)À» ¼Ò°³ ÇÑ´Ù. ÀÌ·± °æ¿ì´Â À©µµ¿ì ½Ã½ºÅÛ¿¡¼­ °øÅëÀûÀ̳ª ÀÌ ±â¼úÀº ƯÁ¤ ¿î¿µÃ¼Á¦¿¡ Àû¿ëµÇ´Â °ÍÀº ¾Æ´Ï´Ù.

 

 

[¼Ò°³]

À©µµ¿ì Ç÷§Æû¿¡¼­´Â ¿À¹ö ÇÃ·Î¿ì µÇ±â ÀÌÀü¿¡ À¯´ÏÄÚµå·Î ÄÁ¹öÆ® µÈ ½ºÆ®¸µ¿¡¼­ ¿À¹öÇ÷ο찡 ¹ß°ßµÇ´Â °æ¿ì°¡ ÀÖ´Ù.

 

¿äûµÉ ½ºÆ®¸µ(submitted string)ÀÇ °¢ ¹ÙÀÌÆ® »çÀ̸¶´Ù ³Î ¹ÙÀÌÆ®¸¦ »ðÀÔÇÏ¿© ½©Äڵ带 ¸¸µé¸é¼­ ºÎÅÍ "ÀͽºÇ÷ÎÀÕ" ÀÛ¼ºÀÌ º¹ÀâÇÏ´Ù.

 

¿¹¸¦µé¾î

 

AAAA ´Â 00 41 00 41 00 41 00 41 ÀÌ µÈ´Ù.

 

ÀϹÝÀûÀ¸·Î ¸Å¹ø ±³´ëÇÏ´Â ¹ÙÀÌÆ®°¡ Á¦·ÎÀÎ »óȲ¿¡¼­ ÀǹÌÀÖ´Â ½©Äڵ带 ÀÛ¼ºÇϱâ¶õ ¸Å¿ì ¾î·Æ´Ù°í ¿©°ÜÁø´Ù. ÀÌ ¹®¼­´Â Ãâ·Â°¡´ÉÇÑ ASCII ¹®ÀÚ¸¸À¸·Î ÀͽºÇ÷ÎÀÕ Äڵ带 ¸¸µå´Â "bridge building" ¹æ¹ý°ú ´Ù¸£Áö ¾ÊÀº ±â¼úÀ» »ç¿ëÇÏ¿© ÀÌ ¹®Á¦¸¦ ¾î¶»°Ô ±Øº¹ÇÒ ¼ö ÀÖ´ÂÁö ¼³¸íÇÑ´Ù.

 

 

[°¡Á¤]

ÀÌ ±â¼úÀ» À¯¿ëÇÏ°Ô »ç¿ëÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº »óŸ¦ À¯ÁöÇØ¾ß ÇÑ´Ù:

 

1) ´ë»ó ÇÁ·Î±×·¥ÀÇ ½ÇÇà °æ·Î¸¦ À¯´ÏÄÚµå ¹öÆÛ·Î ¸®´ÙÀÌ·ºÆ® ½Ãų ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

 

±×¸®°í ¾î´À ÇÑÂÊÀÌ¶óµµ °¡´ÉÇØ¾ß ÇÔ:

 

2) eax, ebx, ecx, edx, esp, ebp or esi ·¹Áö½ºÅÍ Áß Çϳª´Â À¯´ÏÄÚµå ¹öÆÛÀÇ ¾Ë·ÁÁø ¿ÀÇÁ¼ÂÀ» °¡¸®ÄÑ¾ß ÇÑ´Ù.

 

¶Ç´Â

 

3) ¿ì¸®ÀÇ ¹öÆÛ ¸Þ¸ð¸®¿¡ Á¤È®ÇÑ ÁÖ¼Ò¸¦ ¾Ë°Å³ª ÁöÁ¤ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

 

 

[º£³×Ä¡¾Æ½Ä ÀͽºÇ÷ÎÀÕ]

"Unicode" ¹öÆÛ´Â º£³×Ä¡¾Æ½Ä ºí¶óÀεå¿Í ºñ½ÁÇÏ´Ù: ¿ì¸®°¡ ÄÁÆ®·Ñ ÇÏ´Â "solid" ¹ÙÀÌÆ®µé°ú ±× °£°Ý¸¶´Ù ¹Ýº¹Àû Á¦·ÎµéÀÇ "gap"ÀÌ ÀÖ´Ù.

 

¾ÕÀ¸·Î ´Ù·ê ±â¼úÀº ¹öÆÛÀÇ ´õ ¾Æ·¡ÂÊ gapµé¿¡ ¼±ÅÃµÈ ¹ÙÀÌÆ®µéÀ» ³¢¿ö³Ö±â À§Èù ¹öÆÛ ½ÃÀÛÁ¡¿¡¼­ "solid" ¹ÙÀÌÆ®¸¦ »ç¿ëÇÏ´Â °Í°ú ºí¶óÀε带 "´ÝÀ½"À¸·Î¼­, ÀͽºÇ÷ÎÀÕÀÇ payload °¡ µÉ ÀÛÀº ¿ë·®ÀÇ ½©Äڵ带 ¸¸µå´Â °Í¿¡ ´ëÇØ ´Ù·é´Ù.

 

¿ì¸®´Â À̰ÍÀ» Çϱâ À§ÇØ ¸Þ¸ð¸® ¼öÁ¤À» À§ÇÑ Æ¯Á¤ÇÑ ¹æ¹ýÀ¸·Î ¹Ýº¹Àû Á¦·Î¸¦ Æ÷ÇÔ½ÃÄÑ ÀνºÆ®·°¼ÇÀ» »ç¿ëÇÏ´Â °Í¿¡ ´ëÇØ ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.

 

ÀÎÅÚ ÇÁ·Î¼¼¼­¿¡¼­ÀÇ instructionÀº º¯¼ö ±æÀ̸¦ °¡Áø´Ù. °¢ ¹ÙÀÌÆ®¸¶´Ù Á¦·Î¸¦ °¡Áö°í ÀÖ¾î¾ß ÇϹǷÎ, ¿ì¸®´Â ÀνºÆ®·°¼Ç ¹Ù¿î´õ¸®¿¡ ¶È¹Ù·Î ¸ÂÃç Á¤·ÄµÇ´Â °ÍÀ» È®½ÇÈ÷ Çϱâ À§ÇØ °°Àº ÀǹÌÀÇ ÀνºÆ®·°¼ÇÀ» ¼öÇàÇÏ´Â "nop"À» ¿ì¸®ÀÇ Äڵ忡 »ðÀÔÇÒ °ÍÀÌ´Ù.

(ÀÌ nop ÀνºÆ®·°¼ÇÀº ¿ì¸® Äڵ忡¼­ ¾Æ¹«·± °á°ú¸¦ ÃÊ·¡ÇÏÁö ¾ÊÁö¸¸ Äڵ忡 ä¿ï ¼ö ÀÖ´Â ¿ªÇÒÀ» ÇÑ´Ù.)

 

00·Î ½ÃÀÛÇÏ´Â ÀνºÆ®·°¼ÇÀº, ¿ì¸®¿¡°Ô Ưº°È÷ À¯¿ëÇÏÁö ¾ÊÁö¸¸, ¸ðµÎ "add" ¸í·ÉÀÌ´Ù.

ÀϹÝÀûÀ¸·Î non-zero ¹ÙÀÌÆ®·Î ½ÃÀÛÇÏ´Â ÀνºÆ®·°¼ÇÀ» »ç¿ëÇÒ °ÍÀÌ´Ù.

 

µû¶ó¼­ ¿ì¸®°¡ Äڵ带 ÀÛ¼ºÇÒ ¶§ ´ÙÀ½ ¼öÇàÇØ¾ß ÇÒ ÀνºÆ®·°¼ÇÀÌ 00·Î ½ÃÀÛÇØ¾ß ÇÑ´Ù¸é "ÀçÁ¤·Ä" µÈ ´ÙÀ½°ú °°Àº ƯÁ¤ÇÑ Çü½ÄÀÇ instructionµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯¸é ¿ì¸®´Â ´ÙÀ½ ÀνºÆ®·°¼ÇÀ¸·Î Á» ´õ Èï¹Ì·Î¿î °ÍÀ» ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

 

00 6D 00:add byte ptr [ebp],ch

 

À̰ÍÀº ¾²±â °¡´ÉÇÑ ¾î¶² °÷À» Æ÷ÀÎÆ® Çϰí ÀÖ´Ù´Â °ÍÀ» ³ªÅ¸³»°í ÀÖ´Ù. ±×¸®°í ±×°÷Àº "ÀͽºÇ÷ÎÀÕ"ÀÇ ¸ñÀû°ú´Â »ó°ü ¾øÀ¸¹Ç·Î °ü½É°¡Áú Çʿ䰡 ¾ø´Ù. ¸¸¾à ±×·¸Áö ¾ÊÀº °æ¿ì¶ó¸é, ´ÙÀ½°ú °°ÀÌ ´Ù¸¥ ·¹Áö½ºÅ͵éÀ» »ç¿ëÇÏ¸é µÈ´Ù.

 

00 6E 00:add byte ptr [esi],ch

00 6F 00:add byte ptr [edi],ch

00 70 00:add byte ptr [eax],dh

00 71 00:add byte ptr [ecx],dh

00 72 00:add byte ptr [edx],dh

00 73 00:add byte ptr [ebx],dh

 

¸¸¾à ¸ðµç ·¹Áö½ºÅ͵éÀÌ ¿ì¸®°¡ ¾ÈÀüÇÏ°Ô µ¤¾î¾µ ¼ö ÀÖ´Â °÷À¸·Î Æ÷ÀÎÆ®Çϰí ÀÖÁö ¾Ê´Ù¸é

constant Æ÷ÀÎÅÍ °ªÀ» ´ÙÀ½°ú °°Àº ÀνºÆ®·°¼ÇÀ¸·Î eax¿¡ ÇÒ´çÇÏ¸é µÈ´Ù.

 

6A 00:push 0

58   :pop eax

 

(eax¿¡ "0"À» ÇÒ´çÇÔ), ±×´ÙÀ½ °°Àº ¶æÀÇ Á¤·Ä ÀνºÆ®·°¼ÇÀÎ "nop"·Î eax ·¹Áö½ºÅͰ¡ ¾ÈÀüÇÏ°Ô µ¤¾î¾µ ¼ö ÀÖ´Â ¸Þ¸ð¸® À§Ä¡·Î Æ÷ÀÎÆ® µÉ ¶§ ±îÁö, ¾Æ·¡ ¼³¸í ÇÒ "add"¿Í "sub"¸¦ ÇØ³ª°£´Ù.

 

À§ »óÅ¿¡¼­, ¿ì¸®´Â ¿ì¸®ÀÇ À¯´ÏÄÚµå ¹öÆÛ·Î Æ÷ÀÎÆ®ÇÏ´Â ·¹Áö½ºÅ͸¦ °¡Áö°Ô µÈ´Ù.

 

´ÙÀ½ ¿ì¸®°¡ ÇØ¾ß ÇÒ ÀÏÀº ¿ì¸®ÀÇ ¹öÆÛ ³»¿¡ Àִ ƯÁ¤ÇÑ Æ÷ÀÎÆ® ¾Æ·¡ÀÇ ¸ðµç 00 ¹ÙÀÌÆ®¿¡ ´ÙÀ½°ú °°ÀÌ "set" À» ÇÏ´Â °ÍÀÌ´Ù.

 

80 00 75:add byte ptr [eax],75h

 

... ±×´ÙÀ½ eax¸¦ µÎ¹ø inc(Áõ°¡) ½Ã۰í...

 

40       :inc eax

00 6D 00 :add byte ptr [ebp],ch

40       :inc eax

 

±×¸®°í ´ÙÀ½ 00 ¹ÙÀÌÆ®¸¦ ¼¼ÆÃÇÏ¸é µÈ´Ù. À̰ÍÀº ¿ì¸®ÀÇ ½©ÄÚµåÀÇ ¸¶Áö¸· ¾ÕºÎºÐÀÇ ¹öÆÛ¿¡ À§Ä¡Çϰí ÀÖ´Â ÀÓÀÇÀû ¹ÙÀÌÆ®µé·Î ³¡³ª°Ô µÉ °ÍÀÌ´Ù. ±×·¯¸é ±× ¹öÆÛ´Â ´ÙÀ½°ú °°ÀÌ ³õÀÌ°Ô µÈ´Ù.

 

0x00000000

...

[ alternate-zero byte setting code ]

[ arbitrary bytes of shellcode ]

...

0xffffffff

 

¹°·Ð, ù¹øÂ°·Î ÇØ¾ß ÇÏ´Â ÀÏÀº ÀÓÀÇÀû ¹ÙÀÌÆ®¸¦ ¾²·Á°í ÇÏ´Â ¹öÆÛÀÇ ºÎºÐÀ» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ȹµæÇÏ´Â °ÍÀÌ´Ù.

 

ÀÌ°É Çϱâ À§ÇØ, ¿ì¸®ÀÇ ½©Äڵ带 °¡¸®Å°°í ÀÖ´Â ·¹Áö½ºÅÍÀÇ °ª°ú eax ·¹Áö½ºÅÍÀÇ °ªÀ» ±³È¯ÇØ¾ß Çϴµ¥, 1 ¹ÙÀÌÆ®·Î °¡´ÉÇÑ "xchg" ÀνºÆ®·°¼ÇÀ» »ç¿ë ÇÒ °ÍÀÌ´Ù. ´ÙÀ½ ÁßÀÇ Çϳª°¡ µÉ °ÍÀÌ´Ù:

 

93:xchg eax,ebx

91:xchg eax,ecx

92:xchg eax,edx

94:xchg eax,esp

95:xchg eax,ebp

96:xchg eax,esi

97:xchg eax,edi

 

±×¸®°í ¿ì¸®´Â "add"¿Í "sub"¸¦ »ç¿ëÇÏ¿© eax °ªÀ» ¹Ù²ã¾ß Çϴµ¥, ¿ì¸® ¹öÆÛÀÇ "ÀÓÀÇÀû ¹ÙÀÌÆ®" ºÎºÐÀ» °¡¸®Å°±â À§ÇÔÀÌ´Ù.

 

05 00 75 00 4C: add eax,4C007500h

2D 00 75 00 4C: sub eax,4C007500h

 

"add"¿Í "sub" ¿ÀÆÛ·¹À̼ÇÀ» ¹Ýº¹ÇØ ³ª°¡´Â °ÍÀÌ ÇÊ¿äÇѵ¥ 256ÀÇ ¹è¼ö¸¦ ´õÇÒ ¶§ ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù.

 

add eax,4C007500h

sub eax,4C007400h

 

±×¸®°í À§¿¡ ¼³¸íÇÑ ´ë·Î ´õÇϰí Áõ°¡½ÃÄÑ ³ª°£´Ù.

 

"¹ÙÀÌÆ® ¼¼ÆÃ"µÈ Äڵ带 ÅëÇØ ÀÓÀÇÀû ÄÚµå·Î ½ÇÇàµÈ´Ù´Â »ç½Ç¿¡ µû¶ó ¿ì¸®ÀÇ ÀÓÀÇÀû ÄÚµå´Â ÀÌÁ¦ ½ÇÇà °¡´É ÇØ Áö°Ô µÈ´Ù. ¸¸¾à ÃʱâÈ­µÈ Æ÷ÀÎÅÍ ¿ÀÇÁ¼ÂÀ» ¶È¹Ù·Î ¾Ë°í ÀÖ´Ù¸é ¿ì¸®ÀÇ ÀÓÀÇÀû ÄÚµå·Î ½ÇÇàÀ» °è¼Ó ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

 

[¹®Á¦]

ù¹øÂ°·Î ¸¸¾à ´ë»ó ÇÁ·Î±×·¥ÀÌ high bit filter¸¦ º¸À¯Çϰí ÀÖ´Ù¸é, ÀÌ´Ï¼È Æ÷ÀÎÅ͸¦ "xchg" ÇØ¾ß ÇÒ Çʿ䰡 ÀÖ°í ¿ÉÄڵ尡 0x7fº¸´Ù ³ô°Ô ¿ä±¸ÇϹǷΠÀÌ ±â¼úÀº ¸Å¿ì ¾î·Á¿î °ÍÀε¥, 'push'¿Í 'pop' ÀνºÆ®·°¼ÇÀ¸·Î µ¿ÀÏÇÏ°Ô ¸¸µé ¼ö ÀÖÀ»Áö ¸ô¶óµµ ¸¸µé±â¿¡´Â ¾î·Æ´Ù.

 

Å©±â ¶ÇÇÑ ¹®Á¦´Ù, ´ÜÀÏ 00 ¹ÙÀÌÆ®°¡ ´ÙÀ½°ú °°ÀÌ ¼¼ÆÃ µÇ´Â ÀνºÆ®·°¼Ç ½ÃÄö½º°¡ ÀÖ´Ù:

 

40 :inc eax

00 6D 00:add byte ptr [ebp],ch

40 :inc eax

00 6D 00:add byte ptr [ebp],ch

80 00 75:add byte ptr [eax],75h

00 6D 00:add byte ptr [ebp],ch

 

±×·¡¼­ 2°³ÀÇ ÀÓÀÇÀû Äڵ带 ¼¼ÆÃÇϱâ À§ÇØ 14¹ÙÀÌÆ®ÀÇ Äڵ尡 ÀÖ¾î¾ß ÇÑ´Ù. (¿ì¸®´Â Çϳª¸¦ ÀÚÀ¯·Ó°Ô °¡Áø´Ù. ±× Çϳª´Â ÀÌ¹Ì ¹®Àھȿ¡ ÀÖ´Â °ÍÀÌ´Ù.)

 

¿ì¸®°¡ ¼¼ÆÃÇÒ ¼ö ÀÖ´Â 1024 ¹ÙÀÌÆ®ÀÇ ¹öÆÛ¸¦ ÀǹÌÇÏ´Â °ÍÀÌ°í ±×·¯¸é ÀͽºÇ÷ÎÀÕ ÄÚµåÀÇ ÃÖ´ë Å©±â °ªÀº (1024*2)/14=146 ¹ÙÀÌÆ®°¡ µÉ °ÍÀÌ´Ù. (À¯´ÏÄÚµå ¹®ÀÚ°¡ 2¹ÙÀÌÆ®À̹ǷÎ)

 

±×·¡µµ ÀÓÀÇÀû ¸í·ÉÀ» ½ÇÇà ½ÃÄÑ ÇØ·Ó°Ô Çϱ⿡´Â ÃæºÐÇÏ´Ù.

 

Ä¡¹ÐÇÏ°Ô ÀÌ ±â¼úÀ» »ç¿ëÇϸé ÀÓÀÇÀû ½©Äڵ带 ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ÄÚµåÀÇ Å©±â¸¦ ÁÙÀÌ´Â °ÍÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù.

 

ÄÁÅØ½ºÆ®¿¡ À̰ÍÀ» ³õÀ» ¶§´Â ¸®¹ö½º ½©À» ÀÏÀ¸Å°´Â ÄÚµå´Â 170 ¹ÙÀÌÆ®º¸´Ù ÀÛ°Ô ¸Â¾Æ ¶³¾îÁø´Ù. ÀÌ ±â¼úÀº µû¶ó¼­ "wild" ÇÑ °÷¿¡ ³ª°¡ À¯´ÏÄÚµå ¿À¹öÇ÷οì ÀͽºÇ÷ÎÀÕÀ» ÀÛ¼ºÇϴµ¥ ÃæºÐÇÒ °ÍÀÌ´Ù.

 

 

[°á·Ð]

ÀÌ ¹®¼­¿¡¼­ ¼³¸íÇÑ "º£³×Ä¡¾Æ½Ä" ÀͽºÇ÷ÎÀÕ ±â¼úÀº ´Ù¼Ò º¹ÀâÇÏ°Ô ÀͽºÇ÷ÎÀÕÀ» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀÌ´Ù. ÇÏÁö¸¸ À̰ÍÀº À©µµ¿ì ¿î¿µÃ¼Á¦ ÆÐ¹Ð¸®±º¿¡ ²Ï °øÅëÀûÀ¸·Î ³ªÅ¸³ª´Â »óȲ¿¡ ´ëÇØ ´Ù·ç°í ÀÖ´Ù.

 

ÀͽºÇ÷ÎÀÕ ÇÒ ¼ö ¾ø´Â °ÍÀº À§ÇèÇÒ ¼ö ÀÖ´Ù´Â ¿À¹öÇ÷οìµéÀ» ±âÃÊ·ÎÇÏ¿© À¯´ÏÄڵ带 ´Ù·ç´Â ¹æ¹ýÀÌ Á¦´ë·Î Àü´ÞµÇ¾úÀ¸¸é ÇÑ´Ù.

 

ÇÁ·Î±×·¥ÀÇ ½ÇÇà °æ·Î¸¦ ¹Ù²Ü ¼ö ¸¸ ÀÖÀ¸¸é ±×°ÍÀ¸·Î ¾ðÁ¦³ª ÀÓÀÇÀû ÄÚµåÀÇ ½ÇÇàÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀ» ¸í½ÉÇØ¶ó.