Ich benutze die einfache sys_call_table umgeschrieben auf log alle Execve Anrufe in einem System.Ist die sys_call_table im Kernel 4.8 geschützt?
Beim Wechsel zu Ubuntu 16.10 mit einem 4.8 Kernel wurde dieser Mechanismus plötzlich nicht mehr funktionieren. In 16.04 mit ein 4.6-Kernel funktionierte es.
1: write_cr0 (read_cr0() & (~ 0x10000));
2: original_execve = (void *)syscall_table[__NR_execve];
3: syscall_table[__NR_execve] = (unsigned long)&new_execve;
4: write_cr0 (read_cr0() | 0x10000);
Der Seitenfehler geschieht bereits bei den alten Eintrag zu lesen, ist, dass Zeile 2. die sys_call_table Adresse retrive ich benutze:
sudo cat /boot/System.map-`uname -r` | grep -e '\ssys_call_table' | awk '{ print $1}')"
-Code ist aus: https://github.com/eiselekd/shinterposer/tree/master/mod
niemanden Wissen was passiert ist? Vielleicht wurde ein Schutzmechanismus eingeführt?
Bisher eine Lösung gefunden: Ich habe den 4.8-Kernel und das exportierte Symbol sys_call_table sowie neu kompiliert, da der const-Spezifizierer entfernt wurde. Auf diese Weise kann ich sys_call_table direkt vom Modul referenzieren. Immer noch nicht sicher, warum es mit der Version, die für 4.6 funktionierte, abgestürzt ist. Wird die Verknüpfung für schreibgeschützte Abschnitte geändert? –
Sie können eine gute Übersicht über alle Maßnahmen finden, die Linux in der [this] (https://outflux.net/slides/2016/lss/kspp.pdf) Präsentation implementiert hat (bis zu 4,2). –
Danke. Eine Frage: Gibt es eine Möglichkeit, die syscall-Tabellenadresse zurück zu bekommen, wenn kaslr vorhanden ist? Ich denke, das wäre ein Exploit, aber trotzdem ... –