Fedora Core 4, 5, 6 ³»¿¡¼­ shellcode¸¦ »ç¿ëÇÏ´Â local format string exploit ¹æ¹ý

ºÎÁ¦: ¿©ÀüÈ÷ shellcodeÀÇ ½ÇÇàÀº °¡´ÉÇß´Ù!


ÀÛ¼ºÀÚ: À¯µ¿ÈÆ - Xpl017Elz <szoahc@hotmail.com>
http://x82.inetcop.org


 Overview

¸î °³¿ù¸¸¿¡ ´Ù½Ã ±ÛÀ» ÀÛ¼ºÇÏ°Ô µÇ¾ú½À´Ï´Ù. ±× ÀÌÀ¯´Â Fedora Core 5°¡ ¸±¸®ÁîµÇ¾ú±â ¶§¹®ÀÔ´Ï´Ù. À̹ø ¹®¼­´Â ±âÁ¸ÀÇ text·Î¸¸ ÀÛ¼ºÇß´ø ¹æ½ÄÀ» ¹þ¾î³ª¼­ ´©±¸³ª ½±°Ô ±ÛÀ» º¼ ¼ö ÀÖµµ·Ï html ¹®¼­·Î ÀÛ¼ºÇغ¸¾Ò½À´Ï´Ù. ¿©´ãÀÔ´Ï´Ù¸¸, ±×µ¿¾ÈÀÇ ¹®¼­°¡ ³Ê¹« µüµüÇÑ ³»¿ëÀ» ´Ù·ç°í ÀÖ°í, ±Ø¼Ò¼ö¸¸À» À§ÇÑ ±ÛÀÌ µÇ¾î¹ö·È±â ¶§¹®¿¡ ÀÌÁ¦ºÎÅÍ´Â Á¶±Ý ½±°Ô Ç®¾îº¸·Á°í ÇÕ´Ï´Ù. ´õ ÀÌÇØÇϱ⠽±µµ·Ï ±×¸² ¼³¸íµµ ´õ Ãß°¡Çϱ¸¿ä. ÀÌÀü¿¡ ÀÛ¼ºÇÑ ¹®¼­ Áß¿¡ Fedora Core 3 ½Ã½ºÅÛ¿¡¼­ shellcode¸¦ ÀÌ¿ëÇÑ local & remote format string ±â¼ú¿¡ ´ëÇØ ¼Ò°³ÇÑ ÀûÀÌ ÀÖ½À´Ï´Ù. ÀÌ ¹®¼­ÀÇ ÁÖµÈ ³»¿ëÀº format string Ãë¾àÁ¡À» ÅëÇØ heap »ó¿¡ ½ÇÇà °¡´ÉÇÑ shellcode¸¦ »ý¼ºÇϰí À̸¦ ½ÇÇàÇÏ´Â °ø°ÝÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀ̾ú½À´Ï´Ù. Fedora Core 3ÀÇ °æ¿ì, stack ¿µ¿ªÀº ½ÇÇàÀÌ ºÒ°¡´ÉÇÏÁö¸¸, heap ¿µ¿ªÀÇ ÀϺκÐÀº ¿©ÀüÈ÷ ½ÇÇàÀÌ °¡´ÉÇ߱⠶§¹®¿¡ ÀÌ ¿µ¿ª¿¡ shellcode¸¦ ¿Ã¸± °æ¿ì, ÄÚµå ½ÇÇàÀÌ ÃæºÐÈ÷ °¡´ÉÇß½À´Ï´Ù. ÇÏÁö¸¸, Fedora Core 4 ½Ã½ºÅÛ ºÎÅÍ´Â ÀÌ ¿µ¿ª¸¶Àú ½ÇÇà ±ÇÇÑÀ» ¾ø¾Ö¹ö·È½À´Ï´Ù. ±×·¡¼­ shellcode¸¦ ÀÌ¿ëÇÑ exploit ±â¼úÀ» »ç½Ç »ó ºÒ°¡´ÉÇÏ´Ù°í ÆÇ´ÜÇϰí ÀÖ¾ú½À´Ï´Ù. Àá½Ã ´Ù¸¥ ¼³¸íÀ» Á¶±Ý ÇϰڽÀ´Ï´Ù. ¾ó¸¶ Àü¿¡ Áß±¹¿¡¼­ ÀÛ¼ºµÈ 'Bypass Exec-shield Under RedHat'¿¡ °üÇÑ ³»¿ëÀ» Á¶±Ý ¼³¸íÇØº¸°Ú½À´Ï´Ù. ÀÌ ¹®¼­¸¦ º¸¸é Fedora Core ½Ã½ºÅÛ ³»¿¡¼­ ÃÑ 3°¡ÁöÀÇ exploit ¹æ¹ýÀ» ¼Ò°³Çϰí ÀÖ´õ±º¿ä. ÀÌ 3°¡Áö ±â¼úÀº ´ÙÀ½ ÆÄÆ®·Î ³ª´­ ¼ö ÀÖ½À´Ï´Ù. 1. shellcode¸¦ ÀÌ¿ëÇÑ exploit ±â¼ú 2. GOT overwrite ±â¼ú 3. Return to library exploit ±â¼ú ¹®¼­¸¦ ÀÐ°í ¾à°£ÀÇ ¾Æ½¬¿î »ý°¢ÀÌ µé¾ú½À´Ï´Ù. ÀÌÀü¿¡ ³ª¿ÍÀÖ´Â ±â¼úÀ» ´ä½ÀÇÑ´Ù´Â ´À³¦À» Áö¿ï ¼ö´Â ¾ø´õ±º¿ä. ¹®¼­¸¦ º¸¸é, ù ¹øÂ°·Î ¼Ò°³µÈ shellcode¸¦ ÀÌ¿ëÇÑ exploit ±â¼úÀ» Áõ¸íÇØº¸À̴µ¥, ´Ü¼ø POC ½ÇÇè¿¡ ºÒ°¡ÇÑ ³»¿ëÀÔ´Ï´Ù. ÀϹÝÀûÀ¸·Î read-only data ¼½¼ÇÀº code write°¡ ºÒ°¡´ÉÇϱ⠶§¹®¿¡ ¹®¼­ ³»¿¡¼­´Â °ø°Ý ´ë»ó ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÒ ¶§ shellcode¸¦ ÀÓÀÇ·Î read-only data ¼½¼Ç¿¡ ¿Ã·ÁµÎ°í ½ÇÇèÇϰí ÀÖ½À´Ï´Ù. "ÀÌÁ¦ shellcode¸¦ ÀÌ¿ëÇÑ exploitÀº ¸¹ÀÌ Èûµé¾îÁ³´Ù."¶ó´Â »ç½ÇÀ» Áõ¸íÇØº¸ÀÌ´Â ±×·± ³»¿ëÀ̶ó ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·³, Áö±ÝºÎÅÍ ÇöÀç ÃֽŠ½Ã½ºÅÛÀ» Â÷±ÙÈ÷ ¼³¸íµå¸®°í ³­ ÈÄ, °ø°Ý ½Ã³ª¸®¿À¸¦ ±¸¼ºÇغ¸µµ·Ï ÇϰڽÀ´Ï´Ù.

 ¹«¾ùÀÌ ¹®Á¦Àΰ¡?

´ÙÀ½ È­¸éÀº Fedora Core 5ÀÇ ÇÁ·Î¼¼½º ¸ÊÇÎ ³»¿ëÀÔ´Ï´Ù. ¸ÊÇÎ ³»¿ëÀ» º¸¸é, heap°ú stack ¸ðµÎ ½ÇÇàÀÌ ºÒ°¡´ÉÇØº¸ÀÔ´Ï´Ù. Àá½Ã ÈÄ, Å×½ºÆ®¸¦ ¼öÇàÇØº¸°ÚÁö¸¸ Fedora Core 4 ½Ã½ºÅÛºÎÅÍ´Â Á¤¸»·Î ÀÌ µÎ ¿µ¿ªÀ» ÀÌ¿ëÇÏ¿© shellcode¸¦ ½ÇÇàÇϱä Èûµé °Í °°½À´Ï´Ù. [º¸±â: ÇÁ·Î¼¼½º ¸Þ¸ð¸® ¸Ê] ¾î¶² »çÇ×ÀÌ º¯°æµÇ¾ú´ÂÁö »ìÆìº¸±â À§ÇØ, Fedora Core 3 ½Ã½ºÅÛ ³»¿¡¼­ testÇß´ø shellcode Äڵ带 ±×´ë·Î ¹Þ¾Æ¿Í¼­ ½ÇÇàÇØº¸¾Ò½À´Ï´Ù.

[x82@fc5 ~]$ cat > write.c
char write[]={
        0xeb,0x17,0x5e,0x31,0xc0,0xb0,0x04,0x31,
        0xdb,0xb3,0x01,0x89,0xf1,0x31,0xd2,0xb2,
        0x0b,0xcd,0x80,0x31,0xc0,0xb0,0x01,0xcd,
        0x80,0xe8,0xe4,0xff,0xff,0xff,0x58,0x70,
        0x6c,0x30,0x31,0x37,0x45,0x6c,0x7a,0x0a
};
int main(){
        void (*funx)()=(void *)write;
        printf("funx(): %p\n",funx);
        funx();
}

[x82@fc5 ~]$ gcc -o write write.c
write.c: In function ?ain?
write.c:10: warning: incompatible implicit declaration of built-in function ?rintf?
[x82@fc5 ~]$ gdb -q write
(gdb) r
Starting program: /home/x82/write
Reading symbols from shared object read from target memory...(no debugging symbo
ls found)...done.
Loaded system supplied DSO at 0xc52000
(no debugging symbols found)
(no debugging symbols found)
funx(): 0x80495c0

Program received signal SIGSEGV, Segmentation fault.
0x080483d2 in main ()
(gdb) x/x 0x80495c0
0x80495c0 :      0x315e17eb
(gdb) where
#0  0x080483d2 in main ()
(gdb)
[º¸±â: shellcode ½ÇÇà ½ÃÇè] Á¤È®È÷ ¸»¾¸µå¸®ÀÚ¸é, .data ¿µ¿ª¿¡ test¿ë shellcode¸¦ ¿Ã·Á³õ°í ½ÇÇàÀ» ½ÃµµÇÏ´Â ¸ð½ÀÀÔ´Ï´Ù. ÇÏÁö¸¸, Fedora Core 3 ½Ã½ºÅÛ°ú ´Þ¸®, ½ÇÇàÀÌ ºÒ°¡´ÉÇÑ °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. ±×·¸´Ù¸é ÀÌÁ¦ shellcodeÀÇ ½ÇÇàÀº ¿µ¿µ ºÒ°¡´ÉÇÑ °ÍÀϱî¿ä? ¾Æ´Õ´Ï´Ù. ±×·¸´Ù¸é Áö±Ý ÀÌ ¹®¼­¸¦ ÀÛ¼ºÇϰí ÀÖÁöµµ ¾Ê°ÚÁö¿ä. ^_^ ´Ù½Ã, À§ÀÇ ÇÁ·Î¼¼½º ¸ÊÀ» »ìÆìº¸¸é, Àбâ, ¾²±â, ½ÇÇàÀÌ °¡´ÉÇÑ ¶óÀ̺귯¸® ¿µ¿ªÀÌ ¼¼ °÷¿¡ Á¸ÀçÇÏ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. -- 00be4000-00be5000 rwxp 00019000 fd:00 1243921 /lib/ld-2.4.so 00d16000-00d17000 rwxp 0012e000 fd:00 1243926 /lib/libc-2.4.so 00d17000-00d1a000 rwxp 00d17000 00:00 0 -- ¹Ù·Î ÀÌ·¸°Ô ¼¼ ºÎºÐÀÔ´Ï´Ù. ±×·¸´Ù¸é, ¾î¶»°Ô ÀÌ ¶óÀ̺귯¸® ¸Þ¸ð¸® ¿µ¿ªÀ» ÀÌ¿ëÇÒ °ÍÀÎÁö¿¡ ´ëÇØ »ý°¢Çغ¼ ¼ö ÀÖ½À´Ï´Ù. ¿ì¼±, ¹öÆÛ ¿À¹öÇÃ·Î¿ì ±â¹ýÀ¸·Î ÀÌ ¶óÀ̺귯¸® ¿µ¿ª¿¡ µ¥ÀÌÅ͸¦ ¾²°Å³ª ¿Ã¸®´Â ÀÏÀº ½ÇÁ¦ ºÒ°¡´ÉÇØ º¸ÀÔ´Ï´Ù. Return-to-library ±â¹ýÀ» ÀÌ¿ëÇÑ´Ù°í ÇØµµ 16m ¹Ì¸¸ÀÇ NULLÀ» Æ÷ÇÔÇÑ ÁÖ¼Ò¸¦ »ç¿ëÇϰí Àֱ⠶§¹®¿¡ °ø°Ý¿¡ ¸î °¡Áö ³­°üÀÌ Á¸ÀçÇÕ´Ï´Ù. ÀÏÀü¿¡ 'Fedora Core 3 remote/local shellcode format string' ¹®¼­¸¦ Àо½Å ºÐÀ̶ó¸é, Æ÷¸Ë½ºÆ®¸µ ±â¹ýÀ» ÅëÇØ ¿øÇÏ´Â ¸Þ¸ð¸® ¿µ¿ª¿¡ shellcode¸¦ ¿Ã¸± ¼ö ÀÖÀ½À» Àß ¾Ë°í °è½Ç °Ì´Ï´Ù. ±×·±µ¥ Áö±ÝÀÇ °æ¿ì¿¡´Â ±× ¹æ¹ýµµ Èûµé¾î º¸À̴±º¿ä. À̹ø °ø°ÝÀÇ ³­°üÀº shellcode¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ã´Â ÀϺ¸´Ù ÀÌ ¿µ¿ª¿¡ shellcode¸¦ »ý¼ºÇÏ´Â ÀÏÀÌ µÉ °Í °°½À´Ï´Ù.

 ¹®Á¦ÀÇ ÇØ°áÃ¥

ÇöÀç ´ç¸éÇÑ °¡Àå Å« ¹®Á¦´Â ¶óÀ̺귯¸® ¿µ¿ª¿¡ shellcode¸¦ ÀÔ·ÂÇÒ ¼ö ÀÖ´À³ÄÀÇ ¿©ºÎÀÔ´Ï´Ù. ¶óÀ̺귯¸® ÁÖ¼Ò¿¡´Â Ç×»ó NULLÀ» Æ÷ÇÔÇϵµ·Ï µÇ¾î Àֱ⠶§¹®¿¡ ¹®Á¦Á¡ÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î¼­, NULLÀ» Æ÷ÇÔÇÏ´Â ¶óÀ̺귯¸® ÁÖ¼Ò¿¡ ƯÁ¤ °ªÀ» µ¤¾î¾º¿ì±â À§ÇØ °ø°Ý Äڵ带 ±¸¼ºÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù. -- ¿¹: 0x0086c0ec ÀϹÝÀûÀÎ format string °ø°Ý ÄÚµå: "\xec\xc0\x86\x00\xee\xc0\x86\x00%00000x%n%00000x%n" -- À§ °ø°Ý ÄÚµå´Â Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ±× ÀÌÀ¯´Â ÀÔ·Â Áß°£¿¡ NULL("\x00") °ªÀÌ µé¾î°¡±â ¶§¹®ÀÌÁÒ. ÀÌ¿Í °°ÀÌ NULLÀ» Æ÷ÇÔÇÏ´Â ÁÖ¼Ò À§Ä¡¿¡ ƯÁ¤°ªÀ» ÀÔ·ÂÇÏ´Â °ÍÀº ¸Å¿ì ¾î·Æ½À´Ï´Ù. ±×·¡¼­ Àú´Â NULL °ªÀ» µ¤¾î¾º¿ï ¼ö ÀÖ´Â ¸î °¡Áö ±â¼ú¿¡ ´ëÇØ ¿¬±¸ÇÏ¿´½À´Ï´Ù. ¼º°ø°ú ½ÇÆÐ ¿©ºÎ¿Í »ó°ü¾øÀÌ Á¦°¡ »ý°¢Çß´ø ¹æ¹ýÀ» ¼³¸íµå¸®°í ³Ñ¾î°¡µµ·Ï ÇϰڽÀ´Ï´Ù. ¾ÕÀ¸·ÎÀÇ ¼³¸í¿¡¼­ ƯÁ¤°ªÀ¸·Î µ¤¾î¾º¿ì°íÀÚ ÇÏ´Â ´ë»ó À§Ä¡ÀÇ ÁÖ¼Ò°ªÀ» retlocÀ̶ó Ç¥ÇöÇϰڽÀ´Ï´Ù. ¶ÇÇÑ, ´ë»ó À§Ä¡(retloc)¿¡ µ¤¾î¾º¿ì´Â ƯÁ¤°ªÀ» retaddrÀ̶ó ºÎ¸£µµ·Ï ÇϰڽÀ´Ï´Ù. 1. °á°úÀûÀ¸·Î ½ÇÆÐÇÑ °ø°Ý ¹æ¹ý ¿ì¼±, °£´ÜÇÏ°Ô »ý°¢ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ µ¤¾î¾²°íÀÚ ÇÏ´Â NULLÀÌ µé¾î°£ retlocÀ» ¸ÕÀú $-flag·Î ÀоîµéÀÏ ¼ö ÀÖ´Â À§Ä¡¿¡ µ¤¾î¾º¿î ÈÄ, ±× °ªÀ» $-flag·Î ´Ù½Ã Àоî ÃÖÁ¾ÀûÀ¸·Î NULL °ªÀÌ µé¾î°£ retloc¿¡ retaddrÀ» µ¤¾î¾º¿ì´Â ¹æ¹ýÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀ» ½ÇÇöÇϱâ À§ÇØ Fedora Core°¡ ¾Æ´Ñ ȯ°æ¿¡¼­ ¸î °¡Áö Å×½ºÆ®¸¦ ÇØº» °á°ú, ¾ÈŸ±õ°Ôµµ °ø°ÝÀº ½ÇÆÐÇÏ¿´½À´Ï´Ù. $-flag·Î Á¢±ÙÇÒ ¼ö Àִ ƯÁ¤ stack À§Ä¡¿¡ ¿ì¸®°¡ µ¤¾î¾²´Âµ¥ »ç¿ëÇÒ NULLÀÌ µé¾î°£ retloc °ªÀ» µ¤¾î¾º¿î ÈÄ, $-flag¸¦ ÅëÇØ ´Ù½Ã Àд °ø°Ý ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù. -- ¿¹: retloc: 0xbffffbc4 retaddr: 0x08049500 (Âü°í·Î, ÁÖ¼Ò¿¡ NULL °ªÀÌ µé¾î°¡ ÀÖÀ½) exploit code: "\xc4\xfb\xff\xbf\xc6\xfb\xff\xbf%38136x%1$n%29444x%2$n|%72$x|"; -- À§ °ø°Ý Äڵ带 ½ÇÇàÇϸé, 0xbffffbc4 ÁÖ¼Ò¿¡ 0x08049500 °ªÀ» µ¤¾î¾º¿ó´Ï´Ù. ÀÌÁ¦ ÇØ´ç À§Ä¡¿¡ ÀÖ´Â °ªÀ» $-flag 72¹øÂ°¸¦ ÅëÇØ Àоî¿À¸é, Á÷Á¢ÀûÀ¸·Î NULLÀ» Æ÷ÇÔÇÏ´Â retlocÀ» ÀÔ·ÂÇÏÁö ¾Ê¾Æµµ stack¿¡ ¾²¿©Áø °ªÀ» ÅëÇØ °ø°ÝÀÌ °¡´ÉÇÒ °ÍÀÌ¶ó ¿¹»óÇÑ °ÍÀÔ´Ï´Ù. ÀÌ °¡Á¤ÀÌ Æ²¸° ÀÌÀ¯´Â °£´ÜÇÕ´Ï´Ù. ±× ÀÌÀ¯´Â $-flag°¡ ÇØ´ç À§Ä¡¿¡ °ªÀ» Àоî¿Ã ¶§, format string °ø°Ý¿¡ ÀÇÇØ µ¤¾î ¾º¿î 0x08049500 °ªÀ» Àоî¿ÀÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù. Áï, 0xbffffbc4 À§Ä¡ÀÇ °ªÀ» Àоî¿Ã ¶§, °ø°Ý Äڵ忡 ÀÇÇØ ƯÁ¤°ªÀÌ µ¤¾î¾º¿öÁö±â ÀÌÀü¿¡ ÀÌ¹Ì °ªÀ» Àоî¿À±â ¶§¹®¿¡ ÇØ´ç À§Ä¡¿¡ ÀÖ´ø dummy °ªÀ» ÀÐ°Ô µË´Ï´Ù. ±×·¡¼­ °ø°ÝÀº ¼º°øÇÒ ¼ö ¾ø½À´Ï´Ù. 2. retloc¿¡ µ¤¾î¾º¿ï ³»¿ëÀÌ ÀûÀ» °æ¿ì ¼º°øÀûÀÎ °ø°Ý ¹æ¹ý ÀÌ ¹æ¹ýÀº retloc¿¡ NULLÀÌ µé¾î°£ ÁÖ¼Ò¸¦ °ø°ÝÇÏ´Â ¹æ¹ý Àܷ̿Π±âÁ¸ÀÇ format string °ø°Ý ±â¹ý°ú ´Ù¸¥ °ø°Ý ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù. ¿ø¸®´Â °°Áö¸¸, °ø°Ý ÄÚµåÀÇ ±¸Á¶´Â ÇöÀúÈ÷ ´Ù¸£°Ô ±¸¼ºµË´Ï´Ù. ÀϹÝÀûÀÎ format string °ø°Ý ÄÚµå´Â Ç×»ó µ¤¾î ¾º¿ì°íÀÚ ÇÏ´Â retlocÀ» µÎ ¹ø ÀÌ»ó stack¿¡ ÀÔ·ÂÇØµÎ¾î¾ß °ø°Ý¿¡ ¼º°øÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î 0x080494dc ÁÖ¼Ò¸¦ µ¤¾î¾º¿ì·Á¸é '0x0804 / 0x94dc'¿Í °°Àº ½ÄÀ¸·Î µÎ ¹ø¿¡ ³ª´©¾î °ªÀ» µ¤¾î¾º¿ö¾ß °ø°ÝÀÌ °¡´ÉÇÑ °ÍÀÌÁÒ. ÇÑ ¹ø¿¡ °ªÀ» µ¤¾î¾º¿ìÁö ¸øÇÏ´Â ÀÌÀ¯´Â °£´ÜÇÕ´Ï´Ù. ÀÔ·ÂÇØ¾ß ÇÏ´Â retaddr °ªÀ» 16Áø¼ö¿¡¼­ 10Áø¼ö·Î º¯È¯ÇØÁÖ°í³ª¸é ÀÔ·ÂÀÌ ºÒ°¡´ÉÇÒ Á¤µµ·Î °ªÀÌ Ä¿Á®¹ö¸®±â ¶§¹®ÀÔ´Ï´Ù. ±×·¡¼­ À̸¦ ÃÖ¼Ò µÎ ¹ø¿¡ °ÉÃÄ ³ª´©¾î ¾µ ¼ö ¹Û¿¡ ¾ø½À´Ï´Ù. ±×·¯³ª Áö±Ý°ú °°ÀÌ retloc¿¡ NULLÀÌ ÀÖÀ» °æ¿ì retlocÀ» µÎ ¹øÀÌ ¾Æ´Ñ ÇÑ ¹ø¸¸ ÀÔ·ÂÇÏ¿© °ø°ÝÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» »ý°¢Çغ¼ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °ø°Ý ¹æ¹ýÀº ¿¬¼ÓÇÏ´Â ÁÖ¼Ò¸¦ ÀÔ·ÂÇÏÁö ¸øÇÒ ¶§, (¶Ç´Â, °ªÀ» ¾Æ¿¹ ÀÔ·ÂÇÏÁö ¸øÇÏÁö¸¸ stack »óÀÇ ÀϺκп¡ À§Ä¡ÇÏ¿© ¹Ýµå½Ã ±× ÁÖ¼Ò¸¦ ÇÑ ¹ø¸¸ ÂüÁ¶ÇÏ¿© °ø°ÝÇØ¾ß ÇÏ´Â °æ¿ì) ¸Å¿ì È¿°úÀûÀÏ °ÍÀÔ´Ï´Ù. -- ¿¹: 0x0086c0ec ÀϹÝÀûÀÎ format string °ø°Ý ÄÚµå: "\xec\xc0\x86\x00\xee\c0\x86\x00%00000x%n%00000x%n" °í¾ÈµÈ °ø°Ý ÄÚµå: "%109479558x%109479558x%109479558x%109479558x%109479558x%109479558x %109479558x%109479558x%109479558x%109479563x%37\$n"+`printf "\xec\xc0\x86\x00"` ¶Ç´Â, "%999999999x%9479559x%$-flagÆ÷¸Ë½ºÆ®¸µn`printf "\xec\xc0\x86\x00"` ÀÌ¿Í °°Àº ½ÄÀ¸·Î °ø°Ý ±¸¼ºÀÌ °¡´ÉÇÕ´Ï´Ù. -- À̰ÍÀº 0x0086c0ec ÁÖ¼Ò¿¡ 0x41414141À̶õ °ªÀ» µ¤¾î¾º¿ì´Â °ø°Ý ÄÚµåÀÔ´Ï´Ù. Á» ¿ì½À°Ô »ý°åÁö¸¸, "%¼ýÀÚx" Æ÷¸Ë½ºÆ®¸µ ¾Õ¿¡ ³ÖÀ» ¼ö ÀÖ´Â Á¤¼öÀÇ Å©±â´Â ÀÚ¸´¼ö·Î 9°³¸¦ ³Ñ±â¸é ¾ÈµÇ±â ¶§¹®¿¡ 0x41414141À̶õ °ªÀ» Çѹø¿¡ µ¤¾î¾º¿ì´Â °ÍÀº ¹«¸®¶ó°í º¼ ¼ö ÀÖÁÒ. (0x41414141 == 1094795585) ±×·¯¹Ç·Î, 9°³ÀÇ ÀÚ¸´¼ö¸¦ ÀÌ¿ëÇÏ¿© ³ª´©¾î µ¤¾î¾º¿ì¸é µË´Ï´Ù. 109479558 x 10¿¡ +5¸¦ ´õÇϸé 1094795585°¡ µÇ´Âµ¥ ÀÌ 10Áø¼ö °ªÀ» 16Áø¼ö·Î º¯È¯Çϸé 0x41414141ÀÌ µË´Ï´Ù. À̷νá, stack »ó¿¡ ÁÖ¼Ò°ªÀÌ ÇÑ °³¸¸ À־ µ¤¾î¾º¿ì±â °ø°ÝÀÌ °¡´ÉÇØÁ³½À´Ï´Ù. ^_^ À̰ÍÀº ½Ç·Î ¸¹Àº ºÐ¾ß¿¡ ÀÀ¿ëµÉ °ÍÀÔ´Ï´Ù. 3. ¹«ÀÛÀ§ ´ëÀÔÀÌ °¡´ÉÇÒ °æ¿ì, ¸Å¿ì ¼º°øÀûÀÎ ¹æ¹ý random stack°ú °°Àº º¹ÀâÇÑ È¯°æÀÇ °æ¿ì, $-flag¸¦ ÅëÇØ ÇØ´ç À§Ä¡¿¡ ÀÖ´Â °ªÀ» ¹«ÀÛÀ§·Î ´ëÀÔÇØÁÖ´Â ³ë°¡´Ù °ø°ÝÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¹«ÀÛÀ§ ´ëÀÔ¹ýÀº exploitÀ» Á¦ÀÛÇØÁÖ¸é ¾î´À Á¤µµ ÇØ°áµÉ ¼ö ÀÖ´Â ¹®Á¦À̱⠶§¹®¿¡ ¾Õ¼­ ¼³¸íµå·È´ø ¶óÀ̺귯¸® ¿µ¿ªÀ» °ø·«ÇÒ ¶§ °¡Àå ÁÁÀº ¹æ¹ýÀ̶ó ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿ì¼± ÀÌ ¹æ¹ýÀº ȯ°æ º¯¼ö ¶Ç´Â ÇÁ·Î±×·¥ ÀÎÀÚ °ªÀ» ÀÌ¿ëÇÏ¿© °ø°ÝÇÕ´Ï´Ù. ±×·¸±â ¶§¹®¿¡ °ø°Ý¿¡ ¼º°øÇÏ·Á¸é $-flag¸¦ ¹Ýµå½Ã ÀÌ¿ëÇØ¾ß Çϸç, ÇöÀçÀÇ stack¿¡¼­ ȯ°æ º¯¼ö°¡ ÀÖ´Â stack À§Ä¡±îÁö µµ´ÞÇÏ´Â ¸¸Å­ÀÇ Å©±â¸¦ $-flag ÀÎÀÚ °ªÀ¸·Î ´ëÀÔÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. ±×·¸±â ¶§¹®¿¡ ¹«ÀÛÀ§·Î º¯°æµÇ´Â ȯ°æ º¯¼öÀÇ stack À§Ä¡¸¦ Âï´Â brute-force °ø°Ý °úÁ¤À» ÇÊ¿ä·Î ÇÏ°Ô µË´Ï´Ù. À§Ä¡¸¦ ¸ÂÃß´Â °ÍÀÌ ÃÖ´ë °ü°ÇÀ̱⠶§¹®¿¡ $-flag ±â¹ýÀ» ÅëÇØ ÀûÀýÇÑ À§Ä¡¸¸ ÆÄ¾ÇÇÑ´Ù¸é °ø°ÝÀ» ¼º°ø½Ãų ¼ö ÀÖ½À´Ï´Ù. ÀϹÝÀûÀ¸·Î stack »óÀÇ È¯°æ º¯¼ö´Â ´ÙÀ½°ú °°Àº ±¸Á¶¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. -- "A=B\0" "C=D\0" "HOSTNAME=test\0" "X82=Xpl017Elz\0" "SHELL=/bin/bash\0" -- À§ÀÇ ±¸Á¶´Â »ç¿ëÀÚ°¡ stack¿¡ NULL ÀÔ·ÂÀ» ÇÒ ¼ö ÀÖµµ·Ï ¸Å¿ì ÁÁÀº Á¶°ÇÀ» Á¦½ÃÇØÁÖ°í Àִµ¥, ¿¹¸¦ µé¾î 0xf7004150 ÁÖ¼Ò °ªÀ» ÀÔ·ÂÇϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ±¸¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. -- "A=\x50\x41\0" "\xf7=abcde\0" "B=\x52\x41\0" "\xf7=abcde\0" -- ±×·¯¸é ½ÇÁ¦ stackÀº ´ÙÀ½°ú °°Àº ¸ð¾çÀÌ µË´Ï´Ù. -- ȯ°æ º¯¼ö... 0xf7004150 ... ȯ°æ º¯¼ö... 0xf7004152 ... ȯ°æ º¯¼ö -- [º¸±â: ȯ°æ º¯¼ö stack ³»¿ë] °¢ ȯ°æ º¯¼ö´Â Ç×»ó µÞ ºÎºÐ¿¡ NULLÀ» ºÙ¿©ÁÖ¾î ±¸ºÐÇϱ⠶§¹®¿¡ ¿ì¸®°¡ ¿øÇÏ´Â ÁÖ¼Ò°ª retlocÀ» ÀÔ·ÂÇϱ⿣ ÃæºÐÇÑ ¿©°ÇÀÔ´Ï´Ù. ¶ÇÇÑ, ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ ¿ª½Ã ÀÌ¿Í µ¿ÀÏÇÑ ±¸Á¶¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. -- argv[0] argv[1] argv[2] argv[3] ... [XXXX][\0][XXXX][\0][XXXX][\0][XXXX][\0] ... -- [º¸±â: ÇÁ·Î±×·¥ ÀÎÀÚ stack ³»¿ë] ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ °ªÀ» ÀÌ¿ëÇÑ ¹æ¹ý ¿ª½Ã, °¢ ÀÎÀÚ°ªÀÇ µÞ ºÎºÐ¿¡ NULLÀÌ µé¾î°¡±â ¶§¹®¿¡ $-flag¸¦ ÀÌ¿ëÇØ ÀÎÀÚ °ªÀÌ À§Ä¡Çϰí ÀÖ´Â stack À§Ä¡¸¦ ¿¹ÃøÇÒ °æ¿ì, °ø°ÝÀ» ¼º°ø½Ãų ¼ö ÀÖ½À´Ï´Ù.

 °ø°Ý ½Ã³ª¸®¿À ±¸¼º

°ø°Ý ½Ã ¹®Á¦°¡ µÇ¾ú´ø ³­°üµµ ÀÌÁ¦ ¾î´À Á¤µµ ÇØ°áµÈ µí Çϰí, ÀüüÀûÀÎ °ø°Ý ½Ã³ª¸®¿À¸¦ ÀÛ¼ºÇغ¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¿Ï¼ºµÈ °ø°Ý ½Ã³ª¸®¿À´Â ´ÙÀ½°ú °°½À´Ï´Ù. 1. ½Ã½ºÅÛ ³»¿¡¼­ »ç¿ë °¡´ÉÇÑ(¾²°Å³ª ½ÇÇà) ¶óÀ̺귯¸® °ø°£ ÁÖ¼Ò¸¦ ¾ò½À´Ï´Ù. 2. ¾ò¾îÁø ¶óÀ̺귯¸® ÁÖ¼Ò¸¦ ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ·Î ÀÔ·ÂÇϸ鼭 $-flagÀÇ À§Ä¡¸¦ ã½À´Ï´Ù. (stack »óÀÇ À§Ä¡°¡ Áö¼ÓÀûÀ¸·Î º¯µ¿µÇÁö¸¸, µ¿ÀÏÇÑ À§Ä¡·Î µ¹¾Æ¿À´Â °£°ÝÀº ºñ±³Àû ª½À´Ï´Ù.) 3. $-flag¸¦ ÅëÇØ ¶óÀ̺귯¸® ÁÖ¼Ò À§Ä¡¸¦ Á¤È®ÇÏ°Ô ¾òÀ» ¼ö ÀÖ°Ô µÇ¾ú´Ù¸é, ÀÌ ¿µ¿ª¿¡ 24byte shellcode¸¦ ÀÔ·ÂÇÕ´Ï´Ù. 4. ÇÁ·Î±×·¥ÀÇ .dtors +4 ÁÖ¼Ò¸¦ ¾ò¾î ÀÌ ÁÖ¼Ò °ø°£¿¡ shellcode¸¦ »ý¼ºÇÑ ¶óÀ̺귯¸® °ø°£ ÁÖ¼Ò¸¦ ³Ö¾îÁÝ´Ï´Ù. À̹ø °ø°ÝÀº ÀÌÀü shellcode exploit ¹®¼­¿Í ¸¶Âù°¡Áö·Î gdb µð¹ö±ë °úÁ¤À» »ý·«ÇÏ¿´½À´Ï´Ù. ±× ÀÌÀ¯´Â µð¹ö±ë °ø°Ý ½Ã stack »óÅÂ¿Í ½ÇÁ¦ °ø°Ý ½Ã stack »óÅÂÀÇ Â÷À̰¡ Å©±â ¶§¹®ÀÔ´Ï´Ù. ÀϹÝÀûÀÎ exploitÀÇ °æ¿ì µð¹ö±ë °úÁ¤À» °ÅÄ¡´Â °ÍÀÌ ¼ø¼­¶ó°í ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì, µð¹ö±ë °á°ú¿Í ½ÇÁ¦ °ø°Ý ½Ã stack ¿ÀÂ÷°¡ Àû±â ¶§¹®¿¡ ¾î´À Á¤µµ °è»êÇØÁÖ¸é ½ÇÁ¦ °ø°ÝÀ» °¡º±°Ô ¼º°ø½Ãų ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸, À̹ø °ø°ÝÀÇ °æ¿ì, format string ±â¹ýÀ» ÅëÇØ stackÀÇ »óŸ¦ ¾î´À Á¤µµ °Ë»çÇÒ ¼ö ÀÖ°í, ¾Õ¼­ ¸»¾¸µå¸° ÀÌÀ¯ ¶§¹®¿¡ gdb µð¹ö±ë °úÁ¤À» »ý·«ÇÑ °ÍÀÔ´Ï´Ù. (ÀÛ¼ºÀÚÀÇ ±ÍÂ÷´ÏÁòÀ¸·Î ÀÎÇØ Åë°·Î »ý·«ÀÌ °¡´ÉÇØÁ®¹ö·È½À´Ï´Ù. -_-... Á˼ÛÇÕ´Ï´Ù.)

 °ø°Ý °á°ú

Áö±Ý ¼³¸íÇÏ´Â °ø°Ý ÄÚµå´Â º°µµ·Î ¹®¼­¿Í ÇÔ²² ÷ºÎÇÏ¿´½À´Ï´Ù. °ø°Ý ÄÚµå´Â ´ÙÀ½ÀÇ ±â´ÉÀ» Â÷·Ê´ë·Î ¼öÇàÇÕ´Ï´Ù. 1. dtors À§Ä¡¿¡ shellcode°¡ ÀÖ´Â library ÁÖ¼Ò¸¦ µ¤¾î¾º¿ì±â À§ÇØ »ç¿ëµÇ´Â $-flag °ªÀ» ¾ò½À´Ï´Ù. ÀÌ °ªÀº format string Ãë¾àÁ¡ÀÌ Á¸ÀçÇϴ ù ¹øÂ° ÀÎÀÚ¿¡ µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÏ¿© stack°úÀÇ Â÷°¨°Å¸®¸¦ °è»êÇÕ´Ï´Ù. (exploit part 1) 2. library ÁÖ¼Ò¿¡ shellcode¸¦ µ¤¾î¾º¿ì±â À§ÇØ »ç¿ëµÇ´Â $-flag °ªÀ» ¾ò½À´Ï´Ù. $-flag ´ëÀÔ¹ýÀ» ÅëÇØ °ø°Ý ´ë»ó ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ °ªÀ¸·Î ÀÔ·ÂÇÑ µ¥ÀÌÅÍ¿Í ÀÏÄ¡ÇÏ´Â stack À§Ä¡¸¦ ¾ò½À´Ï´Ù. (exploit part 1) 3. °ø°Ý¿¡ ÇÊ¿äÇÑ libraryÀÇ Á¤È®ÇÑ À§Ä¡¿Í dtors ÁÖ¼ÒÀÇ À§Ä¡¸¦ ¾ò½À´Ï´Ù. (exploit part 1) 4. ´ÙÀ½°ú °°Àº °ø°Ý ¹öÆÛ¸¦ ±¸¼ºÇÕ´Ï´Ù. (exploit part2) -- °ø°Ý ´ë»ó ÇÁ·Î±×·¥ÀÇ Ã¹ ¹øÂ° ÀÎÀÚ: [.dtors1][.dtors2] [%16Áø¼ö shellcode¸¦ 10Áø¼ö·Î º¯°æÇÑ ÈÄ, $-flag¸¦ ÅëÇØ library À§Ä¡¿¡ µ¤¾î¾º¿ì´Â °ø°ÝÄÚµå] [%.dtors¸¦ shellcode°¡ Á¸ÀçÇÏ´Â library À§Ä¡ ÁÖ¼Ò·Î µ¤¾î¾º¿ì´Â °ø°ÝÄÚµå] °ø°Ý ´ë»ó ÇÁ·Î±×·¥ÀÇ µÎ ¹øÂ° ÀÎÀÚºÎÅÍ 3byte library ÁÖ¼Ò°¡ ¼ø¼­´ë·Î µé¾î°¨ $-flag¿¡ ÀÇÇØ ¿Ã¹Ù¸¥ library ÁÖ¼Ò°ªÀÌ ÀÐÈ÷±â À§Çؼ­´Â alignÀÌ Á¤È®È÷ ¸ÂÃçÁ®¾ß Çϴµ¥ À̸¦ À§ÇØ ÀÎÀÚ Áß°£¿¡ PAD Äڵ带 ÀÔ·ÂÇÏ¿© Á¶ÀýÇÕ´Ï´Ù. -- 5. library ÁÖ¼Ò °ªÀÇ alignÀ» ¸ÂÃß±â À§ÇØ, PAD °ªÀ» ´Ã·Á°¡¸é¼­ ¹«ÇÑ ´ëÀÔ °ø°ÝÀ» ½ÃµµÇÕ´Ï´Ù. ½ÇÁ¦ °ø°Ý ÄÚµåÀÇ ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°½À´Ï´Ù.

[x82@fc5 shellcode_ex]$ cat printf.c
#include <stdio.h>

int main(int argc,char *argv[])
{
        char ppp[4096];
        strncpy(ppp,argv[1],sizeof(ppp)-1);
        printf(ppp);
}

[x82@fc5 shellcode_ex]$ ls -al printf
-rwsr-xr-x 1 root root 4805 May 20 22:18 printf
[x82@fc5 shellcode_ex]$ id
uid=500(x82) gid=500(x82) groups=500(x82) context=root:system_r:unconfined_t:SystemLow-SystemHigh
[x82@fc5 shellcode_ex]$ ./part_one ./printf
--
Fedora Core Linux 4,5 based shellcode format string POC exploit
exploit by "you dong-hun"(Xpl017Elz), <szoahc@hotmail.com>.
--

Start exploit part #1
find stack...
gap: 5
find exploit arguments...
### ### ### ### ### ### ### ### ### ### ### ### ### ###
$-flag: 1835, align: 2, ret $-flag: 5
Start exploit part #2
Input Any key...


		...

					...
							...


			...
									...


                                                        sh-3.1# id
uid=0(root) gid=500(x82) groups=500(x82) context=root:system_r:unconfined_t:SystemLow-SystemHigh
sh-3.1#
[º¸±â: exploit ½ÇÇà °á°ú] À§¿Í °°ÀÌ root shellÀ» ¼º°øÀûÀ¸·Î ½ÇÇàÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. ÀÌ·¯ÇÑ ½ÇÇà °á°ú´Â ½Ã½ºÅÛ È¯°æ¿¡ µû¶ó ´Ù¸£°Ô ³ªÅ¸³¯ ¼ö ÀÖÀ¸¸ç, ´ëÀÔ °ø°Ý ½Ã°£ ¶ÇÇÑ, stackÀÇ À§Ä¡¿¡ µû¶ó õÂ÷¸¸º°·Î ´Ù¸¦ °ÍÀÔ´Ï´Ù.

 ³¡ ¸ÎÀ½

ÀÌ °ø°Ý ¹æ¹ýÀº ¾ÆÁ÷±îÁö Proof-of-Concept ¼ºÇâÀÌ °­ÇÕ´Ï´Ù. ExecshieldÀÇ µµÀÔÀ¸·Î °ø°ÝÀÌ ¾î·Á¿öÁø ȯ°æ¿¡¼­ shellcodeÀÇ ½ÇÇàÀ» Áõ¸íÇÏ´Â °ø°Ý ±â¹ýÀÌ µÉ °ÍÀÔ´Ï´Ù. ¹°·Ð ÀÌ ¹æ¹ý »Ó¸¸ ¾Æ´Ï¶ó, °ø°ÝÀÇ ¼º°øÀ» À§ÇØ »ç¿ëµÇ¾ú´ø °¢°¢ÀÇ ±â¼úµéÀº ÃæºÐÈ÷ Ȱ¿ëÀÌ °¡´ÉÇÑ °ÍµéÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, NULL °ªÀ» ó¸®ÇÏ´Â format string ±â¹ýÀ» ÅëÇØ -PIE ¸ðµå·Î ÄÄÆÄÀÏµÈ ÇÁ·Î±×·¥À» Return-to-library ±â¹ýÀ¸·Î °ø°ÝÇϴµ¥ ÀÀ¿ëµÉ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ¾ðÁ¦³ª ±×·¸Áö¸¸, ´Ù¼Ò ¹«½ÄÇÑ °ø°Ý ±â¹ýÀÌ ¶§·Î´Â À¯¿ëÇÑ exploit ¹æ¹ýÀ¸·Î Ȱ¿ëµÇ°ï ÇÕ´Ï´Ù. ÀÌ ¹æ¹ý ¿ª½Ã ±×·¸´Ù´Â °ÍÀ» º¸¿©ÁÖ°í ÀÖÁö¿ä. ¹®¼­°¡ ±ò²ûÇÏÁö ¸øÇÑ °ÍÀº ÀúÀÚ°¡ Ã³ÇØÀÖ´Â ÇöÀç »óȲÀ» °£Á¢ÀûÀ¸·Î ³ªÅ¸³»ÁÖ°í ÀÖ½À´Ï´Ù. ¿äÁò ȸ»ç ¾÷¹«°¡ ¹ö°Å¿ï Á¤µµ·Î Á¤¸» ŸÀÌÆ®Çϳ׿ä... -_¤Ð Ç×»ó, ±×·¸µí ¹®¼­ÀÇ ¿À·ù´Â Çǵå¹é ¹Ù¶ó±¸¿ä. ¿ÀŸ°¡ ¾à°£ÀÇ ½Ç¼ö´Â ³Ê±×·¯ÀÌ ³Ñ¾î°¡ÁÖ½Ã±æ ¹Ù¶ó¸é¼­, ¹®¼­¸¦ ³¡ ¸Îµµ·Ï ÇϰڽÀ´Ï´Ù.

 Âü°íÇÑ ·¹ÆÛ·±½º

ÀÛ¼ºÀÚ: À¯µ¿ÈÆ - Fedora Core3 ³»¿¡¼­ shellcode¸¦ »ç¿ëÇÏ´Â local & remote format string exploit ¹æ¹ý (Fedora Core 3 based shellcode local & remote format string exploit method)

by "dong-houn yoU" (Xpl017Elz), in INetCop(c)