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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 49
81  Programación / ASM / Re: no entiendo un error debido a la sección data 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
82  Programación / ASM / Re: no entiendo un error debido a la sección data 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?
83  Programación / ASM / 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
84  Programación / Programación C/C++ / Re: porque no funciona send() y recv()? en: 21 Julio 2013, 04:12 am
ya lo arregle, olvide agregar a socket accept

socket = accept(socket,0, 0);
85  Programación / Programación C/C++ / porque no funciona send() y recv()? en: 21 Julio 2013, 02:50 am
hola

estaba haciendo un socket sencillo e windows y se conecta bien pero cuando uso send() y recv() no me aparece nada  :huh:  :huh:, me podrian decir que podria estar mal, llevo un tiempo sin usar C y sockets pero no creo que se me haya olvidado como hacerlo jeje, a ver si le encuentran algo mal, porque ya lo revise y no recuerdo haber olvidado algo

solo era conectarse entre sockets y mandan un "hola mundo"

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <winsock2.h>
  4.  
  5. int main()
  6. {
  7.    WSADATA wsa;
  8. SOCKET sock;
  9. struct sockaddr_in cl;
  10. int co = 0;
  11. char buff[50];
  12.  
  13. WSAStartup(MAKEWORD(2,2), &wsa);
  14. sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  15.  
  16. cl.sin_family = AF_INET;
  17. cl.sin_port = htons(8889);
  18. cl.sin_addr.s_addr = INADDR_ANY;
  19.  
  20. if(bind(sock, (struct sockaddr*)&cl, sizeof(struct sockaddr)) == -1){
  21.    printf("error bind");
  22. }
  23.  
  24. if(listen(sock, 1) == -1){
  25.  
  26.    printf("error listen");
  27. }
  28.  
  29. co = sizeof(struct sockaddr);
  30.  
  31. if((accept(sock, (struct sockaddr*)&cl, &co)) == -1){
  32.        accept(sock, (struct sockaddr*)&cl, &co);
  33.  
  34.        }
  35.  
  36. recv(sock, buff, sizeof(buff), 0);
  37. printf("%s", buff);
  38.  
  39.  
  40. return 0;
  41. }
  42.  

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <winsock2.h>
  4.  
  5. int main()
  6. {
  7.    WSADATA wsa;
  8.    SOCKET fd;
  9.    struct sockaddr_in cli;
  10.    struct hostent* he;
  11.    char buff[50] = "hola mundo";
  12.  
  13.    WSAStartup(MAKEWORD(2,2), &wsa);
  14.    he = gethostbyname("127.0.0.1");
  15.    if((fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != 0){
  16.  
  17.        printf("resultado %d", fd);
  18.    }
  19.  
  20.    cli.sin_family = AF_INET;
  21.    cli.sin_port = htons(8889);
  22.    cli.sin_addr = *((struct in_addr*)he->h_addr);
  23.    memset(cli.sin_zero, 8, 0);
  24.  
  25.    connect(fd, (struct sockaddr*)&cli, sizeof(struct sockaddr));
  26.  
  27.    send(fd, buff, strlen(buff), 0);
  28.  
  29.    return 0;
  30. }
  31.  
86  Programación / ASM / Re: logre un socket en nasm jeje en: 20 Julio 2013, 23:46 pm
jeje lo siento, no me fije que puse direcciones en ves de valores, o en otras palabras, ip, puerto y AF_INET

es que cuando buscaba informacion lei que alguien decia que ESI y EDI eran continuos, asi que imagine que lo que se ponia en uno, se concatenaba al otro, pero ya despues lei en otro lugar que era algo parecido a esto

buffer1[i++] = buffer2[j++]

por eso me confundo, porque ya no seria concatenar, seria copiar y veo que muchos usan

push esi
push edi

e incluso veo que lo usan mucho con ecx

push esi
push edi
push ecx

por eso quisiera saber cual es el proposito, de esi y edi
87  Programación / ASM / logre un socket en nasm jeje en: 20 Julio 2013, 22:05 pm
yeeeeeah!! lo logre

les dejo el codigo por si a alguien mas le sirve y por si lo pierdo se que aqui estara, solo me falta el servidor pero espero se me facilite un poco mas

y gracias al consejo de cpu2 de usar direcciones en vez de usar estructuras logre hacerlo

Código
  1. [BITS 32]
  2.  
  3. section .data
  4.  
  5. wsdll: db 'ws2_32.dll',0
  6. wsaddr: dd '0xFFFFFFFF'
  7. Getpc: dd '0xFFFFFFFF'
  8.  
  9. WStp: db 'WSAStartup',0
  10. WSaddr: dd '0xFFFFFFFF'
  11. WSD: dd 'WSADATA',0
  12. saveWSA: dd '0xFFFFFFFF'
  13. soc: db 'socket',0
  14. soadd: dd '0xFFFFFFFF'
  15. conn: db 'connect', 0
  16. conaddr: dd '0xFFFFFFFF'
  17. sen: db 'send', 0
  18. sendadd: dd '0xFFFFFFFF'
  19.  
  20. res1: db "WSAStartup %d", 10, 0
  21. res2: db "Socket %d", 10, 0
  22. res3: db "connect %d", 10, 0
  23. res4: db "send %d", 10 ,0
  24.  
  25. sre: db "hola mundo",0
  26.  
  27. section .bss
  28. sn resb 10
  29.  
  30. section .text
  31.  
  32. global _WinMain@16
  33. extern _ExitProcess@4
  34. extern _LoadLibraryA@4
  35. extern _GetProcAddress@8
  36. extern _printf
  37. extern _WSAStartup@8
  38.  
  39. _WinMain@16:
  40.  
  41. xor eax, eax
  42.  
  43. push wsdll
  44. call _LoadLibraryA@4
  45. mov [wsaddr], eax
  46.  
  47. push WStp
  48. push dword [wsaddr]
  49. call _GetProcAddress@8
  50. mov [Getpc], eax
  51.  
  52. push WSD
  53. push 0x202
  54. call [Getpc]
  55. mov [saveWSA], eax
  56.  
  57. cmp dword [saveWSA], -1
  58. jne mns1
  59. je erro
  60.  
  61. mns1:
  62. push dword [saveWSA]
  63. push res1
  64. call _printf
  65.  
  66. push soc
  67. push dword [wsaddr]
  68. call _GetProcAddress@8
  69. mov [Getpc], eax
  70.  
  71. push 6
  72. push 1
  73. push 2
  74. call [Getpc]
  75. mov [soadd], eax
  76.  
  77. push dword [soadd]
  78. push res2
  79. call _printf
  80.  
  81. push conn
  82. push dword [wsaddr]
  83. call _GetProcAddress@8
  84. mov [conaddr], eax
  85.  
  86. push dword [conaddr]
  87. push res3
  88. call _printf
  89.  
  90. push 0x0100007F
  91. push 0xB9220002
  92. mov esi, esp
  93. push byte 16
  94. push esi
  95. push dword [soadd]
  96. call [conaddr]
  97.  
  98. erro:
  99. push 0
  100. call _ExitProcess@4


Habia leido sobre poner sockaddr_in en nasm pero no supe como usar estructuras asi que puse directamente la ip, el puerto y el formato de direccion (AF_INET) lo guarde en ESI, despues reserve 16 bytes de espacio para la longitud de sockaddr_in y listo, meti en la pila la longitud, ESI, el descriptor e hice un call a connect

aun me confundo en la posicion de las cosas, habia puesto el descriptor socket al inicio pero iba antes de connect

bueno, espero a alguien mas le ayude esto que si me costo trabajo, seguire estudiando todavia mas sobre asm

solo como ultima peticion, alguien me podria explicar bien el funcionamiento de ESI y EDI

funciona para concatenar o copiar?, por ejemplo

lo que haya en esi se concatena con edi

esi = 1
edi = 2

mov eax, edi
eax = 12

es algo asi?

se que significa source index y destination index y en este caso me ayudo como registro para salvar lo que habia en esp, pero muy bien aun no lo entiendo, podrian explicarme y si se puede con un ejemplo porfavor

gracias y salu2
88  Programación / ASM / Re: como usar estructuras en nasm? en: 18 Julio 2013, 05:16 am
hola

gracias, de hecho yo uso mas linux, pero casi todos los manuales que encuentro y que logro comprender son para masm y nasm, y la mayoria de las cosas que encuentro como ejercicios son para windows, asi que uso virtualbox con windows 7 y uso netcat como servidor para verificar con ollydbg cosas que no entiendo

pero gracias de todas formas, me sirvio mucho de ayuda, primero hare lo de la estructura como esta en la documentacion de nasm y ya cuando aprenda mas lo hare como mencionas

ahorita ya busco sobre como usar la estructura,ya que vi que usan %define sizeof(x) x %+ _size, y luego usan

struct STAT
 .st_size resd 1
endstruc


section .bss
stat      resb   sizeof(STAT)

section .text

//...........
mov eax, dword [stat + STAT.st_size]

esto es sacado de otro codigo, pero esto tambien me gustaria aprenderlo, porque no se como acceder a una estructura

bueno, cualquier modificacion o sugerencia, se los agradezco

salu2

89  Programación / ASM / Re: como usar estructuras en nasm? en: 18 Julio 2013, 03:58 am
gracias, creo entender lo del puntero hacia sockaddr_in

se reserva doble word a esp, donde en los primeros 4 words se pone el primer push y en el segundo word el segundo push

sub esp, 8
word1 -> push 0x00010000
word2 -> push 7fb82202

despues se meten los bytes de la estructura "sin_por, sin_addr", etc, llevo 2 semanas estudiando asm y todavia me confunden muchas cosas, pero me imagino que sera algo asi parecido, los push no hay problema, pero no se como reservar ese espacio en esp para meter las direcciones y llegar a la estructura

les dejo el codigo que llevo hecho, es muy novato pero es lo que he logrado hasta ahorita, si me pudieran ayudar a implementar lo de las direcciones o minimo la estructura, se los agradeceria, mientras seguire estudiando mas porque si me hace falta

Código
  1. [BITS 32]
  2.  
  3. section .data
  4.  
  5. wsdll: db 'ws2_32.dll',0
  6. wsaddr: dd '0xFFFFFFFF'
  7. Getpc: db '0xFFFFFFFF'
  8.  
  9. WStp: db 'WSAStartup',0
  10. WSaddr: dd '0xFFFFFFFF'
  11. WSD: dd 'WSADATA',0
  12. saveWSA: dd '0xFFFFFFFF'
  13. soc: db 'SOCKET',0
  14. soadd: dd '0xFFFFFFFF'
  15.  
  16. res1: db "WSAStartup %d", 10, 0
  17. res2: db "Socket %d", 10, 0
  18.  
  19. section .text
  20.  
  21. global _WinMain@16
  22. extern _ExitProcess@4
  23. extern _LoadLibraryA@4
  24. extern _GetProcAddress@8
  25. extern _printf
  26. extern _WSAStartup@8
  27.  
  28. _WinMain@16:
  29.  
  30. xor eax, eax
  31.  
  32. push wsdll
  33. call _LoadLibraryA@4
  34. mov [wsaddr], eax
  35.  
  36. push WStp
  37. push dword [wsaddr]
  38. call _GetProcAddress@8
  39. mov [Getpc], eax
  40.  
  41. push WSD
  42. push 0x202
  43. call [Getpc]
  44. mov [saveWSA], eax
  45.  
  46. cmp dword [saveWSA], -1
  47. jne mns1
  48. je erro
  49.  
  50. mns1:
  51. push dword [saveWSA]
  52. push res1
  53. call _printf
  54.  
  55. push soc
  56. push dword [wsaddr]
  57. call _GetProcAddress@8
  58. mov [Getpc], eax
  59.  
  60. push 6
  61. push 1
  62. push 2
  63. call [Getpc]
  64. mov [soadd], eax
  65.  
  66. push dword [soadd]
  67. push res2
  68. call _printf
  69.  
  70.  
  71.  
  72. erro:
  73. push 0
  74. call _ExitProcess@4
  75.  
90  Programación / ASM / Re: como usar estructuras en nasm? en: 17 Julio 2013, 17:20 pm
vi los links y lei que no era necesario usar la estructura, tan solo con poner las direcciones era mas que suficiente, entonces tuve una duda

en C para usar connect se usa

struct sockaddr_in cli;

connect(socket, (struct sockaddr*)&cli, sizeof(struct sockaddr))

en asm entonces solo tendria que poner, por ejemplo

sockaddr_in resb 16

push 0x2  -->AF_INET
push 0xb822 --> sin_port
push 0x0100007f --> sin_addr
push dword [sockaddr_in] --> sizeof(struct sockaddr_in)
push [direccion de sock] --> descriptor socket
push [direccion de connect] --> funcion connect()

asi seria entonces?, o estoy equivocado?

salu2
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 49
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines