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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  no entiendo un error debido a la sección data
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: no entiendo un error debido a la sección data  (Leído 3,999 veces)
Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
no entiendo un error debido a la sección data
« en: 24 Julio 2013, 03:16 am »

hola

tengo una duda

en el codigo de socket que hice de nasm, estaba quitando varios printf que puse para saber que estaba haciendo el programa y verificar si se ejecutaba bien, pero al saber que ya estaba funcionando quise eliminarlos, pero al eliminar una parte codigo dejo de funcionar

habia puesto saveWSA, para comprobar que WSAStartup esta funcionando

Código
  1. saveWSA: dd '0xFFFFFFFF'
  2. soc: db 'socket',0
  3. soadd: dd '0xFFFFFFFF'

"saveWSA" solo era para verificar que estaba bien WSAStartup viendo el resultado de eax con un printf

lo habia puesto asi

Código
  1. mov [saveWSA], eax
  2. cmp dword [saveWSA], -1
  3. jne mns1
  4. je erro
  5.  
  6. mns1:
  7. push dword [saveWSA]
  8. push res1
  9. call _printf

quise eliminar "0xFFFFFFFF" de saveWSA, pero despues de compilar, lo ejecuto y me aparece un error y se cierra el programa, despues solo elimine la parte de comprobacion

/////////
mov [saveWSA], eax
......
....
...
...
call printf
////////////

todo eso borre y pero esta ves deje "saveWSA: dd '0xFFFFFFFF'", volvi a compilar y al ejecutar el programa, funciona correctamente

hice un seguimiento con ollydbg y me di cuenta de dos cosas, la primera es que si quito "saveWSA" de la sección data, la parte donde llamo con GetProcAddress a socket, solo me aparece

"ock 2.0" y me aparece despues una violacion de acceso

y la segunda es que cuando vuelvo a colocar unicamente "saveWSA: dd '0xFFFFFFFF'" en ollydbg me aparece bien la invocacion con GetPtocAddress, "socket"

en pocas palabaras

funciona correctamente

Código
  1. saveWSA: dd '0xFFFFFFFF'
  2. soc: db 'socket',0
  3. soadd: dd '0xFFFFFFFF'

ya no funciona

Código
  1. soc: db 'socket',0
  2. soadd: dd '0xFFFFFFFF'

alguien sabe porque falla en ese sentido?, la verdad no entiendo porque funciona con saveWSA si solo lo puse para verificar con printf si estaba bien WSAStartup, y al quitarlo deja de funcionar

salu2


En línea

.                                 
xv0


Desconectado Desconectado

Mensajes: 1.026



Ver Perfil
Re: no entiendo un error debido a la sección data
« Respuesta #1 en: 24 Julio 2013, 04:27 am »

En el anterior codigo, tienes esto.

Código
  1. push WSD
  2. push 0x202
  3. call [Getpc]
  4. mov [saveWSA], eax

Puede que sea ese el error, ya lo corregiste?

Un saludo.



En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: no entiendo un error debido a la sección data
« Respuesta #2 en: 24 Julio 2013, 05:06 am »

sip tambien quite eso, lo raro es que solo es en section .data donde se produce el fallo

porngo el codigo completo de como lo deje en este momento

Código
  1. [BITS 32]
  2.  
  3. global _WinMain@16
  4.  
  5. section .data
  6.  
  7. wsdll: db 'ws2_32.dll',0
  8. wsaddr: dd '0xFFFFFFFF'
  9. Getpc: db '0xFFFFFFFF'
  10.  
  11. WStp: db 'WSAStartup',0
  12. WSaddr: dd '0xFFFFFFFF'
  13. WSD: db 'WSADATA',0
  14. saveWSA: dd '0xFFFFFFFF'
  15. soc: db 'socket',0
  16. soadd: dd '0xFFFFFFFF'
  17. bind: db 'bind',0
  18. binaddr: dd '0xFFFFFFFF'
  19. lis: db 'listen',0
  20. lisaddr: dd '0xFFFFFFFF'
  21. accp: db 'accept',0
  22. accaddr: dd '0xFFFFFFFF'
  23. rec: db 'recv',0
  24. recaddr: dd '0xFFFFFFFF'
  25. rsocket: dd '0xFFFFFFFF'
  26.  
  27. buff: times 50 db 0
  28.  
  29. section .text
  30.  
  31. extern _ExitProcess@4
  32. extern _LoadLibraryA@4
  33. extern _GetProcAddress@8
  34. extern _printf
  35. extern _WSAStartup@8
  36.  
  37. _WinMain@16:
  38.  
  39. xor eax, eax
  40.  
  41. push wsdll
  42. call _LoadLibraryA@4
  43. mov [wsaddr], eax
  44.  
  45. push WStp
  46. push dword [wsaddr]
  47. call _GetProcAddress@8
  48. mov [Getpc], eax
  49.  
  50. push WSD
  51. push 0x202
  52. call [Getpc]
  53.  
  54. push soc
  55. push dword [wsaddr]
  56. call _GetProcAddress@8
  57. mov [Getpc], eax
  58.  
  59. push 6
  60. push 1
  61. push 2
  62. call [Getpc]
  63. mov [soadd], eax
  64.  
  65. push bind
  66. push dword [wsaddr]
  67. call _GetProcAddress@8
  68. mov [binaddr], eax
  69.  
  70. push 0x00000000
  71. push 0xB9220002
  72. mov esi,esp
  73. push byte 16
  74. push esi
  75. push dword[soadd]
  76. call [binaddr]
  77.  
  78. push lis
  79. push dword [wsaddr]
  80. call _GetProcAddress@8
  81. mov [lisaddr], eax
  82.  
  83. push 2
  84. push dword[soadd]
  85. call [lisaddr]
  86.  
  87. push accp
  88. push dword [wsaddr]
  89. call _GetProcAddress@8
  90. mov [accaddr], eax
  91.  
  92. ac_acp:
  93. push 0x00000000
  94. push 0x00000000
  95. mov esi, esp
  96. push byte 16
  97. push dword[soadd]
  98. call [accaddr]
  99. cmp eax, -1
  100. je ac_acp
  101. mov [rsocket], eax
  102.  
  103. push rec
  104. push dword [wsaddr]
  105. call _GetProcAddress@8
  106. mov [recaddr], eax
  107.  
  108. loop_recv:
  109. xor eax, eax
  110. push 0
  111. push 50
  112. push buff
  113. push dword[rsocket]
  114. call [recaddr]
  115. cmp eax, -1
  116. je loop_recv
  117.  
  118. push buff
  119. call _printf
  120.  
  121. push 0
  122. call _ExitProcess@4

Asi funciona bien, pero si quito

saveWSA: dd '0xFFFFFFFF'

deja de funcionar, en ollydbg con saveWSA me aparece "socket" cuando llamo a GetProcAddress, pero si quito saveWSA me aparece "ock 2.0"

me refiero a esta parte

Código
  1. push soc
  2. push dword [wsaddr]
  3. call _GetProcAddress@8
  4. mov [Getpc], eax

esta es la parte que analizandola en olly me aparece "socket" cuando lo llamo con getprocaddres, pero si quito saveWSA me aparece "ock 2.0"

y obviamente getprocaddres guarda una direccion incorrecta y cuando llega a socket para poner

push 6
push 1
push 2
call [Getpc]
mov [soadd], eax

en el call es cuando crashea porque Getpc guardo datos incorrectos, que seria "ock 2.0" y no entiendo porque?, de donde sale ese ock2.0?
En línea

.                                 
xv0


Desconectado Desconectado

Mensajes: 1.026



Ver Perfil
Re: no entiendo un error debido a la sección data
« Respuesta #3 en: 24 Julio 2013, 08:39 am »

Curioso, no consigo ver el fallo, enteroria esta todo bien pasas la direccion de la cadena y esta acaba en 0.

Como digiste solo es en .data, si cargas la cadena como la estructura sockaddr_in funciona no?

Bueno a ver si lo saco.

Un saludo.

P.D: Ese codigo se puede optimizar, pero eso ya es otra historia.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: no entiendo un error debido a la sección data
« Respuesta #4 en: 24 Julio 2013, 10:13 am »

Basicamente te funciona de casualidad ... Getpc debe ser double word y los valores enteros no van entre '', ejemplo:

wsdll: db 'ws2_32.dll',0
wsaddr: dd 0xFFFFFFFF
Getpc: dd 0xFFFFFFFF
....

Esto no tiene pies ni cabeza y es por eso que al final terminas sobreescribiendo 'socket':
WSD: db 'WSADATA',0

¿Para que queres tener como dato la cadena WSADATA? Tenes que usar idealmente la estructura WSADATA (o al menos reservar el espacio equivalente en bytes).

Como no domino NASM realmente (me costo bastante poder generar el ejecutable, la proxima vez deja la linea de comando):

WSD: times 400 db 0

En teoria deberias ser capaz de incluir un archivo con la definicion de la estructura.

PD. ¿Y si usas MASM o FASM mejor?



WinDbg en accion, con tus definiciones:

0:000> lm
start    end        module name
000d0000 000d5000   image000d0000   (deferred)  
...

0:000> !dh image000d0000
...
SECTION HEADER #3
   .data name
     46C virtual size
    3000 virtual address
     200 size of raw data
    1400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         (no align specified)
         Read Write
...

0:000> dd image000d0000+3000
000d3000  5f327377 642e3233 30006c6c 46464678
000d3010  46464646 30000046 46464678 46464646
000d3020  41535746 72617453 00707574 46467830
000d3030  46464646 00004646 44415357 00415441
000d3040  46467830 46464646 00004646 6b636f73
000d3050  30007465 46464678 46464646 62000046
000d3060  00646e69 46467830 46464646 00004646
000d3070  7473696c 30006e65 46464678 46464646
0:000> db image000d0000+3000
000d3000  77 73 32 5f 33 32 2e 64-6c 6c 00 30 78 46 46 46  ws2_32.dll.0xFFF
000d3010  46 46 46 46 46 00 00 30-78 46 46 46 46 46 46 46  FFFFF..0xFFFFFFF
000d3020  46 57 53 41 53 74 61 72-74 75 70 00 30 78 46 46  FWSAStartup.0xFF
000d3030  46 46 46 46 46 46 00 00-57 53 41 44 41 54 41 00  FFFFFF..WSADATA.
000d3040  30 78 46 46 46 46 46 46-46 46 00 00 73 6f 63 6b  0xFFFFFFFF..sock
000d3050  65 74 00 30 78 46 46 46-46 46 46 46 46 00 00 62  et.0xFFFFFFFF..b
000d3060  69 6e 64 00 30 78 46 46-46 46 46 46 46 46 00 00  ind.0xFFFFFFFF..
000d3070  6c 69 73 74 65 6e 00 30-78 46 46 46 46 46 46 46  listen.0xFFFFFFF

Como podes ver, socket esta ahi antes de empezar a ejecutar el codigo, el problema es que despues lo sobreescribis al llamar a WSAStartup (cuyo segundo parametro es de tipo OUT).

Arreglado:
0:000> lm
start    end        module name
001b0000 001b5000   image001b0000   (deferred)
...

0:000> !dh image001b0000
...
SECTION HEADER #3
   .data name
     5AC virtual size
    3000 virtual address
     400 size of raw data
    1400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         (no align specified)
         Read Write
...

0:000> dd image001b0000+3000
001b3000  5f327377 642e3233 ff006c6c ffffffff
001b3010  57ffffff 74534153 75747261 ffff0070
001b3020  0000ffff 00000000 00000000 00000000
001b3030  00000000 00000000 00000000 00000000
001b3040  00000000 00000000 00000000 00000000
001b3050  00000000 00000000 00000000 00000000
001b3060  00000000 00000000 00000000 00000000
001b3070  00000000 00000000 00000000 00000000
0:000> db image001b0000+3000
001b3000  77 73 32 5f 33 32 2e 64-6c 6c 00 ff ff ff ff ff  ws2_32.dll......
001b3010  ff ff ff 57 53 41 53 74-61 72 74 75 70 00 ff ff  ...WSAStartup...
001b3020  ff ff 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001b3030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001b3040  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001b3050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001b3060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001b3070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
« Última modificación: 24 Julio 2013, 10:29 am por Eternal Idol 7D » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: no entiendo un error debido a la sección data
« Respuesta #5 en: 24 Julio 2013, 20:11 pm »

cierto, ya funciona, desconocia lo que mencionas sobre WSADATA en ensamblador, me dio curiosidad y encontre esto

Código
  1. lea       ecx,dword ptr [ebp-400]
  2. push      ecx
  3. push      2
  4. call      WSAStartup

aqui esta reservado el espacio en ebp y de hecho encontre otro modo de hacerlo

Código
  1. push      ebp
  2. mov       ebp,esp
  3. add       esp,-500
  4. push      ebx
  5.  
  6. ; WSAStartup(MAKEWORD(2,0),&wsaData);
  7.  ;
  8. lea       ecx,dword ptr [ebp-400]
  9. push      ecx
  10. push      2
  11. call      WSAStartup
  12.  

me imagino que hacer esto seria lo mismo, no?

Código
  1. push      ebp
  2. mov       ebp,esp
  3. sub     esp, 500
  4.  

y esta es la razon por la que empece con nasm, encontre varios ejemplos ademas que fue lo primero que vi que era compatible con linux y windows, aunque hice el mismo ejemplo en fasm y la verdad fue mucho mas sencillo, pero tampoco encuentro ejemplos o explicaciones de los mismos, y los que encuentro son para windows, en nasm encuentro un poco mas para linux, pero hay otro problema, como apenas estoy empezando la mayoria de los codigos son sobre shellcodes, exploits, etc... y si todavia no se bien ensamblador, no quiero meterme todavia en esos codigos, mejor paso a paso...

este es el que hice en fasm

Código
  1. format PE console 4.0
  2.  
  3. entry start
  4.  
  5. include 'include\win32a.inc'
  6.  
  7. section '.data' data readable writable
  8.  
  9. wsadata WSADATA
  10. saddr sockaddr_in
  11. sock_size = $-saddr
  12. sock dd ?
  13. sin_addr dd ?
  14. sin_port dd ?
  15.  
  16. section '.code' code readable executable
  17. start:
  18.  
  19. invoke WSAStartup, 0202h, wsadata
  20. invoke socket, AF_INET, SOCK_STREAM, 0
  21.  
  22. mov[sock], eax
  23. mov[saddr.sin_family], AF_INET
  24. mov[saddr.sin_port], 0xB922
  25. mov[saddr.sin_addr], 0x0100007F
  26.  
  27. invoke connect, [sock], saddr, sock_size
  28.  
  29. invoke ExitProcess,0
  30.  
  31. section '.idata' import data readable writeable
  32.  
  33. library kernel, 'KERNEL32.DLL',\
  34.        winsock, 'WSOCK32.DLL'
  35.  
  36. import kernel,\
  37.       ExitProcess, 'ExitProcess'
  38.  
  39. import winsock,\
  40.       WSAStartup, 'WSAStartup',\
  41.       WSACleanup, 'WSACleanup',\
  42.       socket, 'socket',\
  43.       connect, 'connect',\
  44.       sendto, 'sendto',\
  45.       closesocket, 'closesocket'    

compilacion para nasm

Código:
nasm -f win32 archivo.asm
gcc archivo.obj -o archivo.exe

gracias a los dos por las respuestas

salu2
En línea

.                                 
xv0


Desconectado Desconectado

Mensajes: 1.026



Ver Perfil
Re: no entiendo un error debido a la sección data
« Respuesta #6 en: 25 Julio 2013, 00:40 am »

Código
  1. lea       ecx,dword ptr [ebp-400]
  2. push      ecx
  3. push      2
  4. call      WSAStartup

aqui esta reservado el espacio en ebp y de hecho encontre otro modo de hacerlo

Sustrae 1024 bytes a ebp y copia la direccion al registro ecx, que se convierte en un puntero, pero ebp sigue igual.

Y sobre los otros dos, podrias mirar las instrucciones enter y leave.

Un saludo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error con c$ no entiendo porque!!
Programación Visual Basic
Xrage87 3 1,742 Último mensaje 29 Noviembre 2008, 14:22 pm
por gulabyte
Error en Nautilus-data. Codigo de salida error 1.
GNU/Linux
lilo. 2 4,874 Último mensaje 29 Enero 2011, 03:49 am
por RyogiShiki
Error DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary log
Bases de Datos
JUCA 0 2,220 Último mensaje 25 Febrero 2016, 02:09 am
por JUCA
ayuda con data-bind no entiendo
Java
alvarogemelo 1 1,264 Último mensaje 21 Febrero 2017, 17:55 pm
por alvarogemelo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines