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