ϵͳµ÷ÓÃÊÇÓ¦ÓóÌÐòºÍ²Ù×÷ϵͳÄÚºËÖ®¼äµÄ¹¦Äܽӿڡ£ÆäÖ÷ҪĿµÄÊÇʹµÃÓû§
¿ÉÒÔʹÓòÙ×÷ϵͳÌṩµÄÓйØÉ豸¹ÜÀí¡¢ÊäÈë/ÊäÈëϵͳ¡¢ÎļþϵͳºÍ½ø³Ì¿ØÖÆ¡¢
ͨÐÅÒÔ¼°´æ´¢¹ÜÀíµÈ·½ÃæµÄ¹¦ÄÜ£¬¶ø²»±ØÁ˽âϵͳ³ÌÐòµÄÄÚ²¿½á¹¹ºÍÓйØÓ²¼þϸ
½Ú£¬´Ó¶øÆðµ½¼õÇáÓû§¸ºµ£ºÍ±£»¤ÏµÍ³ÒÔ¼°Ìá¸ß×ÊÔ´ÀûÓÃÂʵÄ×÷Óá£
¡¡¡¡Linux²Ù×÷ϵͳ×÷Ϊ×ÔÓÉÈí¼þµÄ´ú±í£¬ËüÓÅÁ¼µÄÐÔÄÜʹµÃËüµÄÓ¦ÓÃÈÕÒæ¹ã·º£¬
²»½öµÃµ½×¨ÒµÈËÊ¿µÄ¿Ï¶¨£¬¶øÇÒÉÌÒµ»¯µÄÓ¦ÓÃÒ²ÊÇÈç»ðÈçݱ¡£ÔÚLinuxÖУ¬´ó²¿·Ö
µÄϵͳµ÷Óðüº¬ÔÚLinuxµÄlibc¿âÖУ¬Í¨¹ý±ê×¼µÄCº¯Êýµ÷Ó÷½·¨¿ÉÒÔµ÷ÓÃÕâЩϵͳ
µ÷Óá£ÄÇô£¬¶ÔLinuxµÄ·¢ÉÕÓÑÀ´Ëµ£¬ÈçºÎÔÚLinuxÖÐÔö¼ÓеÄϵͳµ÷ÓÃÄØ£¿
1 Linuxϵͳµ÷ÓûúÖÆ
¡¡¡¡ÔÚLinuxϵͳÖУ¬ÏµÍ³µ÷ÓÃÊÇ×÷ΪһÖÖÒì³£ÀàÐÍʵÏֵġ£Ëü½«Ö´ÐÐÏàÓ¦µÄ»úÆ÷
´úÂëÖ¸ÁîÀ´²úÉúÒì³£Ðźš£²úÉúÖжϻòÒì³£µÄÖØÒªÐ§¹ûÊÇϵͳ×Ô¶¯½«Óû§Ì¬Çл»Îª
ºËÐÄ̬À´¶ÔËü½øÐд¦Àí¡£Õâ¾ÍÊÇ˵£¬Ö´ÐÐϵͳµ÷ÓÃÒì³£Ö¸Áîʱ£¬×Ô¶¯µØ½«ÏµÍ³Çл»
ΪºËÐÄ̬£¬²¢°²ÅÅÒì³£´¦Àí³ÌÐòµÄÖ´ÐС£
¡¡¡¡LinuxÓÃÀ´ÊµÏÖϵͳµ÷ÓÃÒì³£µÄʵ¼ÊÖ¸ÁîÊÇ£º
¡¡¡¡Int $0x80
¡¡¡¡ÕâÒ»Ö¸ÁîʹÓÃÖжÏ/Òì³£ÏòÁ¿ºÅ128£¨¼´16½øÖƵÄ80£©½«¿ØÖÆÈ¨×ªÒƸøÄںˡ£Îª
´ïµ½ÔÚʹÓÃϵͳµ÷ÓÃʱ²»±ØÓûúÆ÷Ö¸Áî±à³Ì£¬ÔÚ±ê×¼µÄCÓïÑÔ¿âÖÐΪÿһϵͳµ÷ÓÃ
ÌṩÁËÒ»¶Î¶ÌµÄ×Ó³ÌÐò£¬Íê³É»úÆ÷´úÂëµÄ±à³Ì¹¤×÷¡£ÊÂʵÉÏ£¬»úÆ÷´úÂë¶Î·Ç³£¼ò
¶Ì¡£ËüËùÒª×öµÄ¹¤×÷Ö»Êǽ«Ë͸øÏµÍ³µ÷ÓõIJÎÊý¼ÓÔØµ½CPU¼Ä´æÆ÷ÖУ¬½Ó×ÅÖ´ÐÐ
int $0x80Ö¸ÁȻºóÔËÐÐϵͳµ÷Óã¬ÏµÍ³µ÷Óõķµ»ØÖµ½«ËÍÈëCPUµÄÒ»¸ö¼Ä´æÆ÷
ÖУ¬±ê×¼µÄ¿â×Ó³ÌÐòÈ¡µÃÕâÒ»·µ»ØÖµ£¬²¢½«ËüËÍ»ØÓû§³ÌÐò¡£
¡¡¡¡ÎªÊ¹ÏµÍ³µ÷ÓõÄÖ´ÐгÉΪһÏî¼òµ¥µÄÈÎÎñ£¬LinuxÌṩÁËÒ»×éÔ¤´¦ÀíºêÖ¸Áî¡£
ËüÃÇ¿ÉÒÔÓÃÔÚ³ÌÐòÖС£ÕâЩºêÖ¸Áîȡһ¶¨µÄ²ÎÊý£¬È»ºóÀ©Õ¹Îªµ÷ÓÃÖ¸¶¨µÄϵͳµ÷ÓÃ
µÄº¯Êý¡£
¡¡¡¡ÕâЩºêÖ¸Áî¾ßÓÐÀàËÆÏÂÃæµÄÃû³Æ¸ñʽ£º
¡¡¡¡_syscallN£¨parameters£©
¡¡¡¡ÆäÖÐNÊÇϵͳµ÷ÓÃËùÐèµÄ²ÎÊýÊýÄ¿£¬¶øparametersÔòÓÃÒ»×é²ÎÊý´úÌæ¡£ÕâЩ²Î
ÊýʹºêÖ¸ÁîÍê³ÉÊʺÏÓÚÌØ¶¨µÄϵͳµ÷ÓõÄÀ©Õ¹¡£ÀýÈ磬ΪÁ˽¨Á¢µ÷ÓÃsetuid£¨£©Ïµ
ͳµ÷Óõĺ¯Êý£¬Ó¦¸ÃʹÓãº
¡¡¡¡_syscall1£¨ int£¬ setuid£¬ uid_t£¬ uid £©
¡¡¡¡syscallN£¨ £©ºêÖ¸ÁîµÄµÚ1¸ö²ÎÊýint˵Ã÷²úÉúµÄº¯ÊýµÄ·µ»ØÖµµÄÀàÐÍÊÇÕû
ÐÍ£¬µÚ2¸ö²ÎÊýsetuid˵Ã÷²úÉúµÄº¯ÊýµÄÃû³Æ¡£ºóÃæÊÇϵͳµ÷ÓÃËùÐèÒªµÄÿ¸ö²Î
Êý¡£ÕâÒ»ºêÖ¸ÁîºóÃæ»¹ÓÐÁ½¸ö²ÎÊýuid_tºÍuid·Ö±ðÓÃÀ´Ö¸¶¨²ÎÊýµÄÀàÐͺÍÃû³Æ¡£
¡¡¡¡ÁíÍ⣬ÓÃ×÷ϵͳµ÷ÓõIJÎÊýµÄÊý¾ÝÀàÐÍÓÐÒ»¸öÏÞÖÆ£¬ËüÃǵÄÈÝÁ¿²»Äܳ¬¹ýËĸö
×Ö½Ú¡£ÕâÊÇÒòΪִÐÐint $0x80Ö¸Áî½øÐÐϵͳµ÷ÓÃʱ£¬ËùÓеIJÎÊýÖµ¶¼´æÔÚ32λµÄ
CPU¼Ä´æÆ÷ÖС£Ê¹ÓÃCPU¼Ä´æÆ÷´«µÝ²ÎÊý´øÀ´µÄÁíÒ»¸öÏÞÖÆÊÇ¿ÉÒÔ´«Ë͸øÏµÍ³µ÷ÓõÄ
²ÎÊýµÄÊýÄ¿¡£Õâ¸öÏÞÖÆÊÇ×î¶à¿ÉÒÔ´«µÝ5¸ö²ÎÊý¡£ËùÒÔLinuxÒ»¹²¶¨ÒåÁË6¸ö²»Í¬µÄ
_syscallN£¨£©ºêÖ¸Á´Ó_syscall0£¨£©¡¢_syscall1£¨£©Ö±µ½_syscall5£¨£©¡£
¡¡¡¡Ò»µ©_syscallN£¨£©ºêÖ¸ÁîÓÃÌØ¶¨ÏµÍ³µ÷ÓõÄÏàÓ¦²ÎÊý½øÐÐÁËÀ©Õ¹£¬µÃµ½µÄ½á
¹ûÊÇÒ»¸öÓëϵͳµ÷ÓÃͬÃûµÄº¯Êý£¬Ëü¿ÉÒÔÔÚÓû§³ÌÐòÖÐÖ´ÐÐÕâһϵͳµ÷Óá£
¡¡
2 Ìí¼ÓеÄϵͳµ÷ÓÃ
¡¡¡¡Èç¹ûÓû§ÔÚLinuxÖÐÌí¼ÓеÄϵͳµ÷Óã¬Ó¦¸Ã×ñѼ¸¸ö²½Öè²ÅÄÜÌí¼Ó³É¹¦£¬ÏÂ
Ãæ¼¸¸ö²½ÖèÏêϸ˵Ã÷ÁËÌí¼Óϵͳµ÷ÓõÄÏà¹ØÄÚÈÝ¡£
£¨1£© Ìí¼ÓÔ´´úÂë
¡¡¡¡µÚÒ»¸öÈÎÎñÊDZàд¼Óµ½ÄÚºËÖеÄÔ´³ÌÐò£¬¼´½«Òª¼Óµ½Ò»¸öÄÚºËÎļþÖÐÈ¥µÄÒ»¸ö
º¯Êý£¬¸Ãº¯ÊýµÄÃû³ÆÓ¦¸ÃÊÇеÄϵͳµ÷ÓÃÃû³ÆÇ°Ãæ¼ÓÉÏsys_±êÖ¾¡£¼ÙÉèмӵÄϵͳ
µ÷ÓÃΪmycall(int number)£¬ÔÚ/usr/src/linux/kernel/sys.cÎļþÖÐÌí¼ÓÔ´´ú
Â룬ÈçÏÂËùʾ£º
¡¡¡¡asmlinkage int sys_mycall(int number)
¡¡¡¡{
¡¡¡¡return number;
¡¡¡¡}
¡¡¡¡×÷Ϊһ¸ö×î¼òµ¥µÄÀý×Ó£¬ÎÒÃÇмӵÄϵͳµ÷Óýö½ö·µ»ØÒ»¸öÕûÐÍÖµ¡£
£¨2£© Á¬½ÓеÄϵͳµ÷ÓÃ
¡¡¡¡Ìí¼ÓеÄϵͳµ÷Óúó£¬ÏÂÒ»¸öÈÎÎñÊÇʹLinuxÄÚºËµÄÆäÓಿ·ÖÖªµÀ¸Ã³ÌÐòµÄ´æ
ÔÚ¡£ÎªÁË´ÓÒÑÓеÄÄں˳ÌÐòÖÐÔö¼Óµ½Ðµĺ¯ÊýµÄÁ¬½Ó£¬ÐèÒª±à¼Á½¸öÎļþ¡£
¡¡¡¡ÔÚÎÒÃÇËùÓõÄLinuxÄں˰汾£¨RedHat 6.0£¬ÄÚºËΪ2.2.5-15£©ÖУ¬µÚÒ»¸öÒª
Ð޸ĵÄÎļþÊÇ£º
¡¡¡¡/usr/src/linux/include/asm-i386/unistd.h
¡¡¡¡¸ÃÎļþÖаüº¬ÁËϵͳµ÷ÓÃÇåµ¥£¬ÓÃÀ´¸øÃ¿¸öϵͳµ÷Ó÷ÖÅäÒ»¸öΨһµÄºÅÂë¡£ÎÄ
¼þÖÐÿһÐеĸñʽÈçÏ£º
¡¡¡¡#define __NR_name NNN
¡¡¡¡ÆäÖУ¬nameÓÃϵͳµ÷ÓÃÃû³Æ´úÌæ£¬¶øNNNÔòÊǸÃϵͳµ÷ÓöÔÓ¦µÄºÅÂë¡£Ó¦¸Ã½«
еÄϵͳµ÷ÓÃÃû³Æ¼Óµ½Çåµ¥µÄ×îºó£¬²¢¸øËü·ÖÅäºÅÂëÐòÁÐÖÐÏÂÒ»¸ö¿ÉÓõÄϵͳµ÷ÓÃ
ºÅ¡£ÎÒÃǵÄϵͳµ÷ÓÃÈçÏ£º
¡¡¡¡#define __NR_mycall 191
¡¡¡¡ÏµÍ³µ÷ÓúÅΪ191£¬Ö®ËùÒÔϵͳµ÷ÓúÅÊÇ191£¬ÊÇÒòΪLinux-2.2ÄÚºË×ÔÉíµÄϵ
ͳµ÷ÓúÅÂëÒѾÓõ½190¡£
¡¡¡¡µÚ¶þ¸öÒªÐ޸ĵÄÎļþÊÇ£º
¡¡¡¡/usr/src/linux/arch/i386/kernel/entry.S
¡¡¡¡¸ÃÎļþÖÐÓÐÀàËÆÈçϵÄÇåµ¥£º
¡¡¡¡.long SYMBOL_NAME£¨£©
¡¡¡¡¸ÃÇåµ¥ÓÃÀ´¶Ôsys_call_table[]Êý×é½øÐгõʼ»¯¡£¸ÃÊý×é°üº¬Ö¸ÏòÄÚºËÖÐÿ¸ö
ϵͳµ÷ÓõÄÖ¸Õë¡£ÕâÑù¾ÍÔÚÊý×éÖÐÔö¼ÓÁËеÄÄں˺¯ÊýµÄÖ¸Õë¡£ÎÒÃÇÔÚÇåµ¥×îºóÌí
¼ÓÒ»ÐУº
¡¡¡¡.long SYMBOL_NAME(sys_mycall)
¡¡¡¡¡¡¡¡
£¨3£© ÖØ½¨ÐµÄLinuxÄÚºË
¡¡¡¡ÎªÊ¹ÐµÄϵͳµ÷ÓÃÉúЧ£¬ÐèÒªÖØ½¨LinuxµÄÄںˡ£ÕâÐèÒªÒÔ³¬¼¶Óû§Éí·ÝµÇ
¼¡£
¡¡¡¡#pwd
¡¡¡¡/usr/src/linux
¡¡¡¡#
¡¡¡¡³¬¼¶Óû§ÔÚµ±Ç°¹¤×÷Ŀ¼£¨/usr/src/linux£©Ï£¬²Å¿ÉÒÔÖØ½¨Äںˡ£
¡¡¡¡#make config
¡¡¡¡#make dep
¡¡¡¡#make clearn
¡¡¡¡#make bzImage
¡¡¡¡±àÒëÍê±Ïºó£¬ÏµÍ³Éú³ÉÒ»¿ÉÓÃÓÚ°²×°µÄ¡¢Ñ¹ËõµÄÄÚºËÓ³ÏóÎļþ£º
¡¡¡¡/usr/src/linux/arch/i386/boot/bzImage¡¡
£¨4£© ÓÃеÄÄÚºËÆô¶¯ÏµÍ³
¡¡¡¡ÒªÊ¹ÓÃеÄϵͳµ÷Óã¬ÐèÒªÓÃÖØ½¨µÄÐÂÄÚºËÖØÐÂÒýµ¼ÏµÍ³¡£Îª´Ë£¬ÐèÒªÐÞ
¸Ä/etc/lilo.confÎļþ£¬ÔÚÎÒÃǵÄϵͳÖУ¬¸ÃÎļþÄÚÈÝÈçÏ£º
¡¡¡¡boot=/dev/hda
¡¡¡¡map=/boot/map
¡¡¡¡install=/boot/boot.b
¡¡¡¡prompt
¡¡¡¡timeout=50
¡¡¡¡image=/boot/vmlinuz-2.2.5-15
¡¡¡¡label=linux
¡¡¡¡root=/dev/hdb1
¡¡read-only
¡¡¡¡other=/dev/hda1
¡¡¡¡label=dos
¡¡¡¡table=/dev/had
¡¡¡¡Ê×Ïȱ༸ÃÎļþ£¬Ìí¼ÓеÄÒýµ¼Äںˣº
¡¡¡¡image=/boot/bzImage-new
¡¡¡¡label=linux-new
¡¡¡¡root=/dev/hdb1
¡¡¡¡read-only
¡¡¡¡Ìí¼ÓÍê±Ï£¬¸ÃÎļþÄÚÈÝÈçÏÂËùʾ£º
¡¡¡¡boot=/dev/hda
¡¡¡¡map=/boot/map
¡¡¡¡install=/boot/boot.b
¡¡¡¡prompt
¡¡¡¡timeout=50
¡¡¡¡image=/boot/bzImage-new
¡¡¡¡label=linux-new
¡¡¡¡root=/dev/hdb1
¡¡¡¡read-only
¡¡¡¡image=/boot/vmlinuz-2.2.5-15
¡¡¡¡label=linux
¡¡¡¡root=/dev/hdb1
¡¡¡¡read-only
¡¡¡¡other=/dev/hda1
¡¡¡¡label=dos
¡¡¡¡table=/dev/hda
¡¡¡¡ÕâÑù£¬ÐµÄÄÚºËÓ³ÏóbzImage-new³ÉΪȱʡµÄÒýµ¼Äںˡ£
¡¡¡¡ÎªÁËʹÓÃеÄlilo.confÅäÖÃÎļþ£¬»¹Ó¦Ö´ÐÐÏÂÃæµÄÃüÁ
¡¡¡¡#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new
¡¡¡¡Æä´ÎÅäÖÃlilo:
¡¡¡¡# /sbin/lilo
¡¡¡¡ÏÖÔÚ£¬µ±ÖØÐÂÒýµ¼ÏµÍ³Ê±£¬ÔÚboot:Ìáʾ·ûºóÃæÓÐÈýÖÖÑ¡Ôñ£ºlinux-new ¡¢
linux¡¢dos£¬ÐÂÄں˳ÉΪȱʡµÄÒýµ¼Äںˡ£
¡¡¡¡ÖÁ´Ë£¬ÐµÄLinuxÄÚºËÒѾ½¨Á¢£¬ÐÂÌí¼ÓµÄϵͳµ÷ÓÃÒѳÉΪ²Ù×÷ϵͳµÄÒ»²¿
·Ö£¬ÖØÐÂÆô¶¯Linux£¬Óû§¾Í¿ÉÒÔÔÚÓ¦ÓóÌÐòÖÐʹÓøÃϵͳµ÷ÓÃÁË¡£
£¨5£©Ê¹ÓÃеÄϵͳµ÷ÓÃ
¡¡¡¡ÔÚÓ¦ÓóÌÐòÖÐʹÓÃÐÂÌí¼ÓµÄϵͳµ÷ÓÃmycall¡£Í¬ÑùΪʵÑéÄ¿µÄ£¬ÎÒÃÇдÁËÒ»¸ö
¼òµ¥µÄÀý×Óxtdy.c¡£
¡¡¡¡/* xtdy.c */
¡¡¡¡#include
¡¡¡¡_syscall1(int,mycall,int,ret)
¡¡¡¡main()
¡¡¡¡{
¡¡¡¡printf("%d n",mycall(100));
¡¡¡¡}
¡¡¡¡±àÒë¸Ã³ÌÐò£º
¡¡¡¡# cc -o xtdy xtdy.c
¡¡¡¡Ö´ÐУº
¡¡¡¡# xtdy
¡¡¡¡½á¹û£º
¡¡¡¡# 100
¡¡¡¡×¢Ò⣬ÓÉÓÚʹÓÃÁËϵͳµ÷Ó㬱àÒëºÍÖ´ÐгÌÐòʱ£¬Óû§¶¼Ó¦¸ÃÊdz¬¼¶Óû§Éí
·Ý¡£
Ô×÷Õߣº²»Ïê
À´Ô´£ºµçÄÔ±¨