Ä¿³Î³»¿¡¼Read Write»ç¿ëÇϱâ
Ä¿³Î ¸ðµâ°ú °°Àº Ä¿³Î ¿µ¿ª¿¡¼ µ¿ÀÛÇÏ´Â ÄÚµåµéÀÌ À¯Àú¿µ¿ªÀÇ Æ¯Á¤ÆÄÀÏÀ» ÀÐ°í ¾²´Â °ÍÀº °áÄÚ ÁÁÀº ¹æ¹ýÀÌ ¾Æ´Ï´Ù.
¸¹Àº Ä¿³Î ´ººñµéÀÌ ÀÌ·¯ÇÑ ¹æ¹ýÀ» Áú¹®ÇÏ¸é ´ëºÎºÐÀÇ ´ë´äÀº "±×·¯ÇÑ ÁþÀº ÇÏÁö¸»¶ó"ÀÌ´Ù. ´ë½Å¿¡ ´Ù¸¥ ¹æ¹ýµéÀ» ÃßõÇÏ°ï ÇÑ´Ù. procÀ̳ª ioctl, sysfsÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ±×·¸´Ù¸é ¿Ö ±×·¯ÇÑ ÁþÀ» ÇÏÁö ¸»¶ó°í Ãæ°íÇÏ´Â °ÍÀϱî ?
±×·¸´Ù¸é °áÄÚ ÆÄÀÏÀ» ÀÐÀ»¼ö ÀÖ´Â ¹æ¹ýÀÌ ¾ø´Ü ¸»Àΰ¡?? ±×°Ç ¾Æ´Ï´Ù. ÇÏÁö¸¸ ÀúÀÚ´Â ¸»ÇÏ°í ÀÖ´Ù. °áÄÚ ÀÌ·¯ÇÑ ÄÚµåµéÀ» ³²¿ëÇÏÁö¸»°í ³»°¡ ¾Ë·ÁÁá´Ù°í ¾ê±âÇÏÁöµµ ¸»°í.. Ä¿³Î Äڵ忡 submitµÉ Äڵ忡´Â ÀÌ·± ÄÚµåµéÀ» ³ÖÁö ¸»¶ó°í..- µµ´ëü ¿Ö ¾Ë·ÁÁÖ´Â °Å¾ß
°¡Àå °£´ÜÇÑ ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
fd = sys_open(filename, O_RDONLY, 0); if (fd >= 0) { /* read the file here */ sys_close(fd); } ÇÏÁö¸¸ Ä¿³Î ¿µ¿ª¿¡¼ ÀÌ·¯ÇÑ ÄÚµå´Â Ç×»ó ½ÇÆÐÇÏ°í ¸» °ÍÀÌ´Ù. ÀÌÀ¯´Â ´ÙÀ½°ú °°´Ù.
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 <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> #include <linux/syscalls.h> #include <linux/fcntl.h> #include <asm/uaccess.h> 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 <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> #include <linux/syscalls.h> #include <linux/file.h> #include <linux/fs.h> #include <linux/fcntl.h> #include <asm/uaccess.h> 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¸¦ »ç¿ëÇÏ´Â ÄÚµå´Â ºüÁ®¾ß ÇÒ °Í °°´Ù. Å×½ºÆ®¸¦ Çغ¸Áö ¾Ê¾Æ¼ È®½ÇÇÏÁø ¾Ê´Ù´Â Á¡ À¯³äÇØÁֱ⠹ٶõ´Ù.
ÇÏÁö¸¸ °áÄÚ ÁÁÀº ¹æ¹ýÀº ¾Æ´Ï´Ù. °áÄÚ ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇÏÁö ¸»¾Æ¶ó!
|
Deprive a mirror of its silver and even the Czar won't see his face. |