Blog de Eliseo Ortiz Valdez
tutoriales
Libro “Integrando AJAX & PHP” a la venta
17 Mar
El objetivo de dicha edición es:
Proveer las herramientas necesarias para que el profesional desarrolle o integre aplicaciones web de segunda generación, conocidas como web 2.0. Con ayuda de lenguaje de programación PHP en la parte de servidor y AJAX em la generación de Aplicaciones Ricas para la Internet (RIA).
Trucos de compilación con GCC Parte I
19 Oct
En un post anterior mostramos como obtener el bytecode a partir de un código en C.
Ahora mostraremos diversas cualidades de GCC que explotaremos para generar el código máquina, código objeto y código ejecutable.
El programa que se utilizaré para los fines prácticos es el siguiente, que llamaremos shellcode.c:
#include int main(void){ char *arg[2]; arg[0] = "/bin/sh"; arg[1] = NULL; execve("/bin/sh", arg, NULL); } |
Para compilar el código anterior basta con realizar lo siguiente:
$gcc -o shellcode -ggdb -static shellcode.c
La bandera -ggdb produce información de depuración usada por GDB.
Si deseamos el código ensamblador ejecutamos las siguientes directrices con gcc:
$gcc -S -o shellcode.s shellcode.c
Para obtener el “código binario” a partir del código ensamblador:
Para caso de FreeBSD:
$nasm -f aoutb shellcode.asm
Para el caso de linux:
$nasm -f elf shellcode.asm
Para el caso de Mac OS X:
$as -o shellcode.o shellcode.s
Del código binario a código ejecutable:
Para el caso de linux:
$ld -s -o shellcode shellcode.o
Para el caso de Mac OS X:
$gcc -o shellcode shellcode.o
Para observar el código máquina y ensamblador de un ejecutable:
$objdump -d shellcode
Para el caso de Mac OS X será necesario tener instalado binutils, si este no se encuentra instalado,
es posible utilizar darwin port para esto, ejecutando lo siguiente:
$sudo port install binutils
A continuación la salida del comando anterior ejecutado:
shellcode: file format elf32-i386 Disassembly of section .init: 08048250 <_init>: 8048250: 55 push %ebp 8048251: 89 e5 mov %esp,%ebp 8048253: 83 ec 08 sub $0x8,%esp 8048256: e8 79 00 00 00 call 80482d4 804825b: e8 00 01 00 00 call 8048360 8048260: e8 eb 01 00 00 call 8048450 <__do_global_ctors_aux> 8048265: c9 leave 8048266: c3 ret Disassembly of section .plt: 08048268 <__gmon_start__@plt-0x10>: 8048268: ff 35 90 95 04 08 pushl 0x8049590 804826e: ff 25 94 95 04 08 jmp *0x8049594 8048274: 00 00 add %al,(%eax) ... 08048278 <__gmon_start__@plt>: 8048278: ff 25 98 95 04 08 jmp *0x8049598 04827e: 68 00 00 00 00 push $0x0 8048283: e9 e0 ff ff ff jmp 8048268 <_init+0x18> 08048288 <__libc_start_main@plt>: 8048288: ff 25 9c 95 04 08 jmp *0x804959c 804828e: 68 08 00 00 00 push $0x8 8048293: e9 d0 ff ff ff jmp 8048268 <_init+0x18> 08048298 : 8048298: ff 25 a0 95 04 08 jmp *0x80495a0 804829e: 68 10 00 00 00 push $0x10 80482a3: e9 c0 ff ff ff jmp 8048268 <_init+0x18> Disassembly of section .text: 080482b0 <_start>: 80482b0: 31 ed xor %ebp,%ebp 80482b2: 5e pop %esi 80482b3: 89 e1 mov %esp,%ecx 80482b5: 83 e4 f0 and $0xfffffff0,%esp 80482b8: 50 push %eax 80482b9: 54 push %esp 80482ba: 52 push %edx 80482bb: 68 d0 83 04 08 push $0x80483d0 80482c0: 68 e0 83 04 08 push $0x80483e0 80482c5: 51 push %ecx 80482c6: 56 push %esi 80482c7: 68 84 83 04 08 push $0x8048384 80482cc: e8 b7 ff ff ff call 8048288 <__libc_start_main@plt> 80482d1: f4 hlt 80482d2: 90 nop 80482d3: 90 nop 080482d4 : 80482d4: 55 push %ebp 80482d5: 89 e5 mov %esp,%ebp 80482d7: 53 push %ebx 80482d8: 83 ec 04 sub $0x4,%esp 80482db: e8 00 00 00 00 call 80482e0 80482e0: 5b pop %ebx 80482e1: 81 c3 ac 12 00 00 add $0x12ac,%ebx 80482e7: 8b 93 fc ff ff ff mov 0xfffffffc(%ebx),%edx 80482ed: 85 d2 test %edx,%edx 80482ef: 74 05 je 80482f6 80482f1: e8 82 ff ff ff call 8048278 <__gmon_start__@plt> 80482f6: 58 pop %eax 80482f7: 5b pop %ebx 80482f8: c9 leave 80482f9: c3 ret 80482fa: 90 nop 80482fb: 90 nop 80482fc: 90 nop 80482fd: 90 nop 80482fe: 90 nop 80482ff: 90 nop 08048300 <__do_global_dtors_aux>: 8048300: 55 push %ebp 8048301: 89 e5 mov %esp,%ebp 8048303: 53 push %ebx 8048304: 83 ec 04 sub $0x4,%esp 8048307: 80 3d ac 95 04 08 00 cmpb $0x0,0x80495ac 804830e: 75 3f jne 804834f <__do_global_dtors_aux+0x4f> 8048310: b8 b8 94 04 08 mov $0x80494b8,%eax 8048315: 2d b4 94 04 08 sub $0x80494b4,%eax 804831a: c1 f8 02 sar $0x2,%eax 804831d: 8d 58 ff lea 0xffffffff(%eax),%ebx 8048320: a1 a8 95 04 08 mov 0x80495a8,%eax 8048325: 39 c3 cmp %eax,%ebx 8048327: 76 1f jbe 8048348 <__do_global_dtors_aux+0x48> 8048329: 8d b4 26 00 00 00 00 lea 0x0(%esi),%esi 8048330: 83 c0 01 add $0x1,%eax 8048333: a3 a8 95 04 08 mov %eax,0x80495a8 8048338: ff 14 85 b4 94 04 08 call *0x80494b4(,%eax,4) 804833f: a1 a8 95 04 08 mov 0x80495a8,%eax 8048344: 39 c3 cmp %eax,%ebx 8048346: 77 e8 ja 8048330 <__do_global_dtors_aux+0x30> 8048348: c6 05 ac 95 04 08 01 movb $0x1,0x80495ac 804834f: 83 c4 04 add $0x4,%esp 8048352: 5b pop %ebx 8048353: 5d pop %ebp 8048354: c3 ret 8048355: 8d 74 26 00 lea 0x0(%esi),%esi 8048359: 8d bc 27 00 00 00 00 lea 0x0(%edi),%edi 08048360 : 8048360: 55 push %ebp 8048361: 89 e5 mov %esp,%ebp 8048363: 83 ec 08 sub $0x8,%esp 8048366: a1 bc 94 04 08 mov 0x80494bc,%eax 804836b: 85 c0 test %eax,%eax 804836d: 74 12 je 8048381 804836f: b8 00 00 00 00 mov $0x0,%eax 8048374: 85 c0 test %eax,%eax 8048376: 74 09 je 8048381 8048378: c7 04 24 bc 94 04 08 movl $0x80494bc,(%esp) 804837f: ff d0 call *%eax 8048381: c9 leave 8048382: c3 ret 8048383: 90 nop 08048384 : 8048384: 8d 4c 24 04 lea 0x4(%esp),%ecx 8048388: 83 e4 f0 and $0xfffffff0,%esp 804838b: ff 71 fc pushl 0xfffffffc(%ecx) 804838e: 55 push %ebp 804838f: 89 e5 mov %esp,%ebp 8048391: 51 push %ecx 8048392: 83 ec 24 sub $0x24,%esp 8048395: c7 45 f4 a0 84 04 08 movl $0x80484a0,0xfffffff4(%ebp) 804839c: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp) 80483a3: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) 80483aa: 00 80483ab: 8d 45 f4 lea 0xfffffff4(%ebp),%eax 80483ae: 89 44 24 04 mov %eax,0x4(%esp) 80483b2: c7 04 24 a0 84 04 08 movl $0x80484a0,(%esp) 80483b9: e8 da fe ff ff call 8048298 80483be: 83 c4 24 add $0x24,%esp 80483c1: 59 pop %ecx 80483c2: 5d pop %ebp 80483c3: 8d 61 fc lea 0xfffffffc(%ecx),%esp 80483c6: c3 ret 80483c7: 90 nop 80483c8: 90 nop 80483c9: 90 nop 80483ca: 90 nop 80483cb: 90 nop 80483cc: 90 nop 80483cd: 90 nop 80483ce: 90 nop 80483cf: 90 nop .... |
Fuentes:
http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/
http://developer.apple.com/mac/library/documentation/DeveloperTools/Reference/Assembler/000-Introduction/introduction.html
Apache 2+CentOS 5.3+Firebird+MySQL+PHP
27 Apr
Aquí muestro los pasos a seguir para realizar configuración de Centos 5.3 + Apache 2 + Interbase + MySQL
1. Descargamos los paquetes fuentes de Apache, PHP, Firebird.
Escojamos el mirror que mas os convenga..
Apache:
http://www.apache.org/dyn/closer.cgi
PHP:
http://mx2.php.net/get/php-5.2.9.tar.gz/from/a/mirror
Firebird:
Nota.- Se recomienda para Linux, bajar la versión Super Server..
http://www.firebirdsql.org/index.php?op=files&id=engine_203
El paquete que se utilizo en esta instalación fue: FirebirdSS-2.0.3.12981-1.nptl.i686.rpm
2 . Instalamos Firebird
#rpm -ivh FirebirdSS-2.0.3.12981-1.nptl.i686.rpm
Se instalará en la siguiente ruta: /opt/firebird
El demonio se creara en /etc/rc.d/init.d/firebird
Podemos probar el servicio:
#service firebird start
3. Instalamos Apache
#tar -zxvf httpd-*.tar.gz
b. Ingresamos a la carpeta creada
#cd httpd
Configuración, Compilación & Instalación Apache
#./configure –prefix=/usr/local/apache2 –enable-module=so
#make
#make install
La carpeta donde se encontraran nuestros documentos web se encuentran en /usr/local/apache2/httdocs, sin embargo podemos modificar esto ingresando al archivo de configuración
#vim /usr/local/apache2/conf/httpd.conf
Modificamos la siguiente linea por la carpeta donde nosotros deseemos, por ejemplo /var/www:
DocumentRoot “/usr/local/apache2/htdocs”
Ahora probamos nuestro servidor apache ingresando en nuestro navegador http://localhost/ o bien desde otra estación poner la dirección ip del servidor Web en el navegador.
4. Instalamos PHP:
#tar xzvf php-*.gz
#cd php-5.2.1
Configurando, Compilando & Instalando:
./configure –with-interbase=shared,/opt/firebird –with-gd –with-zlib –with-apxs2=/usr/local/apache2/bin/apxs –prefix=/usr/local/php –with-jpeg-dir=/usr/lib/ –with-png-dir=/usr/lib/ –with-mysql
Si ocurre algún error como este:
If configure fails try –with-jpeg-dir=
configure: error: libpng.(a|so) not found.
Entonces quiere decir que nos hacen falta algunos paquetes, realizar lo siguiente: #yum install libjpeg-devel libpng-devel. -y
#make
#make install
Checamos el archivo php.ini se encuentra en el directorio
#ls /usr/local/php/lib/php.ini
Si no existe el archivo lo copiamos desde el directorio donde hemos compilado PHP
#cp php.ini-dist /usr/local/php/lib/php.ini
Editamos el archivp php.ini
Checamos que se haya creado el siguiente directorio:
/usr/local/php/lib/php/extensions/no-debug-non-zts-*
#vim /usr/local/php/lib/php.ini
Buscamos la linea que contenda extension_dir =”./”
y le proporcionamos el path del módulo de la extension que queramos añadir, en este caso el de interbase.so
extension_dir =”/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613?”
Ahora en el mismo archivo php.ini encontraremos “Dynamic Extensions” allí añadimos nuestra extensión:
extension=interbase.so
5. Apache & PHP:
Solo nos resta añadir los parámetros de AddType en el httpd.conf
#vim /usr/local/apache2/conf/httpd.conf
añadiendiremos:
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
Reiniciamos apache
#/usr/local/apache2/bin/apachectl restart
6. Comandos básicos para adminsitración firebird:
./gsec -user sysdba -pass masterkey -mo sysdba -pw masterkey
Nota.- Si no funciona masterkey debemos de examinar el password que nos pone por default firebird en:
#cat /opt/firebird/SYSDBA.password
obtenemos algo así, estos datos se crearon durante la instalación del firebird…:
ISC_USER=sysdba
ISC_PASSWD=xhra45j
Ingresamos de nuevo como sysdba:
#./gsec -user sysdba -password xhra45j
GSEC>
Modificando desde el CLI la contraseña de sysdba
GSEC>modify sysdba -pw
GSEC>quit
In gresando a una base de datos:
./isql “/opt/firebird/DATOS.GDB” -u sysdba -p
Recomendamos bajar el ibwebadmin, muy al estilo de phpmyadmin de MySQL, solo lo descomprimimos en el directorio que tengamos especificado en DocumentRoot de la configuración de nuestro apache.
http://sourceforge.net/project/showfiles.php?group_id=25198
Capturando paquetes con Libpcap -parte II-
16 Mar
� continuación el código de un sniffer, utilizando libreria libpcap y de netinet.� Este programa nos muestra las cabeceras Ethernet, TCP, IP,� ya sea todas o las que le especifiquemos, además de mostrarnos datos capturados por nuestra interfaz en modo “promiscuo”.
Restablecer cuenta administrador en MAC OX
20 Jan
Si se nos ha olvidado el password de la cuenta de administrador, este password puede restablecerse de dos maneras.
Si se nos ha olvidado el password de la cuenta de administrador, este password puede restablecerse de dos maneras.
- A través del cd de instalación a través de la siguiente liga: http://support.apple.com/kb/HT1274
- A través de la línea de comandos en “single mode”.
A continuación los pasos dependiendo de la versión .
En versión 10.5 Leopard
1.Reniciar la Mac
2. Después del sonido de inicio( o bien cuando la pantalla se encuentre en gris, si el sonido de inicio se encuentra desactivado), presionar las teclas Apple+S on en el teclado para entrar en el modo de usuario “single”.
3. Teclear mount -uw / y presionar enter // esto nos permitirá montar la unidad de ficheros
4. Teclear launchctl load /System/Library/LaunchDaemons/com.apple.DirectoryServices.plist y presionar Enter.
5. Teclear ls /Users y presionar Enter // nos listara los nombres de usuarios de las cuentas del sistema
6. Teclear dscl . -passwd /Users/username password and replace “username” // donde username es el nombre de usuario y password es el la nueva contraseña a ingresar
7. Teclear el comando rebbor y presionar enter
Con versión 10.4 Tiger
- Prender o reiniciar la Mac.
- Después del sonido de inicio (o bien cuando la pantalla se encuentre en gris, si el sonido de inicio se encuentra desactivado), presionar las teclas Apple+S on en el teclado para entrar en el modo de usuario “single”.
- Teclear sh /etc/rc y presionar Enter.
- Teclear passwd username donde username es el nombre de usuario al cual deseamos cambiar la contraseña. Posteriormente se pedira la nueva contraseña, se ingresa y pedirá nuevamente la confirmación, una vez tecleado Enter la contraseña estará restablecida.
- Teclear Enter o Reboot y el sistema acatará los nuevos cambios.
Eliminando el archivo de configuración “Setupdone”, para cualquier Mac OS X.
Nota.- Este método no es propiamente un método para restablecer la contraseña, si no que elimina el archivo de configuración “AppleSetupDone”, que es creado al terminar una instalación de Mac, lo que ocasione que el sistema operativo piense que va a ser configurado por primera vez. Los datos serán preservados siempre y cuando después de realizar estos pasos no se escoja la opción de transferir o o migrar información a la Mac.
- Prender o reiniciar la Mac.
- Después del sonido de inicio (o bien cuando la pantalla se encuentre en gris, si el sonido de inicio se encuentra desactivado), presionar las teclas Apple+S on en el teclado para entrar en el modo de usuario “single”.
- Teclear mount -uw / y presionar Enter.
- Teclear rm /var/db/.AppleSetupDone y presionar Enter.
- Teclear shutdown -h now y presionar Enter o Reboot.
Reconstruir Zaptel, para reconocimiento de tarjeta Fxo en Asterisk (how to rebuild Zaptel for Asterisk)
16 Sep
El tutorial que tenemos a continuación nos es útil, en los casos en los que nuestro zaptel no nos haya reconocido nuestras tarjetas fxo, o bien el trixbox (antes asterisk@home).
En este caso usamosun sistema con las siguientes caracteristicas:
– trixbox 2.2
– kernel 2.6.9-34.0.2.EL
– S.O. el ya conocido Centos
– tarjeta fxo tipo intel x100p
Los pasos a seguir son los siguientes:
Checamos cual es la versión de nuestros módulos, esto es para saber que versión de zaptel bajar.
$rpm -qa | grep zaptel-modules
Una vez vista la versión de zaptel-modules, bajar el paquete desde el sitio digium necesario.
$cd /usr/src
$wget http://ftp.digium.com/pub/zaptel/releases/zaptel.x.x.x.tar.gz (suplantar las x por la version necesitada)
$tar xzvf zaptel.x.x.x.tar.gz
$cd zaptel
$vi README ( no hay que olvidar siempre leer este archivo )
$./install_prereq test
Después de ejecutar este último comando, nos aparecerá algo como esto:
#############################################
## test: test mode.
## Use the commands here to install your system.
#############################################
# Kernel source not found. Installing kernel-devel-2.6.9-34.0.2.EL
# if you get an error for the following command, consider
#
#yum install -y kernel kernel-devel
#
# and then reboot to upgrade to the newly installed kernel.
yum install -y libusb-devel c
#############################################
## test completed successfully
## (in test mode)
#############################################
Después de observar cuales son los requisitos para la instalación ejecutamos:
#./install_prereq install
O bien:
#yum install kernel kernel-devel newt-devel gcc libusb-devel -y
Ahora configuramos, creamos, instalamos, por último los arvhivos de inicio…
$./configure
$make
#make install
#make config
Creamos el archivo fsotune.conf
$touch /etc/fxotune.conf
$/sbin/fxotune -s
Después de ejecutar el último comando, nos devolverá algo así:
fxotune: successfully set echo coeffecients on FXO modules
Reiniciamos
#reboot
Se recomienda también realizar lo siguiente una vez reiniciado el sistema:
$ vi /usr/src/kernels/2.6.9-34.0.2.EL-i686/include/linux/spinlock.h
en la linea 407 cambiar ‘rw_lock_t por “rwlock_t”
#rebuild-zaptel
También recomendamos realizar lo siguiente por si ocurre algo como “all circuits are busy now”…
$vi /etc/asterisk/zapata.conf
cambiar en la linea donde se encuentre lo siguiente
;usedistinctiveringdetection=no
por:
usedistinctiveringdetection=yes
Generamos de nuevo el zaptel
#genzaptel -r
Terminamos.
Cómo obtener el código Ensamblador y el bytecode de un programa en Linux.
20 Jun
Para poder realizar esta sencilla practica necesitamos compilador GCC (Gnu Compiler Collection)
En este caso vamos a analizar la llamada al sistema execve, usando el siguiente programa:
local.c
Tenemos el programa local.c, para compilarlo usamos lo siguiente:
gcc -o local -ggdb -static local.c
Aqui usamos ggdb para poder debuggear el programa poseriormente…
Si queremos saber el codigo ensamblador que se ejecuta, usamos:
gcc -o2 -S -c local.c
Para obtener el byte code de linea por linea, usamos:
gcc -c -g -Wa local.c > local.lst
Con lo que obtendremos un listado similar a:
----------------------------------------------------------------------- GAS LISTING /tmp/ccUpmVKR.s page 1 1 .file "local.c" 9 .Ltext0: 10 .section .rodata 11 .LC0: 12 0000 2F62696E .string "/bin/sh" 12 2F736800 13 .text 14 .globl main 16 main: 17 .LFB2: 18 .file 1 "local.c" 1:local.c **** #include <unistd.h> 2:local.c **** 3:local.c **** int main(void){ 19 .loc 1 3 0 20 0000 55 pushl %ebp 21 .LCFI0: 22 0001 89E5 movl %esp, %ebp 23 .LCFI1: 24 0003 83EC18 subl $24, %esp 25 .LCFI2: 26 0006 83E4F0 andl $-16, %esp 27 0009 B8000000 movl $0, %eax 27 00 28 000e 83C00F addl $15, %eax 29 0011 83C00F addl $15, %eax 30 0014 C1E804 shrl $4, %eax 31 0017 C1E004 sall $4, %eax 32 001a 29C4 subl %eax, %esp 4:local.c **** char *arg[2]; 5:local.c **** arg[0] = "/bin/sh"; 33 .loc 1 5 0 34 001c C745F800 movl $.LC0, -8(%ebp) 34 000000 6:local.c **** arg[1] = NULL; 35 .loc 1 6 0 36 0023 C745FC00 movl $0, -4(%ebp) 36 000000 7:local.c **** execve("/bin/sh", arg, NULL); 37 .loc 1 7 0 38 002a 83EC04 subl $4, %esp 39 002d 6A00 pushl $0 40 002f 8D45F8 leal -8(%ebp), %eax 41 0032 50 pushl %eax 42 0033 68000000 pushl $.LC0 42 00 43 .LCFI3: 44 0038 E8FCFFFF call execve 44 FF 45 003d 83C410 addl $16, %esp 8:local.c **** 9:local.c **** } 46 .loc 1 9 0 47 0040 C9 leave 48 0041 C3 ret 49 .LFE2: 91 .Letext0: GAS LISTING /tmp/ccUpmVKR.s ----------------------------------------------------------- |
Farid Bielma
24 Aug
Página de Farid Bielma López, un buen amigo asiduo programador y entusiasta del software libre / open source.
Capturando paquetes con la biblioteca Libpcap -parte I-
26 Jul
/**********************************************************
Programa bajo licencia GNU/GPL http://www.gnu.org/licenses/lgpl.html
Autor: Eliseo OV
Proposito: Educativo, mostrar algunas funciones de la biblioteca libpcap
y captura de 1 paquete
Requerimientos:
