2016-08-08 16 views
-1

Ich benutze Recvfrom syscall mit einer Länge von 0x1000. Wenn ich einen Puffer von .bss verwende, gibt es kein Problem; recvfrom wartet auf Kundendaten.Recvfrom: mit Stack als Puffer (len: 4096)

buffer: resb 4096 

Aber wenn ich einen Zeiger auf den Stapel als Puffer verwenden, eine qword an der Adresse mov, sie paßt nicht das 4096 Bytes und Recvfrom wartet nicht!

Was ich verstehe, ist der Stapel nicht zu 0 für den 4096 Bytes initialisiert und übernimmt Daten in.

Außerdem Wenn ich meine Länge reduzieren 0x10 dh Recvfrom gesendet, da qword passen, Recvfrom wartet auf die Client-Eingabe.

Muss ich den Stack auf 0 für 4096 Bytes nach unten initialisieren?

Vielen Dank für Ihre Aufmerksamkeit.

Code:

mov rdi, [server_fd] 
xor rsi, rsi 
xor rdx, rdx 
mov rax, SYS_ACCEPT 
syscall 


mov [clients_fd], rax ;store the clients_fd 

mov rdi, rax ; mov client socket fd to rdi 
mov rsi, rsp ; use stack as buffer 
mov qword [rsi], 0 
mov rdx, BUFFER_SIZE; 0x1000 
xor rcx, rcx 
xor r10, r10 ; flags 
xor r9, r9 
xor r8, r8 
mov rax, SYS_RECVFROM 
syscall 

mov rdi, [clients_fd]; restore client_fd 
mov rsi, rsp; buffer address 
xor r10, r10 
call _strlen; returns str len in rax 
mov rdx, rax ; rax contains the string len 
mov rax, SYS_SENDTO 
syscall 

call sys_close 

xor rdi, rdi 
call sys_exit 
+1

Bitte die entsprechenden Codezeilen hinzufügen. – Michael

+2

Wohin weisen Sie Speicherplatz auf dem Stack zu? – Michael

+0

Der Aufruf von 'strlen' wird den Stack verwenden, was wahrscheinlich Ihre Daten stört. Jedes Interrupt, das während der Verarbeitung auftritt, wird auch etwas Stapelspeicherplatz verwenden. –

Antwort

2

Vielen Dank, es war so einfach wie @ Michael erwähnt, ist hier die Lösung:

I had to reserv 0x1000 bytes on the stack 

Code:

mov rdi, [server_fd] 
xor rsi, rsi 
xor rdx, rdx 
mov rax, SYS_ACCEPT 
syscall 


mov [clients_fd], rax ;store the clients_fd 

mov rdi, rax ; mov client socket fd to rdi 
sub rsp, BUFFER_SIZE 
mov rsi, rsp 
mov qword [rsi], 0 
mov rdx, BUFFER_SIZE; 0x1000 
xor rcx, rcx 
xor r10, r10 ; flags 
xor r9, r9 
xor r8, r8 
mov rax, SYS_RECVFROM 
syscall 

mov rdi, [clients_fd]; restore client_fd 
mov rsi, rsp; buffer address 
xor r10, r10 
call _strlen; returns str len in rax 
mov rdx, rax ; rax contains the string len 
mov rax, SYS_SENDTO 
syscall 

call sys_close 

xor rdi, rdi 
call sys_exit 

Gestern habe ich Fehler Fangen und Standard-Fehlernummernanzeige. Danke allen für die Hilfe!