duda de cómo se introducen cadenas en la pila (manualmente).

Iniciado por black_flowers, 25 Marzo 2011, 12:12 PM

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

black_flowers

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.

Иōҳ

#11
lo sustituyo porque ebx vale 0 y lo que estas pasando es un valor nullo a la pila para que sea el zero terminator, el push ebx envia a la 00000000 a la 'pila', luego le pasas las cadena, al final solo te queda debuggear si al final de esta subrutina queda desbalanceada la pila... para balancearlo. no sabria decirte con exactitud si desbalancea la pila. =/

Dato: TODA cadena tiene que tener un zero terminator que indica el final.

Salu2!
Eres adicto a la Ing. Inversa? -> www.noxsoft.net

black_flowers

es que hay algún sitio en donde nonos estamos entendiendo. Para clarificarlo voy a preguntar esto que no tiene más vuelta de hoja: ¿cómo introducirías en la pila winexec sabiendo que estos son sus caracteres asci?
57h  'W'
69h  'i'
6eh  'n'
45h  'E'
78h  'x'
65h  'e'
63h  'c'

Иōҳ

#13
disculpa por no entenderte, pero creo que debistes resaltar la cadena a pasar en primera instancia.. en ascii o talvez fue un despiste mio de no prestar atencion a tu cadena en hex sea cual sea, esto me funciono, chequelo.  :xD

Código (asm) [Seleccionar]
00401000 >    33DB                    XOR EBX, EBX
00401002      53                      PUSH EBX
00401003      68 45786563             PUSH 63657845
00401008      C74424 FD 57696E45      MOV DWORD PTR SS:[ESP-3], 456E6957
00401010      8D5C24 FD               LEA EBX, DWORD PTR SS:[ESP-3]


pd: Me esta pareciendo interesante codear una shellcode eh! jeje (como nunca lo he hecho X)

pd2: el code creo que esta un poco ortodoxo, fijate si necesitas reservar espacio en la pila.. ya que estoy moviendo valores directamente, se puede mejorar, pero ya tienes la idea :).

Salu2!
Eres adicto a la Ing. Inversa? -> www.noxsoft.net

black_flowers

Cita de: Иōҳ en 29 Marzo 2011, 17:54 PM
disculpa por no entenderte,pero creo que debistes resaltar la cadena a pasar en primera instancia.. en ascii o talvez fue un despiste mio de no prestar atencion a tu cadena en hex sea cual sea, esto me funciono, chequelo.  :xD

Código (asm) [Seleccionar]
00401000 >    33DB                    XOR EBX, EBX
00401002      53                      PUSH EBX
00401003      68 45786563             PUSH 63657845
00401008      C74424 FD 57696E45      MOV DWORD PTR SS:[ESP-3], 456E6957
00401010      8D5C24 FD               LEA EBX, DWORD PTR SS:[ESP-3]


pd: Me esta pareciendo interesante codear una shellcode eh! jeje (como nunca lo he hecho X)

pd2: el code creo que esta un poco ortodoxo, fijate si necesitas reservar espacio en la pila.. ya que estoy moviendo valores directamente, se puede mejorar, pero ya tienes la idea :).

Salu2!

lo que pasa es que estaba tratando de hacerlo tal y como indicó sagrini en un post anterior, él utilizaba sólo  push, y no mov, de esa manera la pila queda siempre balanceada, eso es lo que intento principalmente.
Por lo tanto para meter la cadena con push hago esto:
En este primer caso no hay problemas con los opcodes nulos puesto que la cadena ocupa ocho caracteres y no necesito mandar ningún valor nulo.
  xor ecx,ecx     ;necesitamos mandar el nulo (en este caso mandamos 4 ya que mandamos el ecx entero)
  push ecx
  push 6578652Eh ;caracteres de calc.exe
  push 636C6163h
  mov ecx,esp

pero en este caso: la cadena ocupa siete caracteres con lo cual hay que mandar un 00 al final.
  push 00737365h       ;caracteres de exitprocess
  push 636f7250h
  push 74697845h
  mov ecx,esp

y ese es el problema ese caracter nulo. Sospecho que en linux igual no hay ese problema, pero tampoco estoy muy seguro.

ah! y Nox gracias por tu ayuda! por cierto vaya N más rara jeje.

Иōҳ

el code que te pase funciona como te dije fijate si queda desbalanceada la pila o antes de eso le podes reservar espacio en la pila luego la balanceas.. con lo que te doy ya tenes una idea si no quieres hacer mov puedes hacer que esp apunte 3 posiciones antes con un lea, y luego haces el push te evitas de hacer mov, y luego restauras a esp, en fin miles de ideas, te recomiendo que usaes algun debugger asi practica practica hasta que te salga!

Salu2!
Eres adicto a la Ing. Inversa? -> www.noxsoft.net

black_flowers

ok, Nox. Ya había conseguido antes hacerlo funcionar pero introducía la cadena en la pila de otra manera y quedaba la pila desbalanceada (aunque funcionaba igual sin problemas). no obstante de esta manera es más sencillo.

Un saludo!

Иōҳ

bien bien pero parece que no resolvimos ese problema de tu code el del principio mira yo use este code para loadlibrary, y me funciona perfectamente checa como le reservo la pila... si solo cambias los caracteres debe funcionar

Código (asm) [Seleccionar]

;00402044  4C 6F 61 64 4C 69 62 72  LoadLibr
;0040204C  61 72 79 41 00           aryA.

mov ebp,esp; ebp puntero al stack
sub esp, 0Dh; reservamos espacio
xor ecx,ecx
mov byte ptr [ebp - 0Dh], 4Ch
mov byte ptr [ebp - 0Ch], 6Fh
mov byte ptr [ebp - 0Bh], 61h
mov byte ptr [ebp - 0Ah], 64h
mov byte ptr [ebp - 09h], 4Ch
mov byte ptr [ebp - 08h], 69h
mov byte ptr [ebp - 07h], 62h
mov byte ptr [ebp - 06h], 72h
mov byte ptr [ebp - 05h], 61h
mov byte ptr [ebp - 04h], 72h
mov byte ptr [ebp - 03h], 79h
mov byte ptr [ebp - 02h], 41h
mov byte ptr [ebp - 01h], cl
lea ecx, dword ptr [ebp - 0Dh]

push ecx
push edx; BaseKernel
call ebx; GPA
add esp, 0Dh; Balanceamos la pila


pd: la pila se balancea para poder evitar errores, puede que haya un tipo de seguridad que mire la pila, y si a la hora de volver por ejemplo al programa la pila no esta como antes crash! y aunque no te de ese problema cuando lo haces una aplicacion autonoma, es por buena costumbre que lo harias :).

Salu2!
Eres adicto a la Ing. Inversa? -> www.noxsoft.net

Garfield07

Os habéis ido del tema, no lo habéis entendido...
Código (asm) [Seleccionar]

xor eax, eax
push eax
push byte 0x63;  'c'
push byte 0x65;  'e'
push byte 0x78;  'x'
push byte 0x45;  'E'
push byte 0x6e;  'n'
push byte 0x69;  'i'
push byte 0x57;  'W'
mov eax, esp


Al introducir "push eax" lo que hacemos es meter el byte nulo, lo que es equivalente a poner "string BLAHBLAH, 0", que es lo que queréis.
Si no lo entendéis, PM.
Un saludo. Sagrini

PS1: He puesto lo de byte para que no haya nulos entre medias, por si acaso...
PS2: Aparte, los pongo uno a uno porque son 7 bytes. Se podrían poner divididos en un WORD y tres bytes, pero no tengo ganas ;)...


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

[Zero]

Cita de: Sagrini en  2 Abril 2011, 20:56 PM
Os habéis ido del tema, no lo habéis entendido...
Código (asm) [Seleccionar]

xor eax, eax
push eax
push byte 0x63;  'c'
push byte 0x65;  'e'
push byte 0x78;  'x'
push byte 0x45;  'E'
push byte 0x6e;  'n'
push byte 0x69;  'i'
push byte 0x57;  'W'
mov eax, esp


Al introducir "push eax" lo que hacemos es meter el byte nulo, lo que es equivalente a poner "string BLAHBLAH, 0", que es lo que queréis.
Si no lo entendéis, PM.
Un saludo. Sagrini

PS1: He puesto lo de byte para que no haya nulos entre medias, por si acaso...
PS2: Aparte, los pongo uno a uno porque son 7 bytes. Se podrían poner divididos en un WORD y tres bytes, pero no tengo ganas ;)...

Pero si el lío se lo metiste tú pusheando dos dword's al principio, y el quiso hacer lo mismo con una cadena de 7 bytes  :xD. Para pushear con bytes, no hay problema, para pushear con dwords puedes hacer lo que te dijo Karcrack de hacer un xor con el 'xoreado' o hacer lo que hizo Nox con un mov. O hacer lo que te dije yo, que ocupa menos con cadenas de más de 7 bytes, pero que deja nulos.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche