· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Ä¿³Î³»¿¡¼­Read Write»ç¿ëÇϱâ

Ä¿³Î ¸ðµâ°ú °°Àº Ä¿³Î ¿µ¿ª¿¡¼­ µ¿ÀÛÇÏ´Â ÄÚµåµéÀÌ À¯Àú¿µ¿ªÀÇ Æ¯Á¤ÆÄÀÏÀ» ÀÐ°í ¾²´Â °ÍÀº °áÄÚ ÁÁÀº ¹æ¹ýÀÌ ¾Æ´Ï´Ù.

¸¹Àº Ä¿³Î ´ººñµéÀÌ ÀÌ·¯ÇÑ ¹æ¹ýÀ» Áú¹®ÇÏ¸é ´ëºÎºÐÀÇ ´ë´äÀº "±×·¯ÇÑ ÁþÀº ÇÏÁö¸»¶ó"ÀÌ´Ù. ´ë½Å¿¡ ´Ù¸¥ ¹æ¹ýµéÀ» ÃßõÇÏ°ï ÇÑ´Ù. 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 <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¸¦ »ç¿ëÇÏ´Â ÄÚµå´Â ºüÁ®¾ß ÇÒ °Í °°´Ù. Å×½ºÆ®¸¦ Çغ¸Áö ¾Ê¾Æ¼­ È®½ÇÇÏÁø ¾Ê´Ù´Â Á¡ À¯³äÇØÁֱ⠹ٶõ´Ù.

ÇÏÁö¸¸ °áÄÚ ÁÁÀº ¹æ¹ýÀº ¾Æ´Ï´Ù. °áÄÚ ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇÏÁö ¸»¾Æ¶ó!

















sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-06-11 12:58:34
Processing time 0.0045 sec