Porqué preferimos las pitones a los camellos o los rubís. Cuestión de gustos, no os enfadéis!
Avatar de Usuario
newlog
El Eterno Alumno
 
Mensajes: 170
Registrado: Lun Jun 23, 2008 7:28 pm

Taller de Python: Otra excusa para programar a bajo nivel

por newlog Mar Sep 13, 2011 5:04 am

Descripción del taller


Sí, sé que a primera vista el título no tiene ningún sentido, pero confiad en mi...

En este taller voy a intentar llevar una especie de log sobre lo que voy aprendiendo del libro Gray Hat Python, además de todos los añadidos que pueda/podamos ir introduciendo. Así que espero que su autor, Justin Seitz, no me denuncie por plagio :twisted: Se supone un conocimiento 0 sobre Python, o sea, el mismo que el mio en estos momentos. La realización de este taller nos permitirá ir aprendiendo a todos, y a mi me permitirá utilizar ctrl+f en vez de tener que ir buscando por todo el libro ;)

Aun así, como gente inteligente que somos, imagino que no es necesario explicar las estructuras de control más básicas de Python (bucles, condiciones, etc) y simplemente irlas aprendiendo a medida que las veamos.

Decir que el libro es totalmente recomendable y que yo voy a pasar por alto muchos de los conocimientos que en él se explican, así que si queréis ir a fondo ya sea con Python o con temas de bajo nivel, a él os remito. Estoy seguro que a la mayoría se os hará la boca agua con la tabla de contenidos. Para los que no tengáis ni papa de inglés, pues os tendréis que conformar con esto ;)

Hasta la próxima.
Imagen
Avatar de Usuario
newlog
El Eterno Alumno
 
Mensajes: 170
Registrado: Lun Jun 23, 2008 7:28 pm

Re: Python a bajo nivel

por newlog Mar Sep 13, 2011 5:06 am

Primera Entrega


  • Instalación del entorno de programacion

Bueno, ahora voy a volver a suponer que somos suficientemente inteligentes como para saltarnos este apartado. Simplemente diré que para todo el taller voy a utilizar Python 2.7 y además utilizaré Eclipse como IDE. Si queréis utilizar Eclipse como IDE necesitaréis instalar pyDev. Lo podéis hacer fácilmente instalando el software a través del propio Eclipse. En fin, una simple búsqueda en Google os dará las respuestas que necesitéis.

Por último, esto a veces no se comenta, pero una vez lo tengáis todo instalado, en Eclipse se deberá elegir como 'Interpreter' el binario de python (python.exe) ahí donde hayáis instalado Python. Esto lo tenéis que especificar en las propiedades del plugin pyDev. Buscad, buscad...

Comentar también que durante todo este taller se va a utilizar como sistema operativo un Windows 7. De este modo se podrán explicar conceptos como API Hooking o DLL injections.

  • Breve introducción a la estructura de Python

Antes de avanzar un poco más, sí que vamos a ver qué pinta tiene un script en Python.
Python es un lenguaje de programación orientado a objetos, sin embargo, como se ve a continuación, no es necesaria la creación explícita de clases.
Código: Seleccionar todo
name = raw_input("Hello, python newbie, what\'s your name?\n")

print "Hiyo, " + name + "!"


Si ejecutáis este script veréis que simplemente escribe la primera línea, y os pide un un nombre. Una vez lo escribáis os contestará con vuestro nombre. Así de simple. Recordad que si ejecutáis el script desde la línea de comandos (cmd.exe) necesitaréis guardar como variable de entorno la ruta donde hayáis instalado Python y donde se encuentre el ejecutable python.exe.

También nos podemos encontrar con cosas un poco más complejas como:
Código: Seleccionar todo
# HelloWorld.py file
def function():
    name = raw_input("Hello, I\'m a python newbie, what\'s your name?\n")
    print "Hiyo, " + name + "!"

if __name__ == '__main__':
    function()
else:
    print "The code is imported."


Con este código se ha definido una función llamada 'function'. Si ejecutáis el código veréis que pasa exactamente lo mismo que antes. Entonces, para qué sirve ese 'if' tan molón de ahí? Simplemente sirve para saber si el script se está ejecutando propiamente, o sea, con un 'python HelloWorld.py' o si el script ha sido importado.

Con el siguiente código se puede ver la utilidad de ese 'if':
Código: Seleccionar todo
# Principal.py file
import HelloWorld

if __name__ == '__main__':
    print "El script Principal.py se esta ejecutando como archivo principal.\n"
    HelloWorld.function()


Al ejecutarlo se obtiene:
The code is imported.
El script Principal.py se esta ejecutando como archivo principal.

Hello, I'm a python newbie, what's your name?
Newlog
Hiyo, Newlog!


Cómo se puede ver, se imprime la línea 'The code is imported.' lo que significa que el código del 'else' del script HelloWorld.py se ha ejecutado. Esto significa que cuando en el 'if' del HelloWorld.py se ha evaluado, la variable interna __name__ era diferente a '__main__'. Esto es muy útil para importar scripts en vuestros proyectos y a la vez, poder provar esos scripts importados. Para más información sobre el tema, StackOverflow.

Por último, también se pueden encontrar scripts en Python que sí están implementados como clases:
Código: Seleccionar todo
class MyClass(object):
    '''
    classdocs
    '''


    def __init__(self):
        '''
        Constructor
        '''
       


Alé, plantilla de Eclipse al canto. Con esto espero que ya os hagáis una idea. Almenos, yo me la hago ;)

Una última cosa, si queréis escribir cadenas por pantalla como gente de bien, o sea, acentos incluidos, basta con añadir la siguiente línea al principio de vuestro script.
Código: Seleccionar todo
# coding: utf-8



  • Utilizando las funciones de C con Python

Según mi punto de vista, esta característica hace que un ''''simple'''' lenguaje de scripting se convierta en una bestia parda! Imagino que la mayoría de vosotros os preguntaréis ¿Para qué quiero yo funciones en C si estoy aprendiendo Python? Lo cierto es que muy desencaminados no vais, pero también es cierto que si quisierais aprender Python de un modo convencional, no lo estarías aprendiendo en una comunidad dedicada al exploiting, así que dejad de dudar y fluid conmigo!

Lo cierto es que poder utilizar funciones en C, nos permite realizar todo tipo de acciones a nivel de sistema. Cosas como lanzar procesos, 'engancharnos' a procesos en ejecución, realizar inyecciones DLL, etc. Básicamente podremos ejecutar cualquier función que nos brinde el sistema operativo.

Para nuestro propósito utilizaremos la librería ctypes. Para conocer todos sus oscuros secretos podéis visitar el enlace a la página de ctypes. Yo voy a ir a saco sin entrar en todas sus posibilidades, ni en los diferentes modos de cargar las librerías del sistema operativo, etc. Vamos a ir a lo interesante, aprendiendo de cada ejemplo.

Código: Seleccionar todo
# coding: utf-8
from ctypes import *

c_runtime = cdll.msvcrt

cadena = "Feliz día del programador. 13 de Septiembre."
c_runtime.printf("%s\n", cadena)


Con la primera línea se obtiene un objeto con el que poder invocar todas las funciones de la librería de C en Windows. Esto son funciones como printf(), memcpy(), etc.
Como se puede comprobar una vez ejecutado el script, el printf se ejecuta sin problemas y nos muestra por pantalla la cadena.

Bueno, por hoy ya hay suficiente que estoy cansado y ya son las tres de la noche! Espero que esto os haya abierto el apetito a Python.

En la próxima entrega entraré más a fondo en el uso de la librería ctypes y cómo se pueden ejecutar cosas útiles con ella. Para ello deberemos pelearnos un poco con estructuras de datos y tipos de variables. Sí, yo también espero que sea breve ;)

Saludos.
Imagen
Volver a Python

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado