Posteado por: navascues | Agosto 15, 2008

Cerrado por vacaciones

Posteado por: navascues | Agosto 13, 2008

Knuth Comments on Code (1996)

BYTE: Judging from the number of bugs that we see in commercial software, vendors seem to prioritize features over error-free code. Will new tools or new programming techniques result in more stable software?

Knuth: There is no royal road, and you can’t make any complex program totally failsafe. You can test a program for a year and then someone or something will create a condition that nobody ever anticipated and then very subtle errors become very visible. The layers that you place on a program to make it failsafe can themselves fail. I certainly don’t say that we should avoid using techniques like redundancy to increase the stability of critical programs, or that we should write code and not worry about the consequences. Computer programs are the most complicated things that humans have ever created. That’s why I say this idea of exposition is the best way of coping with the complexity. When I’m writing a program, I approach it as if I were writing a short story. It doesn’t take me longer, because the time I spend on organization is more than made up for in time saved debugging.

http://www.literateprogramming.com/byte1996.html

Posteado por: navascues | Julio 29, 2008

NT 4.0 and the lastest version of WinDbg

I would say nobody on earth needs to connect NT 4.0 to the lastest version of WinDbg Kernel Debugger.  In fact Microsoft Symbols Server don’t provide NT symbols… anyway and just for save time for those in my situation there is the way I make it work:

  1. Start your NT system
  2. It will show something like screenshot 1 (if kernel debugger config is ok)
  3. Wait until changes to screenshot 2 or similar
  4. Now try to connect the KD or WinDbg, not before or you would get an ugly message like:

Microsoft (R) Windows Debugger  Version 6.7.0005.1
Copyright (c) Microsoft Corporation. All rights reserved.

Opened \\.\pipe\com_1
Waiting to reconnect…
Verbose mode ON.
Connected to Windows NT 4 1381 x86 compatible target, ptr64 FALSE
Kernel Debugger connection established.
Symbol search path is: B:\out
Executable search path is: B:\out
Loading symbols for 80100000     ntoskrnl.exe ->   ntoskrnl.exe
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntoskrnl.exe -
ModLoad: 80100000 801db000   ntoskrnl.exe
CS descriptor lookup failed
Windows NT 4 Kernel Version 1381 UP Free x86 compatible
Kernel base = 0×80100000 PsLoadedModuleList = 0×80150b70
System Uptime: not available
Loaded dbghelp extension DLL
Loaded ext extension DLL
Loaded kext extension DLL
Loaded kdextx86 extension DLL
Opened log file ‘c:\log.txt’
Force unload of ntoskrnl.exe
ModLoad: 80100000 801db000   ntoskrnl.exe
Unable to get program counter
WaitForEvent failed
Unable to get program counter
0008:497a 0010            add     byte ptr [bx+si],dl

Posteado por: navascues | Julio 23, 2008

Herramientas de red imprescindibles (o no)

Yo diría que todo programador que desarrolle aplicaciones distribuidas tarde o temprano necesita estas herramientas. Más aún si se mueve a bajo nivel o si implementa un protocolo de aplicación complejo. En realidad en el momento que abras un socket seguramente utilices alguna de ellas.

Si alguien conoce algo mejor… que lo comparta conmigo. Ahí va la lista de mis must:

WIRESHARK / ETHEREAL / tcpdump

El mejor analizador de tráfico que existe [hasta donde yo sé]. Examinar cabeceras y datos de paquetes y aplicar filtros a la captura (incluso con wildcards) es muy sencillo con Wireshark.

NETCAT

La delicia de todos aquellos que implemente un firewall ya que permite establecer/escuchar conexiones TCP/UDP a las IPs y puertos que quieras.

Pero realmente, es MUCHO más que eso cuando se combina con la shell. En un periquete puedes tener funcionalidas variadas (véase http://crysol.org/node/28) :

Chat para dos
Transferencia de ficheros
Servidor de echo
Servidor de daytime
Telnet inverso
Cliente de IRC
Cliente de correo SMTP
Cliente y un servidor HTTP rudimentarios
Streaming de audio
Streaming de video
Redirección de una conexión a otro puerto u otra máquina
Ratón remoto
Ver “La Guerra de las Galaxias”

Los niños malos también se dedican a invocarlo desde shellcode por razones obvias.

Aquí un ejemplillo:

user@hostname:~$ nc www.google.es 80
GET /
<HTML><HEAD><meta http-equiv=”content-type” content=”text/html;charset=utf-8″>
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF=”http://www.google.es/”>here</A>.
</BODY></HTML>

TELNET

Una vieja gloria, por decir algo, que permitía acceder en modo línea de comandos a máquinas remotas. A parte de estar totalmente anticuado y ser completamente inseguro el cliente es aún MUY ÚTIL tanto para mandar emails anónimos :D como para comprobar si un puerto TCP está a la escucha (eso sí, en ausencia de firewalls) o si llegamos. Por ejemplo:

user@hostname:~$ telnet www.google.es 80
Trying 66.102.9.147…
Connected to www.l.google.com.
Escape character is ‘^

NMAP

Lo mejor que he visto para escanear puertos TCP y UDP, averiguar qué SO usa la máquina remota (hasta cierto punto) y qué servicios tiene activos. A los niños malos también les gusta porque les permite mucha flexibilidad y variedad en los escaneos para ser silenciosos y averiguar qué servicios pueden reventar.

Para hacer un escaneo TCP basado en SYNs del handshake de TCP basta con poner algo así:

user@hostname:~$ nmap -sS -O 192.168.1.1

Starting Nmap 4.20 ( http://insecure.org ) at 2008-07-23 19:59 CEST
Interesting ports on 192.168.1.1:
Not shown: 1694 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
80/tcp open http
MAC Address: 00:18:02:DF:DC:5B (Alpha Networks)
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.14 - 2.6.17
Uptime: 0.523 days (since Wed Jul 23 07:26:56 2008)
Network Distance: 1 hop

Nmap finished: 1 IP address (1 host up) scanned in 1.922 seconds

HPING (que no ping)

Probablemente menos conocido y bastante más inútil en el día a día, permite inyectar paquetes (raw IP, ICMP, TCP o UDP) a medida en la red. A los niños malos y a los que los persiguen parece que les gusta…

Se pueden configurar los paquetes bien desde los parámetros del comando o desde fichero, lo cual, tiene su gracia para reproducir situaciones. Desde luego para el desarrollo de firewalls lo considero una joya. (-:

Posteado por: navascues | Julio 2, 2008

El encriptado WPA con Wireless en Ubuntu Edgy - Make it easy!

Una vez en que puse en funcionamiento la tarjeta Wireless del Inspiron 640m sólo restaba configurar el acceso a mi red inalámbrica. Debido a la in-seguridad del encriptado WEP quería usar WPA-PSK.

Para configurar WPA-PSK en otras ocasiones había editado directamente los archivos de configuración del wpa_supplicant (programa que implementa los algoritmos de cifrado WPA). Pero para existe una forma de hacerlo mucho más sencilla, a través del network-manager (applet nm-applet en GNOME) que utiliza wpa_supplicant “por debajo”.

Pasos a seguir GNOME:

Instalar el paquete network-manager-gnome con el comando:

  • apt-get install network-manager-gnome

Una vez instalado reiniciaremos la sesión de GNOME y debería aparecernos en el panel superior; si pinchamos sobre él nos mostrará las redes inalámbricas disponibles. Basta con elegir la nuestra e introducir la contraseña.

P.D.: el gnome-network-manager tenía un bug por el cual no funcionaba de buenas a primeras y me salía el siguiente aviso: “The NetworkManager applet could not find some required resources. It cannot continue“. Para arreglarlo simplemente ejecutad:

  • sudo gtk-update-icon-cache -f /usr/share/icons/hicolor
Posteado por: navascues | Julio 2, 2008

Intel PRO/Wireless 3945 y Edgy Eft

La tarjeta wireless de mi Dell Inspiron 640m había funcionado sin necesidad de configurar nada en Ubuntu Dapper, pero ahora he cambiado a Ubuntu Edgy Eft y no funcionaba.

Aunque hacía un lsmod y veía el módulo ipw3954 no aparecía ninguna interfaz wireless tras hacer un ifconfig. Sólo tenía la local (lo) y eth0 para la tarjeta de red (wired).

La solución ha sido muy sencilla, instalar el paquete linux-restricted-modules-generic con:

  • sudo apt-get install linux-restricted-modules-generic

Tras instalarlo y reiniciar la Edgy, mi NetworkManager de GNOME ya detectaba las redes inalámbricas. Al hacer otra vez ifconfig, he visto que aparece la interfaz eth1 como wireless, que era lo que hacía Dapper desde que se instalaba.
Por lo visto ipw3945 ejecuta /sbin/ipw3945d- $(uname -r) y si, como es mi caso, tienes el kernel 2.6.17-10-generic necesitas instalar el paquete linux-restricted-modules para tener ese binario en /sbin. Según leí en otro sitio también podría funcionar así:

  • sudo ln -s /sbin/ipw3945d-2.6.17-10-386 /sbin/ipw3945d-2.6.17-10-generic

Enlaces que he usado:

1. https://launchpad.net/distros/ubuntu/+source/linux-source-2.6.17/+bug/62452

Posteado por: navascues | Julio 2, 2008

Zamora - Spain

Lago de Sanabria

Altos de Bubela

Cerro de San Juan

Posteado por: navascues | Julio 2, 2008

Cómo hacer fotos panorámicas

La idea es muy sencilla; tomar varias fotos haciendo un barrido del panorama y luego juntándolas. Pero para hacerlo bien hay que tener claros algunos puntos:

  • Las fotos deben estar solapadas; me explico, el borde derecho de la primera debe ser igual al borde izquierdo de la que le sigue (si barremos el panorama de izquierda a derecha). Esto es necesario para luego “montar” una foto sobre otra como su fuera un puzle.

--

  • El grado de solapamiento, es decir, la anchura de la “zona compartida” entre fotos ha de ser razonable: hay que llegar a un compromiso entre que las piezas encajen y que cada una aporte nueva información a la panorámica. No puede ser muy ancha ya que tendríamos que hacer muchas fotos para barrer el panorama y esto se traduciría en posibles cambios en la escena y mucho tiempo de proceso en el ordenador. Tampoco debemos ir ajustar a una columna de pixels ya que luego nos constará juntarlas.

Nuestras 3 fotos están bien solpadas, aunque no alineadas: si es posible es mejor usar un trípode para el barrido.

  • Deben tomarse las fotos antes de que la escena cambie; me explico, imaginad que estamos en un día con fuerte viento y el cielo está nublado. Tomamos lentamente tres fotos consecutivas y cuando llegamos al ordenador nos damos cuenta de que aunque el perfil del terreno coincide en las tres fotos, las nubes no porque el viento las empujó. ¿Solución? o eres un Velázquez del GIMP o el Photoshop o ya no hay panorámica. Por eso hay que hacer las fotos relativamente rápido. Otro ejemplo más realista: sabemos que los amaneceres y atardeceres proporcionan resultados más espectaculares y sacamos nuestras fotos con demasiada calma, ¿qué pasará? que unas fotos saldrán con un cielo más claro y otras con un cielo más oscuro. En este caso sí que encajarían las piezas del puzle pero el resultado no sería el óptimo.

Nuestra primera foto es demasiado clara, la panorámica no quedara bien del todo ¡¡debemos buscar la continuidad de la escena!!

DEFECTOS:

  1. El cielo en la primera foto constrasta mucho con las otras dos. Si las tomamos manualmente que el fotómetro nos indique la misma luz en las tres.
  2. Al tomar las instantáneas a mano alzada se crean estos pliegues que tendremos que recortar. Esto nos hacer perder información en los bordes de abajo, pues la anchura de la panorámica final nos viene impuesta por el borde de arriba porque es el más estrecho en este caso. Estos recortes se minimizan usando trípode.
  • Recortamos la imagen final con nuestro SW de edición de imágenes preferido y a presumir de foto.

Para ver unos resultados más trabajados mira esta entrada.

Posteado por: navascues | Julio 1, 2008

Sobre las claves ocultas en el registro de Windows

Los foros de juanquers a veces son muy patéticos y por pura ignorancia algunos de sus miembros no llaman a las cosas por su verdadero nombre. Y es que veces explican con todo lujo de detalles interpretaciones totalmente erróneas y usan ideas de hace más de una década como propias. Por favor  (-:

La posibilidad de insertar claves invisibles para la API Win32 no es un bug. Y hacerlo es tan trivial que jactarse de ocultarlas sólo demuestra que o bien tienes 16 años o bien eres idiota o quién sabe si no son ambas cosas a la vez. Hace más de 15 años (circa 1993) vio la luz el primer Windows de la familia NT ( http://en.wikipedia.org/wiki/Windows_NT_3.1) y desde entonces ha sido posible insertar claves ocultas. Porque no es un bug; está diseñado así (*). Las cadenas de Win32 API son ANSI (8-bit) o cadenas anchas de (16-bit) pero terminadas en NULL y los nombres en la API nativa son cadenas Unicode (encoding de 16-bits) de longitud controlada.

Esta es la estructura para Unicode que se utiliza en la ejecutiva de Windows, en los subsistemas y en los drivers. Simplemente contiene la longitud actual, la máxima longitud del buffer y el buffer en sí. El final de la cadena lo marca Length, no ningún NULL de terminación:

typedef struct _UNICODE_STRING

{

USHORT Length;

USHORT MaximumLength;

PWSTR Buffer;

} UNICODE_STRING;

No seré yo quien defienda la API de acceso al registro ni mucho menos sus kilométricos nombres en notación húngara. Ni me gusta la posibilidad de las claves no accesibles desde la API facilitada (wtf) porque la única utilidad que se me ocurre es la de una falsa protección. Y a parte de que todas las ramas sensibles sí son accesibles para una protección real ya existen las ACLs.

¿ Pero qué son las claves ocultas ?

Para cualquier programador será fácil de entender. Con la API nativa puedes crear una clave cuyo nombre en Unicode contenga NULLs, por ejemplo: L”\\HKLM\\foo(null)bar\\foo(null)bar” contiene 2 NULL. La Win32 API no puede abrir la clave simplemente porque no puede expresar el nombre de esa clave y si intentara abrirla lo máximo que abriría sería la rama “\\HKLM\\foo”.

Por lo tanto, aunque la API Win32 dependa de la API Nativa, no ofrece toda la funcionalidad de ésta. En la siguiente tabla me apunto qué funciones nativas subsumen las de la API de Windows.

Algunas funciones Nativas Correspondecnia Win32 APIs Privilegios
NtCreateKey RegCreateKey , RegCreateKeyEx N/A
NtOpenKey RegOpenKey , RegOpenKeyEx N/A
NtDeleteKey RegDeleteKey N/A
NtFlushKey RegFlushKey N/A
NtSetInformationKey None N/A
NtQueryKey RegQueryInfoKey N/A
NtEnumerateKey RegEnumerateKey , RegEnumerateKeyEx N/A
NtNotifyChangeKey RegNotifyChangeKeyValue N/A
NtDeleteValueKey RegDeleteValue N/A
NtSetValueKey RegSetValue , RegSetValueEx N/A
NtQueryValueKey RegQueryValue , RegQueryValueEx N/A
NtEnumerateValueKey RegEnumValue N/A
NtQueryMultipleValueKey RegQueryMultipleValues N/A
NtEnumerateKey RegEnumKey , RegEnumKeyEx N/A
* NtSaveKey RegSaveKey SeBackupPrivilege
* NtRestoreKey RegRestoreKey SeRestorePrivilege
* NtLoadKey RegLoadKey SeRestorePrivilege
* NtLoadKey2 None SeRestorePrivilege
* NtReplaceKey RegReplaceKey SeRestorePrivilege
* NtUnloadKey RegUnloadKey SeRestorePrivilege
NtClose CloseHandle N/A
NtCreateFile CreateFile N/A
NtOpenThread OpenThread N/A
NtOpenProcessToken None SeCreateTokenPrivilege
NtAdjustPrivilegesToken AdjustTokenPrivileges N/A
NtQueryInformationToken GetTokenInformation N/A
Posteado por: navascues | Junio 30, 2008

Tabla de funciones seguras en modo kernel

Función Funcionalidad Sustitutiva de
RtlStringCbCat
RtlStringCbCatEx
RtlStringCchCat
RtlStringCchCatEx
RtlUnicodeStringCat
RtlUnicodeStringCatEx
RtlUnicodeStringCatString
RtlUnicodeStringCatStringEx
RtlUnicodeStringCbCatStringN
RtlUnicodeStringCbCatStringNEx
RtlUnicodeStringCchCatStringN
RtlUnicodeStringCchCatStringNEx
Para concatenar cadenas. strcat
wcscat
RtlStringCbCatN
RtlStringCbCatNEx
RtlStringCchCatN
RtlStringCchCatNEx
RtlUnicodeStringCbCatN
RtlUnicodeStringCbCatNEx
RtlUnicodeStringCchCatN
RtlUnicodeStringCchCatNEx
Para concatenar cadenas (Cb = la unidad de longitud es el byte)

y limitar el tamaño de la cadena resultante.

strncat
wcsncat
RtlStringCbCopy
RtlStringCbCopyEx
RtlStringCbCopyUnicodeString
RtlStringCbCopyUnicodeStringEx
RtlStringCchCopy
RtlStringCchCopyEx
RtlStringCchCopyUnicodeString
RtlStringCchCopyUnicodeStringEx
RtlUnicodeStringCopy
RtlUnicodeStringCopyEx
RtlUnicodeStringCopyString
RtlUnicodeStringCopyStringEx
Para copiar cadenas a un buffer. strcpy
wcscpy
RtlStringCbCopyN
RtlStringCbCopyNEx
RtlStringCchCopyN
RtlStringCchCopyNEx
RtlUnicodeStringCbCopyN
RtlUnicodeStringCbCopyNEx
RtlUnicodeStringCchCopyN
RtlUnicodeStringCchCopyNEx
RtlUnicodeStringCbCopyStringN
RtlUnicodeStringCbCopyStringNEx
RtlUnicodeStringCchCopyStringN
RtlUnicodeStringCchCopyStringNEx
Para copiar cadenas a un buffer y controlar el número de bytes copiados. strncpy
wcsncpy
RtlStringCbLength
RtlStringCchLength
RtlUnalignedStringCbLength
RtlUnalignedStringCchLength
Determina el tamaño de la cadena. strlen
wcslen
RtlStringCbPrintf
RtlStringCbPrintfEx
RtlStringCchPrintf
RtlStringCchPrintfEx
RtlUnicodeStringPrintf
RtlUnicodeStringPrintfEx
Para crear cadenas con formato. El formato se especifica en otra cadena de texto y los típicos argumentos variadicos. sprintf
swprintf
_snprintf
_snwprintf
RtlStringCbVPrintf
RtlStringCbVPrintfEx
RtlStringCchVPrintf
RtlStringCchVPrintfEx
RtlUnicodeStringVPrintf
RtlUnicodeStringVPrintfEx
Para crear cadenas con formato. El formato se especifica en otra cadena de texto y los típicos argumentos variadicos. vsprintf
vswprintf
_vsnprintf
_vsnwprintf
RtlUnicodeStringInit
RtlUnicodeStringInitEx
RtlUnicodeStringValidate
RtlUnicodeStringValidateEx
Inicializa o valida una UNICODE_STRING .

Entradas antiguas »

Categorías