2017-12-20 8 views
0

Ich bin neu in asm und ich versuche einen Systemaufruf an/bin/bash auszuführen. Ich bin jedoch zur Zeit der Begegnung folgendes Problem:Assembly execve/bin/bash (x64)

Mein Code für jeden execve Aufruf funktioniert erste Argument, dessen Länge weniger als 8 Bytes, also "/ bin/sh" oder "/ bin/ls":

.section .data 

    name: .string "/bin/sh" 

.section .text 

.globl _start 

_start: 
    #third argument of execve, set to NULL 
    xor %rdx, %rdx 

    #push nullbyte to the stack 
    pushq %rdx 

    #push /bin/sh to the stack 
    pushq name 

    #copy stack to rdi, 1st arg of execve 
    mov %rsp, %rdi 

    #copy 59 to rax, defining syscall number for execve 
    movq $59, %rax 

    #3rd arg of execve set to NULL 
    movq $0, %rsi 

    syscall 

Was mir ein Rätsel ist, dass ich es nicht mit

name: .string "/bin/bash" 

ich habe versucht, die Zeichenfolge in Teilen arbeiten kann, spalten pushq „/ bash“ und dann „/ ist“ auf den Stapel, scheint nichts zu mir erlaubt, damit es funktioniert und ich jedes Mal einen "Illegal instruction" -Fehler bekomme. Was mache ich falsch?

Nichtarbeitscode:

.section .data 

    name: .string "/bin/bash" 

.section .text 

.globl _start 

_start: 
    #third argument of execve, set to NULL 
    xor %rdx, %rdx 

    #push nullbyte to the stack 
    pushq %rdx 

    #push /bin/sh to the stack 
    pushq name 

    #copy stack to rdi, 1st arg of execve 
    mov %rsp, %rdi 

    #copy 59 to rax, defining syscall number for execve 
    movq $59, %rax 

    #3rd arg of execve set to NULL 
    movq $0, %rsi 

    syscall 

Andere nicht funktionierenden Code:

.section .data 

.section .text 

.globl _start 

_start: 
    #third argument of execve, set to NULL 
    xor %rdx, %rdx 

    #push nullbyte to the stack 
    pushq %rdx 

    #push /bin/bash to the stack 
    pushq $0x68 
    pushq $0x7361622f 
    pushq $0x6e69622f 

    #copy stack to rdi, 1st arg of execve 
    mov %rsp, %rdi 

    #copy 59 to rax, defining syscall number for execve 
    movq $59, %rax 

    #3rd arg of execve set to NULL 
    movq $0, %rsi 

    syscall 
+1

Sie haben vergessen, den ** nicht zu zeigen, -arbeitender ** Code. Außerdem haben Sie vergessen, einen Debugger zu verwenden. Sie haben vielleicht vergessen, dass der Stapel umgekehrt funktioniert. Und Sie haben wahrscheinlich vergessen, dass 'push' ** immer ** 8 Bytes schreibt. Daher sollten Sie Ihre Zeichenfolge in 8-Byte-Teile aufteilen, mit Ausnahme des letzten Teils (den Sie zuerst drücken). – Jester

+0

Offensichtlich, wenn Sie eine Zeichenkette in '.data' haben, brauchen Sie sie nicht auf den Stack zu kopieren. Sie können einfach seine Adresse direkt verwenden und damit fertig sein. – Jester

+0

Haben Sie sich die X86_64 ABI-Aufrufkonvention für Funktionen angesehen? Das könnte Ihnen helfen, herauszufinden, wo die Dinge falsch laufen. –

Antwort

4

Sie scheinen völlig verwirrt, zu viel zu sein, alle die Fehler aufzulisten. Dennoch, hier ist eine unvollständige Liste:

  1. Sie esi auf Null gesetzt, was bedeutet argv ist NULL
  2. push nullbyte to the stack ist eigentlich ein NULL Zeiger zum Beenden des argv Array (es ist ein kein Null-Byte eine Zeichenfolge beendet).
  3. Sie müssen die Adresse des Dateinamens als argv[0] setzen. Sie müssen die Zeichenfolge nicht in den Stapel kopieren. Hier

ist eine feste Version:

.section .data 

    name: .string "/bin/bash" 

.section .text 

.globl _start 

_start: 
    # third argument of execve is envp, set to NULL 
    xor %rdx, %rdx 

    # push NULL to the stack, argv terminator 
    pushq %rdx 

    # first argument to execve is the file name 
    leaq name, %rdi 

    # also argv[0] 
    push %rdi 

    # second argument to execve is argv 
    mov %rsp, %rsi 

    #copy 59 to rax, defining syscall number for execve 
    movq $59, %rax 
    syscall 

und eine Version, die die Zeichenfolge auf dem Stapel von Code erstellt, ohne Null-Bytes:

.section .text 

.globl _start 

_start: 
    # third argument of execve is envp, set to NULL 
    xor %rdx, %rdx 

    # zero terminator 
    push %rdx 

    # space for string 
    sub $16, %rsp 

    # end is aligned to the zero terminator 
    movb $0x2f, 7(%rsp)  #/
    movl $0x2f6e6962, 8(%rsp) # bin/ 
    movl $0x68736162, 12(%rsp) # bash 

    # first argument to execve is the file name 
    leaq 7(%rsp), %rdi 

    # push NULL to the stack, argv terminator 
    pushq %rdx 

    # also argv[0] 
    push %rdi 

    # second argument to execve is argv 
    mov %rsp, %rsi 

    # copy 59 to rax, defining syscall number for execve 
    # avoid zero byte 
    xor %eax, %eax 
    movb $59, %al 
    syscall 
+0

Sie haben Recht, ich bin verwirrt, wie in meiner Frage angegeben, ich bin völlig neu in ASM :). Trotzdem vielen Dank für deine Hilfe und die Korrektur meiner Fehler, es funktioniert jetzt. Noch eine Frage, wenn ich den .data Abschnitt vermeiden möchte, wie soll ich fortfahren? – Goujon

+0

@ Goujon: Sie müssen die Zeichenfolge auf den Stack –

+0

@ Jester schieben, da dies für Shell-Code bestimmt ist, würde ich gegen 'movq $ 59,% rax 'empfehlen, da es ein 0x00 Byte einführen wird. Vielleicht vorzuziehen ist 'xor% eax,% eax'' mov $ 59,% al'? –

Verwandte Themen