Mémoire - protection : NX bit    Enregistrer au format PDF

Never eXecute

Il s’agit d’une protection présente également dans le Noyau Linux (les processeur x86 64 bits intègrent cette protection au niveau matériel, pour les autres c’est géré logiciellement) permettant d’empêcher l’exécution de code sur une page mémoire où c’est inutile, tel que la stack.


par Tosh , S3cur3D

Voyons le fichier /proc/<PID>/maps avec NX et sans NX activé (On peut le désactiver avec -z execstack avec gcc, ou le logiciel execstack) :

$ gcc test.c && ( ./a.out && cat /proc/`pidof a.out`/maps)
08048000-08049000 r-xp 00000000 08:04 261743     /home/tosh/Test/a.out
08049000-0804a000 rw-p 00000000 08:04 261743     /home/tosh/Test/a.out
b75dd000-b75de000 rw-p 00000000 00:00 0
b75de000-b7786000 r-xp 00000000 08:03 1313428    /usr/lib/libc-2.18.so
b7786000-b7787000 ---p 001a8000 08:03 1313428    /usr/lib/libc-2.18.so
b7787000-b7789000 r--p 001a8000 08:03 1313428    /usr/lib/libc-2.18.so
b7789000-b778a000 rw-p 001aa000 08:03 1313428    /usr/lib/libc-2.18.so
b778a000-b778d000 rw-p 00000000 00:00 0
b77ac000-b77ad000 rw-p 00000000 00:00 0
b77ad000-b77ae000 r-xp 00000000 00:00 0          [vdso]
b77ae000-b77ce000 r-xp 00000000 08:03 1313416    /usr/lib/ld-2.18.so
b77ce000-b77cf000 r--p 0001f000 08:03 1313416    /usr/lib/ld-2.18.so
b77cf000-b77d0000 rw-p 00020000 08:03 1313416    /usr/lib/ld-2.18.so
bff77000-bff98000 rw-p 00000000 00:00 0          [stack]
$ gcc test.c -z execstack &amp;amp;amp;amp;&amp;amp;amp;amp;&amp;amp;amp;amp;&amp;amp;amp;amp;&amp;amp;amp;amp;&amp;amp;amp;amp;&amp;amp;amp;amp;&amp;amp;amp;amp; ( ./a.out &amp;amp;amp;amp;&amp;amp;amp;amp;&amp;amp;amp;amp;&amp;amp;amp;amp; cat /proc/`pidof a.out`/maps)
08048000-08049000 r-xp 00000000 08:04 261743     /home/tosh/Test/a.out
08049000-0804a000 rwxp 00000000 08:04 261743     /home/tosh/Test/a.out
b75c9000-b75ca000 rwxp 00000000 00:00 0
b75ca000-b7772000 r-xp 00000000 08:03 1313428    /usr/lib/libc-2.18.so
b7772000-b7773000 ---p 001a8000 08:03 1313428    /usr/lib/libc-2.18.so
b7773000-b7775000 r-xp 001a8000 08:03 1313428    /usr/lib/libc-2.18.so
b7775000-b7776000 rwxp 001aa000 08:03 1313428    /usr/lib/libc-2.18.so
b7776000-b7779000 rwxp 00000000 00:00 0
b7798000-b7799000 rwxp 00000000 00:00 0
b7799000-b779a000 r-xp 00000000 00:00 0          [vdso]
b779a000-b77ba000 r-xp 00000000 08:03 1313416    /usr/lib/ld-2.18.so
b77ba000-b77bb000 r-xp 0001f000 08:03 1313416    /usr/lib/ld-2.18.so
b77bb000-b77bc000 rwxp 00020000 08:03 1313416    /usr/lib/ld-2.18.so
bf9a0000-bf9c1000 rwxp 00000000 00:00 0          [stack]

On voit que presque toutes les pages mémoires sont exécutable...

Documentations publiées dans cette rubrique