Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: xv0 en 16 Mayo 2013, 15:17 pm



Título: Puertos I/O
Publicado por: xv0 en 16 Mayo 2013, 15:17 pm
Hola

Citar
it0 at isa0 port 0x2e/2: IT8720F rev 8, EC port 0x228

Es el sensor de temperatura.

Tengo el siguiente código:

Código
  1. movb $0x2e, %dl ; movw $0x228, %dx
  2. in %dx, %eax

El resultado es un core dumped, que estoy haciendo mal?

Un saludo.



Título: Re: Puertos I/O
Publicado por: Eternal Idol en 17 Mayo 2013, 20:07 pm
No tenes permisos, usa ioperm antes.


Título: Re: Puertos I/O
Publicado por: 0xDani en 18 Mayo 2013, 15:36 pm
Además necesitarás darle permisos al proceso.

Saludos.


Título: Re: Puertos I/O
Publicado por: xv0 en 18 Mayo 2013, 17:40 pm
Estoy utilizando openbsd, la función ioperm solo esta disponible en la arquitectura alpha, hay otra función llamada i386_set_ioperm, pero nada para la amd64.

¿Qué puedo hacer?

Un saludo.

P.D: Probaré esa función en un i386 que tengo, ya os contaré como fue.


Título: Re: Puertos I/O
Publicado por: xv0 en 23 Mayo 2013, 20:12 pm
Cuando compilo me dice que no encuentra referencia ala función.

Código:
http://www.openbsd.org/cgi-bin/man.cgi?query=i386_set_ioperm&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html

Incluyo todas la librerias y al compilar ese -li386.

¿Por qué root no puede acceder a los puertos directamente, sin utilizar esas funciones?

Un saludo.


Título: Re: Puertos I/O
Publicado por: Arkangel_0x7C5 en 24 Mayo 2013, 19:06 pm
Porque es parte de la proteccion de los niveles de ejecucion (Modo usuario y modo kernel)
Tendrias que darle permisos al proceso para poder usar los puertos I/O

Saludos


Título: Re: Puertos I/O
Publicado por: xv0 en 26 Mayo 2013, 01:20 am
Gracias por las respuestas, pero no puedo hacer nada porque no dispongo de ioperm.

Un saludo.


Título: Re: Puertos I/O
Publicado por: xv0 en 6 Junio 2013, 03:49 am
Estoy intentando darle permisos desde ASM, leyendo los manuales me estoy enterando un poco de que va el tema, pero no hay manera de que funcione.

Tengo que tener CPL en 0 para poder acceder a la flag IOPL, con las instrucciones popf y iret, iret no funciona, y acceder ala base TSS que nose como acceder.

No encuentro ningun código ni nada, la verdad es que un ejemplo me ayudaría.
Por cierto estoy en long mode, el manual casi todo lo que dice es para virtual-8086.

Un saludo.

P.D: Perdón por el doble post.



Título: Re: Puertos I/O
Publicado por: Arkangel_0x7C5 en 6 Junio 2013, 16:54 pm
lo primero, estas en modo kernel o ring0? si no lo estas, no vas a poder tocar nada de eso en asm

Saludos


Título: Re: Puertos I/O
Publicado por: xv0 en 6 Junio 2013, 19:46 pm
No, estoy en mode long.

Por lo que dices tengo que entrar en modo kernel, pero como?
Al igual que in y out ese iret tampoco puedo ejecutarlo, sera por los permisos.

Pero ahora tambien tengo otra duda, como se accede a la base TSS?

Un saludo.


Título: Re: Puertos I/O
Publicado por: Arkangel_0x7C5 en 6 Junio 2013, 23:41 pm
la direccion de los TSS se encuentra en la GDT que se obtiene con la instruccion SGDT.

Te explico, si estas arrancando bajo el SO. el procesador tiene varios modos de ejecucion a parte de los de modo largo y demas. Se les llama anillos de ejecucion. cuando arrancas estas en el anillo 0 (Modo Kernel) en el que puedes ejecutar todas las instrucciones que quieras. pero al cargar el SO carga las aplicaciones en el anillo 3 (Modo Usuario) que es el que menos permisos de ejecucion tiene

Saludos


Título: Re: Puertos I/O
Publicado por: xv0 en 7 Junio 2013, 06:12 am
Vale, no puedo ejecutar esas instrucciones porque al comparar CPL dice que estoy en el anillo 3.
Así que no puedo hacer nada?

Pero ensamblando el código y hacer un módulo y compilarlo junto al kernel, no tendría que dar problemas no?
No tendría que añadir nada más solo el in?

Un saludo.


Título: Re: Puertos I/O
Publicado por: Eternal Idol en 7 Junio 2013, 21:10 pm
¿Probaste el primer resultado de openbsd ioperm en Google?

http://wiki.gudinna.com/200



Título: Re: Puertos I/O
Publicado por: 0xDani en 7 Junio 2013, 22:32 pm
¿Probaste el primer resultado de openbsd ioperm en Google?

http://wiki.gudinna.com/200



Ese código parece hacer referencia a llamadas específicas de la arquitectura i386; y él ya dijo que estaba usando un amd64 y no encontraba una equivalente para esta arquitectura.

Saludos.


Título: Re: Puertos I/O
Publicado por: Eternal Idol en 8 Junio 2013, 14:20 pm
Ese código parece hacer referencia a llamadas específicas de la arquitectura i386; y él ya dijo que estaba usando un amd64 y no encontraba una equivalente para esta arquitectura.

Saludos.

P.D: Probaré esa función en un i386 que tengo, ya os contaré como fue.

Por cierto, si no hay equivalente por algo sera.


Título: Re: Puertos I/O
Publicado por: xv0 en 9 Junio 2013, 02:55 am
Por cierto, si no hay equivalente por algo sera.

Exacto, hay esta el problema con la amd64.

Código:
http://old.nabble.com/remove-amd64-ioperm-td35476935.html

¿Probaste el primer resultado de openbsd ioperm en Google?

Quiero implementarlo en ASM, no quiero funciones escritas en C.

Del manual de AMD:

Citar
If the CPL is higher than IOPL, or the mode is virtual mode, IN checks the I/O permission bitmap in
the TSS before allowing access to the I/O port.

Si estoy en modo usuario, anillo 3, CPL es mayor que IOPL y por eso no tengo permisos para acceder al puerto, para eso tengo que utilizar ese bitmap del que habla el manual?
Al estar en modo kernel anillo 0, CPL no sería mayor que IOPL y tendría acceso a los puertos sin la necesidad de chequear el bitmap permission?

Un saludo y gracias a todos por el interés.


Título: Re: Puertos I/O
Publicado por: Eternal Idol en 9 Junio 2013, 11:29 am
Quiero implementarlo en ASM, no quiero funciones escritas en C.

Eso no representa ningun problema, desensambla el resultado en C y listo. Lo unico que hace es llamar a un servicio y seguramente es un int 0x80, un syscall/sysenter o lo que sea.

Si estoy en modo usuario, anillo 3, CPL es mayor que IOPL y por eso no tengo permisos para acceder al puerto, para eso tengo que utilizar ese bitmap del que habla el manual?
Al estar en modo kernel anillo 0, CPL no sería mayor que IOPL y tendría acceso a los puertos sin la necesidad de chequear el bitmap permission?

Un saludo y gracias a todos por el interés.


¿No hay otro servicio para obtener este dato? De ser asi yo que vos haria el parche, un modulo de modo Kernel no es un programa, es otro paradigma diferente.


Título: Re: Puertos I/O
Publicado por: xv0 en 9 Junio 2013, 23:44 pm
Eso no representa ningun problema, desensambla el resultado en C y listo. Lo unico que hace es llamar a un servicio y seguramente es un int 0x80, un syscall/sysenter o lo que sea.

Ya no puedo usar ioperm, fue eliminado de la arquitectura amd64.

¿No hay otro servicio para obtener este dato? De ser asi yo que vos haria el parche, un modulo de modo Kernel no es un programa, es otro paradigma diferente.

Creo que no, si estoy en ring 3 tendré que acceder a ese bitmap tal y como dice el manual.

Un saludo.


Título: Re: Puertos I/O
Publicado por: Eternal Idol en 10 Junio 2013, 10:28 am
Ya no puedo usar ioperm, fue eliminado de la arquitectura amd64.

Por logica no es una buena idea que programas de modo Usuario accedan al hardware directamente, eso se hacia en la epoca en que no habia multitarea y la sincronizacion no era lo que es ahora. Es una lastima que no hayas dicho que pretendes hacer EXACTAMENTE desde el primer mensaje del hilo. ¿Es una prueba? ¿Es solo por verlo funcionar? ¿O prentedes hacer un software que se ejecute en produccion? Desde que mencionaste el parche asumo que es lo primero y para eso hacerlo en x86 es suficiente ... aunque tal vez lo queres para tu propio uso nada mas ... vaya uno a saber.

Creo que no, si estoy en ring 3 tendré que acceder a ese bitmap tal y como dice el manual.

Justamente si estas en modo Usuario no podes acceder, la gracia esta en que solo se puede acceder desde modo Kernel, asi es como se implementa la proteccion.


Título: Re: Puertos I/O
Publicado por: xv0 en 11 Junio 2013, 00:04 am
Por logica no es una buena idea que programas de modo Usuario accedan al hardware directamente, eso se hacia en la epoca en que no habia multitarea y la sincronizacion no era lo que es ahora. Es una lastima que no hayas dicho que pretendes hacer EXACTAMENTE desde el primer mensaje del hilo. ¿Es una prueba? ¿Es solo por verlo funcionar? ¿O prentedes hacer un software que se ejecute en produccion? Desde que mencionaste el parche asumo que es lo primero y para eso hacerlo en x86 es suficiente ... aunque tal vez lo queres para tu propio uso nada mas ... vaya uno a saber.

Es un poco de todo, el código del primer mensaje del hilo no es más que una prueba, queria obtener la temperatura sin tener que utilizar systat sensors ni ninguna función escrita en C o interrupción, un ASM puro.

Las funciones como scanf o commandos como systat sensors, en algún momento tendrán que comunicarse con los puertos i/o, bueno más bien el núcleo, scanf con el teclado que es el predeterminado y systat sensors con el sensor de temperatura, mi idea era hacer mis propias funciones a medida de mi avancé.

Pero no puedo utilizar ese ioperm no fue implementado en amd64, no lo quiero hacer en el x86, esa funcion si puede dar permisos y yo desde ASM no, pues vaya.

Justamente si estas en modo Usuario no podes acceder, la gracia esta en que solo se puede acceder desde modo Kernel, asi es como se implementa la proteccion.

Si, tienes razón ya me he dado cuenta, ya se donde esta el I/O permission bitmap se encuentra en la TSS en el registro TR, devuelve 16 bytes, obtienes la dirección con la instrucción ltr:

Código
  1. pushq %rax
  2. pushq %rax
  3. movq %rsp, %rdi
  4. ltr (%rdi)

Ahora en teoria tendría que tocar el bitmap y volver a cargarlo en el registro TR.
Pero el resultado es un Bus error (core dumped) que hace referencia a la dirección de ltr. Bueno el manual lo deja bien claro.

Citar
This instruction must be executed in protected mode when the current privilege level is 0. It is only
provided for use by operating system software.

Así que la única forma de poder hacer lo que pretendo es en ring 0, o de un ioperm que no dispongo?

Un saludo.



Título: Re: Puertos I/O
Publicado por: Eternal Idol en 11 Junio 2013, 16:28 pm
Creo que la clave esta en que programar en assembly no implica que puedas acceder al hardware, un programa de modo Usuario en C puede hacer exactamente lo mismo que uno en assembly.

Y si, al final de cuentas para hacer algo asi correctamente tenes que hacerlo en modo Kernel, incluso aunque tuvieras disponible ioperm para mi no es mas que un hack.


Título: Re: Puertos I/O
Publicado por: xv0 en 12 Junio 2013, 18:47 pm
Tenia pensado hacer algo en el núcleo, pero las pruebas pfff, bueno ya vere que pienso porque ahora mismo estoy en blanco.

Un saludo y gracias por el tiempo a todos.


Título: Re: Puertos I/O
Publicado por: xv0 en 20 Junio 2013, 00:52 am
Ya he realizado algunas pruebas, no fue en el núcleo si no en el boot del sistema.

Modifiqué el código del boot de esta forma.

Código
  1. asm ( "xorl %eax, %eax\n\t"
  2.      "in $0x60, %eax\n\t"
  3.      "movl %eax, 0x4b659" );

Luego los imprimo en pantalla con un printf, pero el carácter no es el correcto, si no tecleo nada es una z, si es una b = 0, c = . y  la h = #, no lo entiendo de el todo, pero el fragmento de código funciona bien pero no son los carácteres indicados.

Y sobre el puerto del sensor obtengo lo siguiente 0xe0000000, que no es el valor correcto. Bueno que opinan.

Un saludo.

P.D: Siento el doble post.


Título: Re: Puertos I/O
Publicado por: lucaslopez0000 en 20 Junio 2013, 11:35 am
Aunque soy nuevo con el asm , si que conozco bien el lenguaje C. ¿ Intentas manejar el puerto paralelo , verdad ? El puerto paralelo no suele ser 278 decimal , sino 378 hexadecimal o 278 hexadecimal. La verdad que lo de los permisos aunque sea bueno para la seguridad es un horror para este tipo de cosas. Yo en mi caso con lo nuevo que soy con el asm creo un binario puro sin llamadas al sistema y lo emulo con qemu
creo que en asm existe una instruccion llamada out , para el tema de los puertos , echale un vistazo ;)


Título: Re: Puertos I/O
Publicado por: xv0 en 20 Junio 2013, 13:11 pm
El puerto paralelo no suele ser 278 decimal , sino 378 hexadecimal o 278 hexadecimal.

Eso pensé yo ayer despúes de un rato de a ver escrito el anterior mensaje, he estado mirando la tabla extendida ascii y los valores que muestra ese printf no aparecen.

1 = una cara sonriente, 2 = corazón, 3 = diamante, 4 = trébol, 5 = pica.

Conclusión: Pokerstarts  ::).

No ahora enserio, que tabla ascii utiliza y donde le puedo echar un ojo?

Yo en mi caso con lo nuevo que soy con el asm creo un binario puro sin llamadas al sistema y lo emulo con qemu

Curioso, que traduces el opcode a binario no?

Código
  1. incl %eax   ; 0xffc0 1111111111000000
  2. syscall     ; 0x0f05 0000111100000101

creo que en asm existe una instruccion llamada out , para el tema de los puertos , echale un vistazo ;)

Si, pero de momento no quiero enviar nada a los puertos.

Un saludo.


Título: Re: Puertos I/O
Publicado por: 0xDani en 20 Junio 2013, 16:31 pm
@cpu2, si lees del puerto del teclado directamente te devolverá un keycode, lógico que no te devuelva un código ASCII. Busca cómo puedes hacer esta conversión.

Saludos.


Título: Re: Puertos I/O
Publicado por: xv0 en 20 Junio 2013, 19:28 pm
Exacto eso era Dani, he comparado los keycode y son los correctos.

Esta claro que el teclado tiene que ser uno de los dispositivos más simples que hay, sguiré investigando a ver si soy capaz de controlar dispositivos más complejos como puede ser el ethernet, pero eso ya es otra cuestión y tiene que ir en otro hilo.

Doy el tema por resuelto, gracias a todos por vuestro tiempo.

Un saludo.

P.D: Dani que paso con FreeBSD?


Título: Re: Puertos I/O
Publicado por: 0xDani en 21 Junio 2013, 16:00 pm
P.D: Dani que paso con FreeBSD?

Lo estuve intentando, pero tuve un montón de problemas y no pude instalarlo :'(