Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Belial & Grimoire

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

Código (asm) [Seleccionar]
lea       ecx,dword ptr [ebp-400]
push      ecx
push      2
call      WSAStartup


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

Código (asm) [Seleccionar]
push      ebp
mov       ebp,esp
add       esp,-500
push      ebx

; WSAStartup(MAKEWORD(2,0),&wsaData);
  ;
lea       ecx,dword ptr [ebp-400]
push      ecx
push      2
call      WSAStartup
 


me imagino que hacer esto seria lo mismo, no?

Código (asm) [Seleccionar]
push      ebp
mov       ebp,esp
sub     esp, 500


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 (asm) [Seleccionar]
format PE console 4.0

entry start

include 'include\win32a.inc'

section '.data' data readable writable

wsadata WSADATA
saddr sockaddr_in
sock_size = $-saddr
sock dd ?
sin_addr dd ?
sin_port dd ?

section '.code' code readable executable
start:

invoke WSAStartup, 0202h, wsadata
invoke socket, AF_INET, SOCK_STREAM, 0

mov[sock], eax
mov[saddr.sin_family], AF_INET
mov[saddr.sin_port], 0xB922
mov[saddr.sin_addr], 0x0100007F

invoke connect, [sock], saddr, sock_size

invoke ExitProcess,0

section '.idata' import data readable writeable

library kernel, 'KERNEL32.DLL',\
        winsock, 'WSOCK32.DLL'

import kernel,\
       ExitProcess, 'ExitProcess'

import winsock,\
       WSAStartup, 'WSAStartup',\
       WSACleanup, 'WSACleanup',\
       socket, 'socket',\
       connect, 'connect',\
       sendto, 'sendto',\
       closesocket, 'closesocket'   


compilacion para nasm

nasm -f win32 archivo.asm
gcc archivo.obj -o archivo.exe


gracias a los dos por las respuestas

salu2
#82
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 (asm) [Seleccionar]
[BITS 32]

global _WinMain@16

section .data

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

WStp: db 'WSAStartup',0
WSaddr: dd '0xFFFFFFFF'
WSD: db 'WSADATA',0
saveWSA: dd '0xFFFFFFFF'
soc: db 'socket',0
soadd: dd '0xFFFFFFFF'
bind: db 'bind',0
binaddr: dd '0xFFFFFFFF'
lis: db 'listen',0
lisaddr: dd '0xFFFFFFFF'
accp: db 'accept',0
accaddr: dd '0xFFFFFFFF'
rec: db 'recv',0
recaddr: dd '0xFFFFFFFF'
rsocket: dd '0xFFFFFFFF'

buff: times 50 db 0

section .text

extern _ExitProcess@4
extern _LoadLibraryA@4
extern _GetProcAddress@8
extern _printf
extern _WSAStartup@8

_WinMain@16:

xor eax, eax

push wsdll
call _LoadLibraryA@4
mov [wsaddr], eax

push WStp
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

push WSD
push 0x202
call [Getpc]

push soc
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

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

push bind
push dword [wsaddr]
call _GetProcAddress@8
mov [binaddr], eax

push 0x00000000
push 0xB9220002
mov esi,esp
push byte 16
push esi
push dword[soadd]
call [binaddr]

push lis
push dword [wsaddr]
call _GetProcAddress@8
mov [lisaddr], eax

push 2
push dword[soadd]
call [lisaddr]

push accp
push dword [wsaddr]
call _GetProcAddress@8
mov [accaddr], eax

ac_acp:
push 0x00000000
push 0x00000000
mov esi, esp
push byte 16
push dword[soadd]
call [accaddr]
cmp eax, -1
je ac_acp
mov [rsocket], eax

push rec
push dword [wsaddr]
call _GetProcAddress@8
mov [recaddr], eax

loop_recv:
xor eax, eax
push 0
push 50
push buff
push dword[rsocket]
call [recaddr]
cmp eax, -1
je loop_recv

push buff
call _printf

push 0
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 (asm) [Seleccionar]
push soc
push dword [wsaddr]
call _GetProcAddress@8
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
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 (asm) [Seleccionar]
saveWSA: dd '0xFFFFFFFF'
soc: db 'socket',0
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 (asm) [Seleccionar]
mov [saveWSA], eax
cmp dword [saveWSA], -1
jne mns1
je erro

mns1:
push dword [saveWSA]
push res1
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 (asm) [Seleccionar]
saveWSA: dd '0xFFFFFFFF'
soc: db 'socket',0
soadd: dd '0xFFFFFFFF'


ya no funciona

Código (asm) [Seleccionar]

soc: db 'socket',0
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
ya lo arregle, olvide agregar a socket accept

socket = accept(socket,0, 0);
#85
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"

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

int main()
{
   WSADATA wsa;
SOCKET sock;
struct sockaddr_in cl;
int co = 0;
char buff[50];

WSAStartup(MAKEWORD(2,2), &wsa);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

cl.sin_family = AF_INET;
cl.sin_port = htons(8889);
cl.sin_addr.s_addr = INADDR_ANY;

if(bind(sock, (struct sockaddr*)&cl, sizeof(struct sockaddr)) == -1){
   printf("error bind");
}

if(listen(sock, 1) == -1){

   printf("error listen");
}

co = sizeof(struct sockaddr);

if((accept(sock, (struct sockaddr*)&cl, &co)) == -1){
       accept(sock, (struct sockaddr*)&cl, &co);

       }

recv(sock, buff, sizeof(buff), 0);
printf("%s", buff);


return 0;
}


#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

int main()
{
   WSADATA wsa;
   SOCKET fd;
   struct sockaddr_in cli;
   struct hostent* he;
   char buff[50] = "hola mundo";

   WSAStartup(MAKEWORD(2,2), &wsa);
   he = gethostbyname("127.0.0.1");
   if((fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != 0){

       printf("resultado %d", fd);
   }

   cli.sin_family = AF_INET;
   cli.sin_port = htons(8889);
   cli.sin_addr = *((struct in_addr*)he->h_addr);
   memset(cli.sin_zero, 8, 0);

   connect(fd, (struct sockaddr*)&cli, sizeof(struct sockaddr));

   send(fd, buff, strlen(buff), 0);

   return 0;
}
#86
ASM / Re: logre un socket en nasm jeje
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
ASM / logre un socket en nasm jeje
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 (asm) [Seleccionar]
[BITS 32]

section .data

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

WStp: db 'WSAStartup',0
WSaddr: dd '0xFFFFFFFF'
WSD: dd 'WSADATA',0
saveWSA: dd '0xFFFFFFFF'
soc: db 'socket',0
soadd: dd '0xFFFFFFFF'
conn: db 'connect', 0
conaddr: dd '0xFFFFFFFF'
sen: db 'send', 0
sendadd: dd '0xFFFFFFFF'

res1: db "WSAStartup %d", 10, 0
res2: db "Socket %d", 10, 0
res3: db "connect %d", 10, 0
res4: db "send %d", 10 ,0

sre: db "hola mundo",0

section .bss
sn resb 10

section .text

global _WinMain@16
extern _ExitProcess@4
extern _LoadLibraryA@4
extern _GetProcAddress@8
extern _printf
extern _WSAStartup@8

_WinMain@16:

xor eax, eax

push wsdll
call _LoadLibraryA@4
mov [wsaddr], eax

push WStp
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

push WSD
push 0x202
call [Getpc]
mov [saveWSA], eax

cmp dword [saveWSA], -1
jne mns1
je erro

mns1:
push dword [saveWSA]
push res1
call _printf

push soc
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

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

push dword [soadd]
push res2
call _printf

push conn
push dword [wsaddr]
call _GetProcAddress@8
mov [conaddr], eax

push dword [conaddr]
push res3
call _printf

push 0x0100007F
push 0xB9220002
mov esi, esp
push byte 16
push esi
push dword [soadd]
call [conaddr]

erro:
push 0
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
ASM / Re: como usar estructuras en nasm?
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
ASM / Re: como usar estructuras en nasm?
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 (asm) [Seleccionar]
[BITS 32]

section .data

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

WStp: db 'WSAStartup',0
WSaddr: dd '0xFFFFFFFF'
WSD: dd 'WSADATA',0
saveWSA: dd '0xFFFFFFFF'
soc: db 'SOCKET',0
soadd: dd '0xFFFFFFFF'

res1: db "WSAStartup %d", 10, 0
res2: db "Socket %d", 10, 0

section .text

global _WinMain@16
extern _ExitProcess@4
extern _LoadLibraryA@4
extern _GetProcAddress@8
extern _printf
extern _WSAStartup@8

_WinMain@16:

xor eax, eax

push wsdll
call _LoadLibraryA@4
mov [wsaddr], eax

push WStp
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

push WSD
push 0x202
call [Getpc]
mov [saveWSA], eax

cmp dword [saveWSA], -1
jne mns1
je erro

mns1:
push dword [saveWSA]
push res1
call _printf

push soc
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

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

push dword [soadd]
push res2
call _printf



erro:
push 0
call _ExitProcess@4
#90
ASM / Re: como usar estructuras en nasm?
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