Tema destacado: Recuperar cuenta de Google, GMail, Youtube
Autor
|
Tema: duda de cómo se introducen cadenas en la pila (manualmente). (Leído 2,659 veces)
|
black_flowers
Desconectado
Mensajes: 65
|
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
|
|
|
|
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.123
¡Este año voy a por todas! JMJ 2011
|
Vaya complicación! Yo hago: 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)
|
|
|
|
|
En línea
|
 * 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
Desconectado
Mensajes: 65
|
vaya, pues si que es más fácil tu método. Lo voy a probar.
|
|
|
|
|
En línea
|
|
|
|
black_flowers
Desconectado
Mensajes: 65
|
Vaya complicación! Yo hago: 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.
|
|
|
|
|
En línea
|
|
|
|
|
[Zero]
|
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: call str_1 _String1 db "Soy un String",0 str_1: pop ecx ;ecx apunta a la cadena
|
|
|
|
« Última modificación: 27 Marzo 2011, 00:21 por [Zero] »
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
black_flowers
Desconectado
Mensajes: 65
|
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?
|
|
|
|
|
En línea
|
|
|
|
|
|
black_flowers
Desconectado
Mensajes: 65
|
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. 
|
|
|
|
|
En línea
|
|
|
|
|
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
|
|
|
|
|
En línea
|
|
|
|
Иōҳ
Desconectado
Mensajes: 453
|
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.... 00401002 53 PUSH EBX esto reemplaza el opcode null osea el zero terminator a eso te refieres? osea 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!
|
|
|
|
|
En línea
|
|
|
|
black_flowers
Desconectado
Mensajes: 65
|
me parece que el se refiere a otra cosa.... 00401002 53 PUSH EBX esto reemplaza el opcode null osea el zero terminator a eso te refieres? osea 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.
|
|
|
|
|
En línea
|
|
|
|
Иōҳ
Desconectado
Mensajes: 453
|
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!
|
|
|
|
« Última modificación: 29 Marzo 2011, 06:36 por Иōҳ »
|
En línea
|
|
|
|
black_flowers
Desconectado
Mensajes: 65
|
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'
|
|
|
|
|
En línea
|
|
|
|
Иōҳ
Desconectado
Mensajes: 453
|
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.  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!
|
|
|
|
« Última modificación: 29 Marzo 2011, 20:40 por Иōҳ »
|
En línea
|
|
|
|
black_flowers
Desconectado
Mensajes: 65
|
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.  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.
|
|
|
|
|
En línea
|
|
|
|
|
|