hola
alguien me puede decir como usar estructuras en nasm?, lo que estoy tratando de programar es un socket en asm, pero no se como colocar la estructura sockaddr_in en nasm para usar los parametros de .sin_family, .sin_port, etc
Hola
Explique eso mismo a unos usuarios.
http://foro.elhacker.net/asm/principio_de_troyano_asm-t390224.0.html
http://foro.elhacker.net/asm/solucionadoproblema_con_api_accept_winsock-t389993.0.html
Un saludo.
ok gracias por los link, ahorita los checo
solo una pregunta, sabes como iniciar la estructura en nasm? porque veo que lo hacen asi en fasm
sa sockaddr_in <>
pero es lo mismo para nasm?
gracias nuevamente
salu2
http://www.nasm.us/doc/nasmdoc4.html
Sección 4.12.10, hay está todo sobre las estructuras en NASM.
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
https://jakash3.wordpress.com/2011/01/15/assembly-socket-example/
Está con sintaxis AT&T, espero que no tengas problema.
Cita de: Belial & Grimoire 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
Si, estas equivocado, ese procedimiento se lo explique al usuario de algunos de esos links, una estructura no es mas que otro puntero, es lo mismo en nasm, fasm o gas, mira te dejo un ejemplo.
AT&T espero que no tengas problemas, estructura sacada del MSDN.
subl $0x8, %esp
pushl $0x00010000
pushl $0x7fb82202
Ahora esp apunta a la estructura sockaddr_in, y lo siguente es cargar los parametros, como estas haciendo, pero de esa forma estabas dejando bytes nulos la estructura estaba mal. Y estaba al reves.
Un saludo.
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
[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
Cita de: Belial & Grimoire en 18 Julio 2013, 03:58 AMse 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
No, subl $0x8, %esp reserva ocho byte, que son el mienbro sin_zero de la estructura sockaddr_in. Los push lo que hacen es decrementar cuatro byte y luego copia el valor que le pasaste como argumento. Pero tambien podrias reservar siete byte, ya que el cero del primer push cuenta. Y tendrias los quince byte que son la estrucutra sockaddr_in.
En la memoria con mi ejemplo tendrias esto cargado. Son dieciseis byte, el ultimo cero se ignora ya que son quince la estructura.
0x0000000000000000000100007fb82202
El segundo push seria el principio.
Cita de: Belial & Grimoire en 18 Julio 2013, 03:58 AMdespues se meten los bytes de la estructura "sin_por, sin_addr"
Te olvidas de sin_family es el 02 del segundo push.
Sobre el codigo, no programo en Windows, pero podrias hacer un socket y connect y dejar por ejemplo netcat ala escucha, no te lies tanto.
Un saludo.
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
Si quieres un ejemplo en linux dimelo, no me cuesta nada, la maquina de linux y el sistema es de 64 bits? Tambien tienes que decirme el valor de las syscalls socket y connect de tu nucleo, ya que el nucleo de linux cambia cada dos por tres y los valores de las syscall tambien.
Un saludo.