Kernel Module Tutorials?
-
Lies dir das hier mal durch: http://www.dtors.org/papers/malicious-code-injection-via-dev-mem.pdf
Ist zwar nicht genau was du willst, aber dort wird beschrieben wie man die sys_call_table vom Userspace aus findet. Ich denke dein Code-Snippet macht im Grunde das gleiche.
Übrigens es hat sicher einen Grund, dass du nicht so einfach in die sys_call_table schreiben kannst (der Compilerfehler). Aber schau doch mal ein wenig im Kernel nach .?sys_call_table[.?]\w=\w**, also nach diesem regulären Ausdruck, dann solltest du einige Beispiele finden.
-
Danke
Aber ich wollte eigentlich eher ein Modul für den Kernel schreiben und nicht die /dev/mem bzw. /dev/kmem methode anwenden.
Beim obigen Code von mir scheint aber was nicht zu stimmen. Als sys adresse bekomme ich eine 12 stellige zahl?
-
supertux schrieb:
dann könnten Cracker-Newbies das benutzen, um später Böses zu tun.
und deswegen schützen wir uns alle und zensieren das Zeug
-
kann mir noch wer weiterhelfen?
-
Die wenigstens haben halt Lust ihre Zeit zu investieren, wenn das Vorhaben für sie sinnlos ist und du hast halt einfach jetzt den Skriptkiddie-Touch bzw. ein entsprechendes Thema.
Hättest du dagegen gefragt wie man die syscall-Tabelle beschreibt, da du ein Modul programmieren möchtest das Aufruf-Statistiken der Syscalls erstellt, dann hätten sich sicher Leute gefunden die dir geholfen hätten. Musst halt wissen wie man fragt
-
Die Syscall table und den Interrupt Handler und dessen Zusammenhänge verstehe ich ja. Ich habe einen Code gefunden, welcher eigentlich die oben beschriebene /dev/mem Methode, ausnutzen sollte:
#include <stdio.h> #include <fcntl.h> #include <linux/sched.h> #include <linux/types.h> #include <linux/param.h> #include <linux/kernel.h> #include <linux/version.h> #include <linux/unistd.h> #include <linux/string.h> #include <asm/errno.h> #include <linux/errno.h> #include <linux/stat.h> /* #define KERN_START 0xC0000000 int iskernaddr ( unsigned long addr ) { if (addr < KERN_START) return -1; return 0; } int readvirt (unsigned long addr, void* buf, unsigned int len) { if (iskernaddr (addr) < 0) return -1; addr = addr - KERN_START; lseek (mem_fd, addr, SEEK_SET); return read(mem_fd, buf, len); } struct idtentry { uint16_t lo ; uint16_t css ; uint16_t flags ; uint16_t hi ; } attribute ( ( packed ) ) ; int read_mem_linux() { int mem_fd; int ret = 1; char var_char[4]; char *charp; int count = 0; if((mem_fd = open("/dev/mem",O_RDONLY)) < 0) { printf("\n\nProblem in opening /dev/mem: are you root, lamorz?\n\n"); return -1; } charp = (char *)malloc(sizeof(char) * 1024 * 1024); while(ret != 0 && ret != -1) { ret = read(mem_fd, charp,sizeof(char) * 1024 *1024); printf("\nret:%d",ret); if (ret > 0) count++; } printf("\nMemory Read:%d MB",count); } int main (int argc, char* argv[]) { read_mem_linux(); }*/ #include <stdio.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> int kfd; struct { unsigned short limit; unsigned int base; } __attribute__ ((packed)) idtr; struct { unsigned short off1; unsigned short sel; unsigned char none, flags; unsigned short off2; } __attribute__ ((packed)) idt; int readkmem (unsigned char *mem, unsigned off, int bytes) { if (lseek64 (kfd, (unsigned long long) off, SEEK_SET) != off) { return -1; } if (read (kfd, mem, bytes) != bytes) { return -1; } } int main (void) { unsigned long sct_off; unsigned long sct; unsigned char *p, code[255]; int i; /* request IDT and fill struct */ asm ("sidt %0":"=m" (idtr)); if ((kfd = open ("/dev/kmem", O_RDONLY)) == -1) { perror("open"); exit(-1); } if (readkmem ((unsigned char *)&idt, idtr.base + 8 * 0x80, sizeof (idt)) == -1) { printf("Failed to read from /dev/kmem\n"); exit(-1); } sct_off = (idt.off2 << 16) | idt.off1; if (readkmem (code, sct_off, 0x100) == -1) { printf("Failed to read from /dev/kmem\n"); exit(-1); } /* find the code sequence that calls SCT */ sct = 0; for (i = 0; i < 255; i++) { if (code[i] == 0xff && code[i+1] == 0x14 && code[i+2] == 0x85) sct = code[i+3] + (code[i+4] << 8) + (code[i+5] << 16) + (code[i+6] << 24); } if (sct) printf ("sys_call_table: 0x%x\n", sct); close (kfd); }
Wobei ich das als root ausführe und die Meldung bekomme:
open: No such device or address
Auch das bringt mir folgendes Ergebnis:
sudo cat /dev/kmem
cat: /dev/kmem: No such device or addressDiese Möglichkeit nicht mehr aktuell?
Oder sonstige Denkfehler?Vielen Dank schonmals für Anregungen
-
Versuchs mal bei Gulli...
-
@Mod: kann man das hier bitte dicht machen?
-
___mario schrieb:
Versuchs mal bei Gulli...
ja natürlich, bei gulli...
ansammlung von script kiddies und kindern?@Mod: kann man das hier bitte dicht machen?
Nur weil es deiner Meinung nach nicht legal ist?
Natürlich, wir tun alles was der große tux will!
-
kernelp schrieb:
Nur weil es deiner Meinung nach nicht legal ist?
es ist nicht meine Meinung sondern mittlerweile ein Gesetzt.