Ä¿³Î ¸ðµâ°ú °°Àº Ä¿³Î ¿µ¿ª¿¡¼­ µ¿ÀÛÇÏ´Â ÄÚµåµéÀÌ À¯Àú¿µ¿ªÀÇ Æ¯Á¤ÆÄÀÏÀ» ÀÐ°í ¾²´Â °ÍÀº °áÄÚ ÁÁÀº ¹æ¹ýÀÌ ¾Æ´Ï´Ù. ¸¹Àº Ä¿³Î ´ººñµéÀÌ ÀÌ·¯ÇÑ ¹æ¹ýÀ» Áú¹®ÇÏ¸é ´ëºÎºÐÀÇ ´ë´äÀº "±×·¯ÇÑ ÁþÀº ÇÏÁö¸»¶ó"ÀÌ´Ù. ´ë½Å¿¡ ´Ù¸¥ ¹æ¹ýµéÀ» ÃßõÇÏ°ï ÇÑ´Ù. procÀ̳ª ioctl, sysfsÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ±×·¸´Ù¸é ¿Ö ±×·¯ÇÑ ÁþÀ» ÇÏÁö ¸»¶ó°í Ãæ°íÇÏ´Â °ÍÀϱî ? 1. Ä¿³ÎÀÇ º¸È£¶§¹®ÀÌ´Ù. ÆÄÀÏÀÇ µ¥ÀÌÅ͸¦ interpretÇØ°¡´Â °úÁ¤¿¡¼­ À¯¹ßµÇ´Â ¿¡·¯´Â ¹öÆÛ¿À¹öÇÃ·Î¿ì °ø°ÝÀ» ¹ÞÀ» ¼ö ÀÖ´Ù. 2. Á¤Ã¥¹®Á¦ÀÌ´Ù. ƯÁ¤ ÆÄÀÏ ½Ã½ºÅÛÀ¸·ÎºÎÅÍ Æ¯Á¤À§Ä¡¿¡¼­ ƯÁ¤ÆÄÀÏÀ» Àоî¾ß ÇÏ´Â Ä¿³Î ¸ðµâÀº À¯Àú¿µ¿ª¿¡¼­ Á¦°øÇØ¾ß ÇÏ´Â ÆÄÀÏ¿¡ ÀÇÁ¸ÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀº Ä¿³Î °³¹ßÀÚµéÀÌ ÃÖ´ëÇÑ ÇÇÇÏ·Á´Â Á¤Ã¥ÀÌ´Ù. ±âŸ ¸¹Àº ¶Ç ´Ù¸¥ ¹®Á¦µéÀÌ ÀÖÁö¸¸ ÀÌÇØ°¡ Àß ¾ÈµÇ¼­..:-( ±×·¸´Ù¸é °áÄÚ ÆÄÀÏÀ» ÀÐÀ»¼ö ÀÖ´Â ¹æ¹ýÀÌ ¾ø´Ü ¸»Àΰ¡?? ±×°Ç ¾Æ´Ï´Ù. ÇÏÁö¸¸ ÀúÀÚ´Â ¸»ÇÏ°í ÀÖ´Ù. °áÄÚ ÀÌ·¯ÇÑ ÄÚµåµéÀ» ³²¿ëÇÏÁö¸»°í ³»°¡ ¾Ë·ÁÁá´Ù°í ¾ê±âÇÏÁöµµ ¸»°í.. Ä¿³Î Äڵ忡 submitµÉ Äڵ忡´Â ÀÌ·± ÄÚµåµéÀ» ³ÖÁö ¸»¶ó°í..- µµ´ëü ¿Ö ¾Ë·ÁÁÖ´Â °Å¾ß :-( °¡Àå °£´ÜÇÑ ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù. {{{ fd = sys_open(filename, O_RDONLY, 0); if (fd >= 0) { /* read the file here */ sys_close(fd); } }}} ÇÏÁö¸¸ Ä¿³Î ¿µ¿ª¿¡¼­ ÀÌ·¯ÇÑ ÄÚµå´Â Ç×»ó ½ÇÆÐÇÏ°í ¸» °ÍÀÌ´Ù. ÀÌÀ¯´Â ´ÙÀ½°ú °°´Ù. * '''Ä¿³ÎÀº sys_open¿¡ ³Ñ¾î¿Â Æ÷ÀÎÅÍ°¡ À¯Àú¿µ¿ª¿¡¼­ ¿Â°ÍÀ̶ó°í ±â´ëÇÏ°í ÀÖ´Ù. ±×·¡¼­ À¯Àú¿µ¿ª¿¡¼­ÀÇ Æ÷ÀÎÅ͸¦ Ä¿³ÎÀÇ ³ª¸ÓÁö ºÎºÐ¿¡¼­µµ ¿øÈ°ÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¹Ù²Ù·Á°í ½ÃµµÇÑ´Ù.''' ÇÏÁö¸¸ ¿ì¸®°¡ ³Ñ±ä ÆĶó¹ÌÅÍ´Â Ä¿³Î ¿µ¿ªÀÇ Æ÷ÀÎÅÍÀÌ´Ù. ÀÌ·¯ÇÑ ¾îµå·¹½º °ø°£ÀÇ mismatch¸¦ ´Ù·ç±â À§Çؼ­ Ä¿³ÎÀº ´ÙÀ½°ú °°Àº ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. * get_fs() * set_fs() ÀÌ ÇÔ¼öµéÀº ÇöÀç '''ÇÁ·Î¼¼½º ÁÖ¼Ò Á¦ÇÑ'''À» È£ÃâÀÚÀÇ ¸¶À½µ¥·Î ¹Ù²Ü¼ö ÀÖ°Ô ÇØÁØ´Ù. sys_openÀÇ °æ¿ì ¿ì¸®´Â Ä¿³Î¿¡°Ô Ä¿³Î ÁÖ¼Ò °ø°£ÀÇ Æ÷ÀÎÅÍ°¡ ¾ÈÀüÇÏ´Ù°í ¸ÕÀú ¾Ë·Á¾ß ÇÑ´Ù. ±×·¡¼­ ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. {{{ set_fs(KERNEL_DS); }}} set_fs¿¡ validÇÑ ÀÎÀÚ´Â KERNEL_DS(Ä¿³Î µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®)¿Í USER_DS(À¯Àú µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®)»ÓÀÌ´Ù. ¶ÇÇÑ get_fs¸¦ ÅëÇÏ¿© ÀÌÀüÀÇ ÁÖ¼Ò Á¦ÇÑÀ» ȹµæÇÒ ¼ö ÀÖ°í, ÁÖ¼Ò Á¦ÇÑÀ» ¹Ù²Ù¾î ¿ì¸®°¡ ÇÏ°í ½ÍÀº ÀÏÀ» ÇÑÈÄ ¿ø·¡µ¥·Î º¹±Í ½Ãų ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇϸé ÃÖÁ¾ÀûÀ¸·Î ´ÙÀ½°ú °°Àº Äڵ带 »ç¿ëÇÒ ¼ö ÀÖ´Ù. {{{ old_fs = get_fs(); set_fs(KERNEL_DS); fd = sys_open(filename, O_RDONLY, 0); if (fd >= 0) { /* read the file here */ sys_close(fd); } set_fs(old_fs); }}} /etc/shadow¸¦ Àд ÄÚµå´Â ´ÙÀ½°ú °°´Ù. {{{ #include #include #include #include #include #include static void read_file(char *filename) { int fd; char buf[1]; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); fd = sys_open(filename, O_RDONLY, 0); if (fd >= 0) { printk(KERN_DEBUG); while (sys_read(fd, buf, 1) == 1) printk("%c", buf[0]); printk("\n"); sys_close(fd); } set_fs(old_fs); } static int __init init(void) { read_file("/etc/shadow"); return 0; } static void __exit exit(void) { } MODULE_LICENSE("GPL"); module_init(init); module_exit(exit); }}} À̹ø¿¡´Â write¸¦ Çغ¼ ½Ã°£ÀÌ´Ù. {{{ old_fs = get_fs(); set_fs(KERNEL_DS); fd = sys_open(filename, O_WRONLY|O_CREAT, 0644); if (fd >= 0) { sys_write(data, strlen(data); sys_close(fd); } set_fs(old_fs); }}} À§ÀÇ ÄÚµå´Â ÀÌ»ó¾øÀÌ ÄÄÆÄÀÏÀÌ µÈ´Ù. ±×·¯³ª ¸ðµâÀ» ·ÎµåÇÏ·Á°í ÇÒ ¶§ ´ÙÀ½°ú °°Àº ¿¡·¯¸¦ ¸¸³ª°Ô µÈ´Ù. {{{ insmod: error inserting 'evil.ko': -1 Unknown symbol in module }}} À§ÀÇ Àǹ̴ ³ÊÀÇ ¸ðµâÀÌ »ç¿ëÇÏ·Á´Â ½Éº¼Àº exportµÇÁö ¾Ê¾Ò°í Ä¿³Î³»¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. Ä¿³Î ·Î±×¸¦ »ìÆ캸¸é ¾î¶² ½Éº¼ÀÎÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. {{{ evil: Unknown symbol sys_write }}} ºñ·Ï sys_write°¡ syscalls.h ÆÄÀÏ¿¡ ÀÖ´Ù ÇÏ´õ¶óµµ Ä¿³Î ¸ðµâ¿¡¼­ »ç¿ëµÇ±â À§ÇØ exportµÇ¾î ÀÖÁö´Â ¾Ê´Ù. ±×·¸´Ù¸é sys_write¸¦ ¸¸µé¸é µÈ´Ù. :-) {{{ #include #include #include #include #include #include #include #include static void write_file(char *filename, char *data) { struct file *file; loff_t pos = 0; int fd; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); fd = sys_open(filename, O_WRONLY|O_CREAT, 0644); if (fd >= 0) { sys_write(fd, data, strlen(data)); file = fget(fd); if (file) { vfs_write(file, data, strlen(data), &pos); fput(file); } sys_close(fd); } set_fs(old_fs); } static int __init init(void) { write_file("/tmp/test", "Evil file.\n"); return 0; } static void __exit exit(void) { } MODULE_LICENSE("GPL"); module_init(init); module_exit(exit); }}} '''¿ø¹®ÀÇ Äڵ带 ±×´ë·Î ¿Å°Ü ³õ¾Ò´Ù. ÇÏÁö¸¸ ÀÌ»óÇÑ Á¡ÀÌ ÀÖ´Ù. sys_write¸¦ ¶Ç »ç¿ëÇÏ°í ÀÖ´Ù´Â °ÍÀÌ´Ù. °³ÀÎÀûÀÎ »ý°¢À¸·Î´Â ¿ÀŸ°°´Ù. sys_write´ë½Å¿¡ vfs_write¸¦ È£ÃâÇÏ°í ÀÖÀ¸¹Ç·Î sys_write¸¦ »ç¿ëÇÏ´Â ÄÚµå´Â ºüÁ®¾ß ÇÒ °Í °°´Ù. Å×½ºÆ®¸¦ Çغ¸Áö ¾Ê¾Æ¼­ È®½ÇÇÏÁø ¾Ê´Ù´Â Á¡ À¯³äÇØÁֱ⠹ٶõ´Ù.''' ÇÏÁö¸¸ °áÄÚ ÁÁÀº ¹æ¹ýÀº ¾Æ´Ï´Ù. °áÄÚ ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇÏÁö ¸»¾Æ¶ó! ±â»ç ¿ø¹® [http://www.linuxjournal.com/node/8110/print] ---- CategorySnippet