Problema con un socket en ASM en x64

Iniciado por proxy_lainux, Enero 23, 2021, 11:51:04 PM

Tema anterior - Siguiente tema

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


Hola, tengo una pregunta para programadores de nasm

Estoy tratando de pasarme de x32 a x64 en ASM, así que se me ocurrio hacer un socket, mediante PE... en 32bits me costo trabajo, pero después de googlear y buscar lo logré, pero ahora me esta costando trabajo ya que en 64bits hay diferencias que se me complican.

Les explico el problema y coloco el código.

Después de nuevamente googlear, y meterme un poco más en esto, logre un avance, con PE obtengo GetProcAddress, después busco Loadlibrary, ws2_32, donde obtengo WSAStartup, como podrán ver voy guardando todo en registros r13 y r14 para después usarlos.

El problema viene cuando intento ejecutar WSAStartup, eso lo podrán encontrar al final del código, uso un espacio de 0x0190, eso en 32bits, me funciona perfecto, pero en 64bits, parece que "sirve", pero en realidad no, ya que lo debuggeo, y RAX me aparece '0', y segun la documentación de Micro$oft, si el return de WSAStartup es 'zero', entonces esta bien, pero en el debuguer, RCX me aparece como un overflow RCX: 00FFFFFFFFFFFFFF

Al principio no sabía que pasaba porque RAX era zero y avanzaba hacia socket, (2,1,6), pero ahí crasheaba... eso significa que no estoy haciendo bien WSAStartup, busque en otras páginas, pero no logré, por eso acudo a ustedes, espero me puedan dar una ayuda sobre que estoy haciendo mal o talvez no lo alineo bien.

Código: asm

section .text

global _start:

_start:

sub rsp, 0x28
and rsp, 0FFFFFFFFFFFFFFF0h

xor rcx, rcx
mov rax, [gs:rcx+0x60]
mov rax, [rax+0x18]
mov rsi, [rax+0x20]

lodsq

xchg rsi, rax

lodsq

mov rbx, [rax+0x20]; MZ

xor r8, r8
mov r8d, [rbx+0x3c]
mov rdx, r8
add rdx, rbx; PE

xor rsi, rsi

mov r8d, [rdx+0x88]; offset
add r8, rbx; export

xor rsi, rsi
mov esi, [r8+0x20];offset
add rsi, rbx;table

xor rcx, rcx
inc rcx
mov r9, 0x41636f7250746547

Gta_p:
inc rcx
xor rax, rax
mov eax, [rsi + rcx * 4]
add rax, rbx
cmp QWORD[rax], r9
jnz Gta_p

xor rsi, rsi

mov esi, [r8+0x24];offset
add rsi, rbx;ordinal

mov cx, [rsi+rcx*2]
xor rsi, rsi
mov esi, [r8+0x1C];offset;
add rsi, rbx; address

xor rdx, rdx

mov edx, [rsi+rcx*4] ;offset
add rdx, rbx;getproc
mov rdi, rdx

mov rcx, 0x41797261
push rcx
mov rcx, 0x7262694c64616f4c
push rcx
mov rdx, rsp
mov rcx, rbx
sub rsp, 0x30
call rdi

add rsp, 0x30
add rsp, 0x10

mov rsi, rax

xor rcx, rcx
push rcx
mov rcx, 0x32335f327377
push rcx
mov rcx, rsp
sub rsp, 0x30
call rsi

add rsp, 0x30
add rsp, 0x10

mov r15, rax

xor rcx, rcx
mov rcx, 0x7075
push rcx
mov rcx, 0x7472617453415357
push rcx
mov rdx, rsp
mov rcx, r15
sub rsp, 0x30
call rdi

add rsp, 0x30
add rsp, 0x10

mov r13, rax;WSAStarup

xor rcx, rcx
mov rcx, 0x4174
push rcx
mov rcx, 0x656b636f53415357
push rcx
mov rdx, rsp
mov rcx, r15
sub rsp, 0x30
call rdi

add rsp, 0x30
add rsp, 0x10

mov r14, rax ;WSASocket

xor rcx, rcx
mov cx, 0x0190
sub rsp, rcx
push rsp
push rcx

call r13


Espero me puedan ayudar.

Saludos.