Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - black_flowers

#21
estoy que no doy una, he probado todas las combinaciones pero no consigo ejecutar un maldito programa con shellexecute. Lo quetengo es un programa en c++ que utiliza esta instrucción para ejecutar otro programa:
Código (cpp) [Seleccionar]
ShellExecute(NULL,"open", "miPrograma.exe",NULL,NULL, SW_SHOW);
pero compila, pasa de largo y no hace nada.
la aplicación miPrograma.exe se encuentra en la misma carpeta que el que estoy ejecutando.
he probado tambien así:
miPrograma.exe
así: (poniendo miPrograma.exe en C:\)
Código (cpp) [Seleccionar]
ShellExecute(NULL,"open", "miPrograma.exe",NULL,"C:\", SW_SHOW);


pero nada, ninguna funciona.
Sólo me ha funcionado esto:
Código (cpp) [Seleccionar]
ShellExecute(NULL,"open", "calc.exe",NULL,NULL, SW_SHOW);
ya que la calculadora es accesible desde cualquier punto.
no obstante si coloco la calculadora en c:\ y hago esto:
Código (cpp) [Seleccionar]
ShellExecute(NULL,"open", "calc.exe",NULL,"C:\", SW_SHOW);


ya no funciona tampoco.
#22
Cita de: Иōҳ en 28 Marzo 2011, 19:40 PM
me parece que el se refiere a otra cosa....
Código (asm) [Seleccionar]

00401002      53            PUSH EBX

esto reemplaza el opcode null osea el zero terminator a eso te refieres?

osea

Código (asm) [Seleccionar]
lstrCadena db "Hola",0

te refieres a ese 0 el zero terminator?.... si es así con lo que te dice sagrini se hace el push ebx pone el zero terminator en la pila.... si no es asi.. pon como es tu cadena! y nosotros te podremos ayudar( que no sea en hex si no en ascii).

Salu2!
claro, es el cero terminador. Pero no entiendo cómo lo sustituyes por push ebx, ya que push ebx envía 4 nulos ¿me equivoco?
Y yo necesito un nulo justo al final de mi cadena.
   push 636578h      ;incluye un 00 al inicio automaticamente (que es el nulo del final de la cadena)
   push 456e6957h ;caracteres de winexec en sentido contrario

lo que mando a la pila son los caracteres de WinExec en orden inverso. Pero al final tengo que poner un nulo, es decir despues del 63 va un 00. En mi caso he enviado el 636578h en lugar de 00636578h aunque a fin de cuentas son equivalentes.

La pregunta era que cómo me deshago de ese 00 terminador.
#23
Cita de: black_flowers en 27 Marzo 2011, 13:59 PM
pero cuando hago por ejemplo esto, para meter la cadena enla pila:
   push 636578h      ;incluye un 00 al inicio automaticamente (que es el nulo del final de la cadena)
   push 456e6957h ;caracteres de winexec en sentido contrario
   mov ecx,esp
   push ecx
   push esi       ;dirección base de kernel32
   mov ebx,eax
   call eax ; llamamos a getprocaddress

el primer push pasado a opcodes es: 68 78 65 63 00, lo cual implica un nulo. A eso me refiero. ¿como evitas eso?


el opcode nulo está en mi cadena, en la que quiero utilizar yo.  ;D
#24
Cita de: [Zero] en 27 Marzo 2011, 00:13 AM
El push eax mete el caracter nulo, concretamente mete 4 xD.
pero cuando hago por ejemplo esto, para meter la cadena enla pila:
   push 636578h      ;incluye un 00 al inicio automaticamente (que es el nulo del final de la cadena)
   push 456e6957h ;caracteres de winexec en sentido contrario
   mov ecx,esp
   push ecx
   push esi       ;dirección base de kernel32
   mov ebx,eax
   call eax ; llamamos a getprocaddress

el primer push pasado a opcodes es: 68 78 65 63 00, lo cual implica un nulo. A eso me refiero. ¿como evitas eso?

#25
pues algo va mal en mi programa, y no logro averuguar qué. Si hago como tu dices , cuando llamo a WinExec para ejecutar calc.exe me devuelve FILE NOT FOUND (en olly) aunque he comprobado que la cadena y los parametros estan correctamente colocados en la pila antes de llamar a la funcion WinExec. Parece como que haya undesajuste en la pila por algún sitio. Lo curioso es que si no hago nada de eso (es decir si no balanceo la pila,y dejo todo como está) sí funciona. El programa tal y como está puesto en este post está con la pila sin balancear. Si hago lo que tú me dices no me funciona.
#26
Cita de: Sagrini en 26 Marzo 2011, 11:14 AM
Vaya complicación!
Yo hago:
Código (asm) [Seleccionar]

xor eax, eax
push eax
push 0x41424344 ; DDCCBBAA
push 0x41424344 ; DDCCBBAA
mov eax, esp


Y en EAX tienes tu cadenita (o la dirección, que es lo que necesitas)

tienes razón queda mucho más sencillo. El único problema es que no se como evitar caracteres nulos, sin ir mas lejos el que hay que poner al final de la cadena.
#27
vaya, pues si que es más fácil tu método. Lo voy a probar.
#28
este es el equivalente para visual c++:


#pragma section("mycode",execute)
__declspec(allocate("mycode"))char code[] = "\x33\xDB...sigue la shellcode";
#29
sabeis como se calculan los espacios que hay que restar a esp para introducir una cadena en la pila? En el siguiente código yo meto 8 cacacteres pero en cambio necesito restar 0bh es decir 11 espacios para que el programa funcione. Ademas ni siquiera necesito empezar la cadena en la parte superior, es decir en el espacio 11 sino que empezando en el espacio 8 funciona. No entiendo el porqué de esto.

sub esp, 0bh ; dejamos espacio en la pila para meter nuestra cadena
   mov byte ptr [ebp-08h], 57h  ; 'W'
   mov byte ptr [ebp-07h], 69h  ; 'i'
   mov byte ptr [ebp-06h], 6eh  ; 'n'
   mov byte ptr [ebp-05h], 45h  ; 'E'
   mov byte ptr [ebp-04h], 78h  ; 'x'
   mov byte ptr [ebp-03h], 65h  ; 'e'
   mov byte ptr [ebp-02h], 63h  ; 'c'
   mov byte ptr [ebp-01h], dl   ; 0x00
   lea ecx, [ebp-08h] ; cargamos la direccion que apunta a nuestra cadena
   push ecx
   push esi       ;dirección base de kernel32
   call eax ; llamamos a getprocadress


#30
Cita de: Ivanchuk en 24 Marzo 2011, 18:48 PM
mmm creo que esta trabajando en windows, digo por el header windows.h :P.

Para mi que el problema es q no tiene permisos de ejecucion en la sección de datos, por eso cuando salta para ejecutar en char code le tira el access violation. Si es eso trata de meter char code en la sección ejecutable, fijate que te dice el compilador si declaras code asi:

Código (cpp) [Seleccionar]
char code[] __attribute__((section (".text"))) = ...

En linux con gcc funciona pero no se en windows.

sí, es en windows y he probado con gcc y funciona  :D
en cambio con visual c++ no , >:(, me da un montón de errores de compilación. En cualquier caso el problemaes el que tu dices de los permisos, así que será cuestión de buscar la instrucción equivalente en visual c++.

A todo esto la shellcode no haceotra cosa que lanzar la calculadora de windows y debería de funcionar en cualquier sistema.

Un saludo.