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

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

0 Miembros y 5 Visitantes están viendo este tema.

black_flowers

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



Garfield07

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)


* 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

black_flowers

vaya, pues si que es más fácil tu método. Lo voy a probar.

black_flowers

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.

[Zero]

#4
Cita de: black_flowers en 26 Marzo 2011, 15:59 PM
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.

El push eax mete el caracter nulo, concretamente mete 4 xD.

Saludos

Edito: Otra forma de hacerlo:

Código (asm) [Seleccionar]

call str_1
_String1 db "Soy un String",0
str_1:
pop ecx
;ecx apunta a la cadena


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

black_flowers

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?


Иōҳ

Código (asm) [Seleccionar]
00401000 >    33DB          XOR EBX, EBX
00401002      53            PUSH EBX
00401003      68 44434241   PUSH 41424344
00401008      68 44434241   PUSH 41424344
0040100D      8BDC          MOV EBX, ESP


pues no veo ningun opcode null




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

black_flowers

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

Karcrack

Una cadena ASCII no puede tener un byte nulo por el medio... ya que la cadena ASCII se mida hasta la aparicion de un byte nulo... Y si tu "cadena" tiene bytes nulos sencillamente xorea todo el numero y lo vuelves a xorear una vez en la pila... seria algo asi:
push 0xAABBCCDD ;Caracteres xoreados con nMagic para quitar 00s
xor [esp], nMagic ;Vuelves a xorear para dejar como estaba

Иōҳ

Cita de: Karcrack en 28 Marzo 2011, 16:17 PM
Una cadena ASCII no puede tener un byte nulo por el medio... ya que la cadena ASCII se mida hasta la aparicion de un byte nulo... Y si tu "cadena" tiene bytes nulos sencillamente xorea todo el numero y lo vuelves a xorear una vez en la pila... seria algo asi:
push 0xAABBCCDD ;Caracteres xoreados con nMagic para quitar 00s
xor [esp], nMagic ;Vuelves a xorear para dejar como estaba


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!
Eres adicto a la Ing. Inversa? -> www.noxsoft.net