· 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¸¦ »ç¿ëÇÏ´Â ÄÚµå´Â ºüÁ®¾ß ÇÒ °Í °°´Ù. Å×½ºÆ®¸¦ Çغ¸Áö ¾Ê¾Æ¼­ È®½ÇÇÏÁø ¾Ê´Ù´Â Á¡ À¯³äÇØÁֱ⠹ٶõ´Ù.

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















ID
Password
Join
Do not clog intellect's sluices with bits of knowledge of questionable uses.


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.0020 sec