Ä¿³Î³»¿¡¼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¸¦ »ç¿ëÇÏ´Â ÄÚµå´Â ºüÁ®¾ß ÇÒ °Í °°´Ù. Å×½ºÆ®¸¦ ÇØº¸Áö ¾Ê¾Æ¼ È®½ÇÇÏÁø ¾Ê´Ù´Â Á¡ À¯³äÇØÁֱ⠹ٶõ´Ù.
ÇÏÁö¸¸ °áÄÚ ÁÁÀº ¹æ¹ýÀº ¾Æ´Ï´Ù. °áÄÚ ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇÏÁö ¸»¾Æ¶ó!
|
Do not clog intellect's sluices with bits of knowledge of questionable uses. |











![[http]](/imgs/http.png)