Funktion umleiten per Shellcode
-
Hi,
ich versuche eine Funktion in einem Testprogramm durch Shellcode auf eine andere Funktion umzuleiten indem ich einen jump an die Einsprungsadresse der Funktion schreibe.Hier der Code:
pid_t pid = atoi(argv[1]); ptrace(PTRACE_ATTACH, pid, NULL, NULL); wait(NULL); struct link_map *lMap = (struct link_map *) malloc(sizeof(struct link_map)); get_link_map(pid, *lMap); Elf32_Addr origFuncAddr = get_symbol_addr(pid, lMap, "_ZN9TestClass5DoSthEv"); printf("Orig Address: %x\n", origFuncAddr); Elf32_Addr hookFunkAddr = get_symbol_addr(pid, lMap, "_ZN9TestClass11DoSomethingEv"); printf("Hook Address: %x\n", hookFunkAddr); char jmp[] = "\xff"; ptrace_write(pid, origFuncAddr, jmp, sizeof(jmp)); ptrace_write(pid, origFuncAddr+sizeof(jmp), &hookFunkAddr, sizeof(hookFunkAddr)); ptrace(PTRACE_CONT, pid, NULL, NULL); wait(NULL); ptrace(PTRACE_DETACH, pid, NULL, NULL);
Die beiden Testfunktionen sind folgendermaßen implementiert:
void TestClass::DoSth() { printf("Do Sth\n"); } void TestClass::DoSomething() { printf("Do Something\n"); }
Wenn die Funktion mit dem Symbol "_ZN9TestClass5DoSthEv" aufgerufen wird, gibt es sofort einen Segmentation fault (anstatt zuerst etwas auf der Konsole auszugeben).
Da ich nur Erfahrung mit Microcontroller-Assembler habe, bin ich mir nicht sicher, welchen opcode ich für den Jump-Befehl benutzen sollte (\xff, \xea, \xe9 schon versucht).
Wenn ich stattdessen einen Breakpoint setze ("\xCC") und die andere Funktion per ptrace in das Register eip schreibe funktioniert es, allerdings müsste ich das dann bei jedem Aufruf tun, daher würde ich lieber einen Sprungbefehl nehmen.
Viele Grüße
-
Okay, es klappt jetzt (dank meinem Debugger) indem ich die Addresse nach eax schreibe und das Register mit call aufrufe.
Problem gelöst.