{"id":410,"date":"2026-03-08T18:15:18","date_gmt":"2026-03-08T18:15:18","guid":{"rendered":"https:\/\/hackcuba.net\/?p=410"},"modified":"2026-03-08T18:15:18","modified_gmt":"2026-03-08T18:15:18","slug":"como-escribir-un-bootloader","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=410","title":{"rendered":"C\u00f3mo escribir un bootloader"},"content":{"rendered":"\n<p>Estaba leyendo un articulo que publicaron en <strong>BlackHat<\/strong> #16 sobre quitar el <em>password<\/em> al BIOS desde Windows, pero esto s\u00f3lo funciona si arrancamos desde un disco inicio de MS-DOS. Creo que desde las versiones 95, 98 y Me tambi\u00e9n funciona, pero los sistemas basados en NT como XP ya no permiten el acceso directo al <em>hardware<\/em>, ni permite el direccionamiento directo de la memoria.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>\u00bfC\u00f3mo escribir un <em>bootloader<\/em>?<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\nchar *videomem = (char *) 0xb8000; \/\/ 0xb8000 es la direcci\u00f3n de la RAM de video\nvoid putc(char carattere){\n\u00a0 videomem++ = carattere; \/\/ caracter a imprimir\n\u00a0 videomem++ = 0x7; \/\/ atributo del char\n}\n<\/pre><\/div>\n\n\n<p>C\u00f3digos como \u00e9ste s\u00f3lo son permitidos en SO como MS-DOS, que permiten el acceso a toda la memoria, puertos, etc., por lo que pueden hacer caer o da\u00f1ar al sistema f\u00e1cilmente. Pues Windows usa un modelo de memoria llamado <em>Flat<\/em> (o plano), donde cada proceso cree que tiene asignado 4 Gb de memoria para \u00e9l solo. Un proceso no conoce la direcci\u00f3n de memoria de otro proceso, por lo que no puede modificarla. El \u00fanico que conoce las direcciones es el kernel del SO; de este modo un programa puede caer, pero no comprometer el sistema completamente (existen casos en que un programa o una biblioteca contiene un <em>bug<\/em> y su explotaci\u00f3n permite la elevaci\u00f3n de privilegios al atacante, ej: <em>buffer overflow<\/em>, <em>heap overflow<\/em>).<\/p>\n\n\n\n<p>El microprocesador posee un modo de funcionamiento llamado \u00abprotegido\u00bb, existente desde el 286. \u00c9ste cuenta con cuatro niveles de privilegios enumerados desde el 0 al 3, donde el mayor privilegio lo tiene el llamado anillo 0 y el menor es el 3:<\/p>\n\n\n\n<p><strong>0<\/strong>&#8211; N\u00facleo del SO (Modo Supervisor)<br><strong>1<\/strong>&#8211; Servicios del sistema<br><strong>2<\/strong>&#8211; Aplicaciones del sistema<br><strong>3<\/strong>&#8211; Aplicaciones del usuario (Modo Usuario)<\/p>\n\n\n\n<p>Instrucciones en ASM, como <code>sti<\/code>, <code>cli<\/code> y <code>hlt<\/code> s\u00f3lo le son permitidas al modo N\u00facleo o Supervisor.<\/p>\n\n\n\n<p>Windows y Linux s\u00f3lo usan los anillos 0 y 3 (en Linux el usuario <em>root<\/em> tiene m\u00e1s privilegios que el administrador de Windows). Ahora, \u00bfc\u00f3mo aceden al <em>hardware<\/em> las aplicaciones del usuario? Si estas no tienen suficientes privilegios, se accede mediante las llamadas a las APIs del sistema operativo (en Linux, <em>Syscalls<\/em> o Llamadas al sistema). \u00c9stas proporcionan un gran nivel de abstracci\u00f3n al programador, ya que \u00e9ste sabe lo que hacen \u00e9stas, no c\u00f3mo funcionan internamente.<\/p>\n\n\n\n<p>Ahora compilemos el siguiente c\u00f3digo en XP:<\/p>\n\n\n\n<p>\/\/ hay que usar Dev-C++ o llamar directamente al compilador de la siguiente forma<br>\/\/ gcc -o quitarpass quitarpass.c<br><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &lt;stdio.h&gt;\nmain()\n{\n\u00a0 asm (&quot;.intel_syntax noprefix&quot;);\n\u00a0 __asm (&quot;cli&quot;); \/\/ desactivamos las interrupciones\n\u00a0 __asm (&quot;mov al,0x2e&quot;); \/\/ movemos el valor 0x2e a registro AL\n\u00a0 __asm (&quot;out 0x70,al&quot;); \/\/ escribimos el valor de AL en el puerto 70\n\u00a0 __asm (&quot;out 0x71,al&quot;); \/\/ escribimos el valor de AL en el puerto 71\n\u00a0 __asm (&quot;sti&quot;); \/\/ habilitamos las interrupciones\n\u00a0 asm (&quot;.att_syntax noprefix&quot;);\n\n\u00a0return 0;\n}\n<\/pre><\/div>\n\n\n<p><strong>Explicaci\u00f3n del c\u00f3digo:<\/strong><br>Las Directivas <code>asm (\".intel_syntax noprefix\");<\/code> y <code>asm (\".att_syntax noprefix\");<\/code> son para que acepte la sintaxis de Intel, ya que el gcc usa por defecto la de AT&amp;T. Por ejemplo:<\/p>\n\n\n\n<p><code>intel syntax At&amp;t syntax Mov ax,5 mov $5,%ax<\/code><\/p>\n\n\n\n<p>Si lo compilamos veremos que no da ning\u00fan error, pero si lo ejecutamos nos dar\u00e1 el t\u00edpico error \u00ab<em>El programa quitarpass.exe ha efectuado una operaci\u00f3n no v\u00e1lida y debe cerrarse<\/em>\u00ab.<\/p>\n\n\n\n<p>\u00bfQue sucedi\u00f3 entonces, que ni como administrador podemos ejecutarlo?<\/p>\n\n\n\n<p>S\u00f3lo s\u00e9 que el sistema no lo permite. Quiz\u00e1s lo haga si lo lanzamos con la cuenta <em>system<\/em>, ya que \u00e9sta tiene m\u00e1s privilegios que el Administrador. Pero no lo he probado, as\u00ed que si alguien lo prueba que me lo comunique. Existen programas como el <em>asusupdate<\/em>, que como administrador te permiten <em>flashear<\/em>, actualizar, e incluso cambiarle el logo de inicio al BIOS. Estos programas usan generalmente una funci\u00f3n que se llama <code>DeviceIOcontrol<\/code>,que tambi\u00e9n es usada en la creaci\u00f3n de controladores de dispositivos, ya que estos necesitan acceder directamente al <em>hardware<\/em>. Dicha funci\u00f3n no he podido probarla, ya que no he encontrado suficiente documentaci\u00f3n sobre c\u00f3mo usarla.<\/p>\n\n\n\n<p>En el caso del <em>debug<\/em> no da ning\u00fan error, pero si reiniciamos la PC veremos que no ha eliminado el <em>pass<\/em> del BIOS.<\/p>\n\n\n\n<p>Ahora probemos el siguiente c\u00f3digo en Linux:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &lt;sys\/io.h&gt; \/\/ contiene el prototipo de la funci\u00f3n iopl\n\nmain()\n{\n\u00a0 iopl(3); \/\/ elevamos los privilegios de E\/S, que normalmente es 0\n\u00a0 asm(&quot;.intel_syntax noprefix&quot;);\n\u00a0 asm(&quot;cli&quot;);\n\u00a0 asm(&quot;mov al,0x2e&quot;);\n\u00a0 asm(&quot;out 0x70,al&quot;);\n\u00a0 asm(&quot;out 0x71,al&quot;);\n\u00a0 asm(&quot;sti&quot;);\n\u00a0 asm(&quot;.att_syntax noprefix&quot;);\n\u00a0 return 0;\n}\n<\/pre><\/div>\n\n\n<p>Lo compilamos:<\/p>\n\n\n\n<p><code>rnapoles rodas:~\/prog\/asm\/cm$ gcc -o clearcmos clearcmos.c<\/code><\/p>\n\n\n\n<p>Lo ejecutamos:<\/p>\n\n\n\n<p><code>rnapoles rodas:~\/prog\/asm\/cm$ .\/clearcmos<\/code><br><em>Violaci\u00f3n de segmento<br>rnapoles rodas:~\/prog\/asm\/cm$<\/em><\/p>\n\n\n\n<p>Esto sucede porque no tenemos suficientes privilegios. Ejecut\u00e9moslo como <em>root<\/em> a ver que pasa:<\/p>\n\n\n\n<p><code>rnapoles rodas:~\/prog\/asm\/cm$ su<\/code><br>Password:<br><code>root rodas \/home\/rnapoles\/prog\/asm\/cm :.\/clearcmos<\/code><\/p>\n\n\n\n<p>Y todo sale ok. Reiniciemos la PC y entremos al BIOS. \u00a1Hecho est\u00e1: sin <em>password<\/em>!, por lo que s\u00f3lo debemos usar la cuenta de <em>root<\/em> para tareas administrativas. Ya que no soy un especialista en la materia, el texto anterior puede que quiz\u00e1s contenga algunos errores.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Para saber m\u00e1s&#8230;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/es.wikipedia.org\/wiki\/Modo_protegido\" target=\"_blank\" rel=\"noreferrer noopener\">Wikipedia::Modo Protegido<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/Syscall\" target=\"_blank\" rel=\"noreferrer noopener\">Wikipedia::Syscall<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/CMOS\" target=\"_blank\" rel=\"noreferrer noopener\">Wikipedia::CMOS<\/a><\/li>\n<\/ul>\n\n\n\n<p>Escrito por Reinier N\u00e1poles Mart\u00ednez [<a href=\"mailto:rnapoles@ipihlg.rimed.cu\">rnapoles@ipihlg.rimed.cu<\/a>]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Estaba leyendo un articulo que publicaron en BlackHat #16 sobre quitar el password al BIOS desde Windows, pero<\/p>\n","protected":false},"author":2,"featured_media":411,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,36],"tags":[138,60,58,38,136],"class_list":["post-410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","category-proyecto-blackhat","tag-bootloader","tag-c","tag-programacion","tag-proyecto-blackhat","tag-sistemas-operativos"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=410"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/410\/revisions"}],"predecessor-version":[{"id":412,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/410\/revisions\/412"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/411"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}