Socket en Nasm sobre Winx64, no logro que "connect" funcione

Iniciado por otroWeyMas.nasm, 16 Noviembre 2021, 21:24 PM

0 Miembros y 1 Visitante están viendo este tema.

otroWeyMas.nasm

Hola

Tengo una duda sobre una conexión socket en Nasm usando Windows x64, durante estos días de no poder salir me puse a estudiar ensamblador y me gustó la idea de aprender a usar socket, lo hice inicialmente en el linux, y ahora en Windows, lo hice de esa manera por la razón de Nasm.

Bueno, encontré algunas diferencias, en linux se pueden usar los registros básicos, push y call en x86 pero en x64 debes usar RSI y  RDI para poder hace un socket, en windows pasa lo mismo, puedes usar registros, y PUSH y hacer CALL, pero al parecer en x64 no se puede, bueno... si se puede, pero no de la misma manera, y los registros que se utilizar para ejecución son RCX, RDX, R8, R9... etc....

Ya con eso hice el muy clásico PEB para encontrar la manera de llegar a la librería ws2_32.dll para después invocar WSAStartup, WSASocketA, etc...

Primero hice uno en x86 que funcionó, y luego quise pasarlo a x64, supuse era algo parecido, así que con un debugger fui comparando resultados, todo iba bien  hasta que llegué a necesitar AF_INET, como bien saben es lo básico, WSASocketA(2,1,6,0,0,0).

Me costó trabajo, pero cuando el debugger me dejó de mostrar error y logré avanzar, no me salió el mismo resultado comparandolo con el de x86, pero luego con el de x86 me di cuenta que no es un resultado constante, así que continué...

Obtuve la función connect y meto a la pila AF_INET, puerto e IP,  luego abro espacio de la estructura, meto lo guardado en la pila, coloco el descriptor socket y ejecuto connect.

Pero por lo que se imaginarán no funciona, obtengo del registro RAX=00000000FFFFFFFF, ya intente varias cosas, busque en google, traté de orientarme del único ejemplo que conseguí de exploit-db, pero no logro saber que hago mal... Les dejo el código completo, por si me pueden ayudar.

Aclaro, no soy profesional, ni llevo años en ASM, soyOtroWeyMas que intenta aprender de internet, si pudieran explicarme con palabras no tan de informáticos avanzados, sería genial y por favor.
Espero no les moleste.



xor rcx, rcx
mov rcx, 0x4174
push rcx
mov rcx, 0x656b636f53415357 ;WSASocketA
push rcx
mov rdx, rsp
mov rcx, r15

sub rsp, 0x30
call r14

add rsp, 0x40

xor rcx, rcx
mov [rsp+32], rcx
mov [rsp+40], rcx

push rcx
pop r9
mov r8b, 6
inc rcx
mov rdx, rcx
inc rcx

call rax

mov rdi, rax

xor rcx, rcx
mov rcx, 0x7463656e6e6f63
push rcx
mov rdx, rsp
mov rcx, r15

sub rsp, 0x28
call r14

add rsp, 0x30

xor r8, r8
xor rcx, rcx

push dword 0x0100007f
push word 0x5c11
mov cl, 2
push word cx

mov r8b, 16
mov rdx, rsp
mov rcx, rdi

call rax

Eternal Idol

Si rax es -1 quiere decir que fallo y entonces hay que llamar a GetLastError.

LastErrorValue: (WinSock) 0x273f (10047) - An address incompatible with the requested protocol was used.


ws2_32!connect:
mov     rax,rsp
mov     qword ptr [rax+8],rbx
mov     qword ptr [rax+10h],rbp
mov     qword ptr [rax+18h],rsi

Antes de poder usar la memoria del segundo parametro, RDX, esta ya fue modificada por el prologo de connect para preservar registros.

"In the Microsoft x64 calling convention, it is the caller's responsibility to allocate 32 bytes of "shadow space" on the stack right before calling the function (regardless of the actual number of parameters used), and to pop the stack after the call.

For example, a function taking 5 integer arguments will take the first to fourth in registers, and the fifth will be pushed on top of the shadow space. So when the called function is entered, the stack will be composed of (in ascending order) the return address, followed by the shadow space (32 bytes) followed by the fifth parameter."

https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention

En definitiva tu programa no cumple con la convencion de llamada, justo despues de la direccion de retorno esta ubicado el segundo parametro de connect.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

otroWeyMas.nasm

JAJAJAJAJA  :¬¬ :xD

Me siento muy torpe, después de dos días, lo único que me faltaba era el "shadow space", no sabia que se llamaba así, pero bueno, ya logré solucionarlo y de paso aprendí el termino de "Microsoft x64 calling convention". Batalle mucho para entender eso de reservar espacio para el CALL en Winx64 y fue lo primero que no hice.

Bueno, gracias Eternal, tema solucionado.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón