2016-05-06 14 views
0

Ich versuche, Security Tubes execve Tutorial (http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html) in 64bit Asm nachzuahmen. Ich bin mir nicht sicher, woher der Busfehler kommt. Ich bin in der GDB durch die App gegangen, aber der Fehler trat erst auf, nachdem ich den Frame verlassen hatte. Wenn jemand weiß, was passiert, würde ich gerne von dir hören.Bus Fehler in OS X x86_64 in Execve Anruf

.section __DATA,__data 
.section __TEXT,__text 
.globl _start 
_start: 
    xor %rax, %rax 
    push %rax 
    movabsq $0x68732f6e69622f2f, %rdi 
    push %rax 
    mov %rsp, %rsi 
    push %rdi 
    mov %rsp, %rdx 
    mov $0x2000059, %rax 
    syscall 
+0

Für eine Sache, 'push' ist 64 Bit in 64-Bit-Modus, mit einem 32-Bit-Zeichen sofort verlängert . Sie landen also tatsächlich mit 2f 2f 62 69 00 00 00 00 6e 2f 73 68 00 00 00 00 auf dem Stapel. Stattdessen könnten Sie 'movabsq $ 0x68732f6e69622f2f,% rax; push% rax' – Jester

+0

Danke @Jester. Immer noch den Busfehler bekommen. Aktualisiert meinen Code, um Ihre Anweisungen zu reflektieren. – JLegendre

+1

Sie haben 'rdi' geladen, aber 'rax' gedrückt? – Jester

Antwort

2

Folgendes sollte besser funktionieren, aber ich osx Test nicht haben:

.globl _start 
_start: 
    xor %edx, %edx     ; NULL for env 
    movabsq $0x0068732f6e69622f, %rax ; /bin/sh<0> 
    push %rax 
    mov %rsp, %rdi     ; filename 
    push %rdx       ; NULL for argv terminator 
    push %rdi       ; argv[0] = filename 
    mov %rsp, %rsi     ; argv 
    mov $0x200003b, %eax    ; I think 59 is decimal 
    syscall 
+0

Das hat funktioniert! Vielen Dank! – JLegendre

+0

Ich spielte mit dem Code herum, um die Stücke einzugrenzen, die ich falsch machte. Ich habe bemerkt, dass du% rdx drückst (Zeile 7). Was ist der Zweck dieses Push? Ich habe bemerkt, dass der Busfehler zurückkommt, wenn ich das ausmache. – JLegendre

+3

@JLegendre: da 'sys_execve' argv [] und/oder envp [] benötigt, um null-terminierte Arrays von Zeichenzeigern zu sein. Ohne die Beendigung des NULL-Zeigers weiß der Kernel nicht, wo sich das Ende des Arrays befindet. Die Länge der Arrays wird nicht als Parameter übergeben, daher ist der NuLL-Terminator eine Möglichkeit, das Ende des Arrays während der Verarbeitung zu identifizieren. Es ist ähnlich in der Natur, warum ein Array von Zeichen mit einem NUL (0) -Zeichen beendet wird - damit das Ende des Strings ohne vorherige Angabe der tatsächlichen Länge gefunden werden kann. –