me da un access violation al entrar en la shellcode.

Iniciado por black_flowers, 24 Marzo 2011, 15:45 PM

0 Miembros y 1 Visitante están viendo este tema.

black_flowers

tengo un codigo asm que funciona perfectamente y que he pasado a shellcode. Pero al intentarlo ejecutar como shellcode medá un access violation. La shellcode no contienenulos y como ya he dicho, ejecutada por si misma funciona perfectamente.

alguna idea de porqué puede pasar esto?

este es el programa: (y access violation lo he comprobado con olly y es justo al entrar en los opcodes de la shellcode).

Citar#include <stdio.h>
#include <string.h>
//#include <stdafx.h>
#include <windows.h>

char code[] = "\x33\xDB\x64\x8B\x5B\x30\x8B\x5B\x0C\x8B\x5B\x1C\x8B\x1B\x8B\x1B\x8B\x5B\x08\x8B\xC3\x50\x8B\x34\x24\x03\x76\x3C\x8B\x56\x78\x03"
"\x14\x24\x8B\xCA\x83\xC1\x1F\x41\x8B\x19\x03\x1C\x24\x33\xC0\x8B\x3B\x03\x3C\x24\x81\x3F\x47\x65\x74\x50\x75\x1A\x81\x7F\x04\x72"
"\x6F\x63\x41\x75\x11\x81\x7F\x08\x64\x64\x72\x65\x75\x08\x66\x81\x7F\x0C\x73\x73\x74\x0A\x90\x83\xC3\x04\x40\x3B\x42\x18\x75\xCF"
"\x8B\x72\x24\x03\x34\x24\x33\xC9\x66\x8B\x0C\x46\x8B\x7A\x1C\x03\x3C\x24\x8B\x04\x8F\x03\x04\x24\x8B\x34\x24\x32\xD2\x83\xEC\x0B"
"\xC6\x45\xF8\x57\xC6\x45\xF9\x69\xC6\x45\xFA\x6E\xC6\x45\xFB\x45\xC6\x45\xFC\x78\xC6\x45\xFD\x65\xC6\x45\xFE\x63\x88\x55\xFF\x8D"
"\x4D\xF8\x51\x56\x8B\xD8\xFF\xD0\x32\xD2\x83\xEC\x11\xC6\x45\xF7\x63\xC6\x45\xF8\x61\xC6\x45\xF9\x6C\xC6\x45\xFA\x63\xC6\x45\xFB"
"\x2E\xC6\x45\xFC\x65\xC6\x45\xFD\x78\xC6\x45\xFE\x65\x88\x55\xFF\x8D\x4D\xF7\x6A\x05\x51\xFF\xD0\x32\xD2\x83\xEC\x20\xC6\x45\xEE"
"\x45\xC6\x45\xEF\x78\xC6\x45\xF0\x69\xC6\x45\xF1\x74\xC6\x45\xF2\x50\xC6\x45\xF3\x72\xC6\x45\xF4\x6F\xC6\x45\xF5\x63\xC6\x45\xF6"
"\x65\xC6\x45\xF7\x73\xC6\x45\xF8\x73\x88\x55\xF9\x8D\x4D\xEE\x51\x56\xFF\xD3\x33\xC9\x51\xFF\xD0";

typedef void (*pfnc_initDevice)(void);

int main()
{
pfnc_initDevice pfnc=(pfnc_initDevice)&code[0];
pfnc();
return 0;
}

Garfield07

Al ensamblar la shellcode ensambla en modo elf (vamos, compila un ejecutable) y ejecuta, a ver si funciona.
Por ejemplo, al ensamblar en Linux ensambla así:

$ nasm -f elf -o shellcode.o shellcode.s
$ ld -m elf_i386 -o shellcode shellcode.o
$


Un saludo!
PD: Más datos!


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

Ivanchuk

mmm creo que esta trabajando en windows, digo por el header windows.h :P.

Para mi que el problema es q no tiene permisos de ejecucion en la sección de datos, por eso cuando salta para ejecutar en char code le tira el access violation. Si es eso trata de meter char code en la sección ejecutable, fijate que te dice el compilador si declaras code asi:

Código (cpp) [Seleccionar]
char code[] __attribute__((section (".text"))) = ...

En linux con gcc funciona pero no se en windows.
Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org

black_flowers

Cita de: Ivanchuk en 24 Marzo 2011, 18:48 PM
mmm creo que esta trabajando en windows, digo por el header windows.h :P.

Para mi que el problema es q no tiene permisos de ejecucion en la sección de datos, por eso cuando salta para ejecutar en char code le tira el access violation. Si es eso trata de meter char code en la sección ejecutable, fijate que te dice el compilador si declaras code asi:

Código (cpp) [Seleccionar]
char code[] __attribute__((section (".text"))) = ...

En linux con gcc funciona pero no se en windows.

sí, es en windows y he probado con gcc y funciona  :D
en cambio con visual c++ no , >:(, me da un montón de errores de compilación. En cualquier caso el problemaes el que tu dices de los permisos, así que será cuestión de buscar la instrucción equivalente en visual c++.

A todo esto la shellcode no haceotra cosa que lanzar la calculadora de windows y debería de funcionar en cualquier sistema.

Un saludo.

[Zero]

Dale permisos de ejecución con VirtualProtect a ver si así funciona, si funciona luego puedes compilar de forma que te lo meta todo en la sección .text.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

black_flowers

este es el equivalente para visual c++:


#pragma section("mycode",execute)
__declspec(allocate("mycode"))char code[] = "\x33\xDB...sigue la shellcode";

Иōҳ

Cita de: [Zero] en 24 Marzo 2011, 21:14 PM
Dale permisos de ejecución con VirtualProtect a ver si así funciona, si funciona luego puedes compilar de forma que te lo meta todo en la sección .text.

Saludos

en la hora del linkeo le tienes que dar permisos a la sección .text

/SECTION:.text,REW

yo uso radasm y como no se puede usar la "," se usa "|"

aqui te lo dejo si te sirve:

5,O,$B\LINK.EXE /SECTION:.text|REW /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3

Salu2!
Eres adicto a la Ing. Inversa? -> www.noxsoft.net

Garfield07

Vaya, Iván, no me había dado cuenta :P ¿Y si probases así? Es más sencillo y creo que funciona para todo ;)

char code[] = "\x33\xDB\x64\x8B\x5B\x30\x8B\x5B\x0C\x8B\x5B\x1C\x8B\x1B\x8B\x1B\x8B\x5B\x08\x8B\xC3\x50\x8B\x34\x24\x03\x76\x3C\x8B\x56\x78\x03"
"\x14\x24\x8B\xCA\x83\xC1\x1F\x41\x8B\x19\x03\x1C\x24\x33\xC0\x8B\x3B\x03\x3C\x24\x81\x3F\x47\x65\x74\x50\x75\x1A\x81\x7F\x04\x72"
"\x6F\x63\x41\x75\x11\x81\x7F\x08\x64\x64\x72\x65\x75\x08\x66\x81\x7F\x0C\x73\x73\x74\x0A\x90\x83\xC3\x04\x40\x3B\x42\x18\x75\xCF"
"\x8B\x72\x24\x03\x34\x24\x33\xC9\x66\x8B\x0C\x46\x8B\x7A\x1C\x03\x3C\x24\x8B\x04\x8F\x03\x04\x24\x8B\x34\x24\x32\xD2\x83\xEC\x0B"
"\xC6\x45\xF8\x57\xC6\x45\xF9\x69\xC6\x45\xFA\x6E\xC6\x45\xFB\x45\xC6\x45\xFC\x78\xC6\x45\xFD\x65\xC6\x45\xFE\x63\x88\x55\xFF\x8D"
"\x4D\xF8\x51\x56\x8B\xD8\xFF\xD0\x32\xD2\x83\xEC\x11\xC6\x45\xF7\x63\xC6\x45\xF8\x61\xC6\x45\xF9\x6C\xC6\x45\xFA\x63\xC6\x45\xFB"
"\x2E\xC6\x45\xFC\x65\xC6\x45\xFD\x78\xC6\x45\xFE\x65\x88\x55\xFF\x8D\x4D\xF7\x6A\x05\x51\xFF\xD0\x32\xD2\x83\xEC\x20\xC6\x45\xEE"
"\x45\xC6\x45\xEF\x78\xC6\x45\xF0\x69\xC6\x45\xF1\x74\xC6\x45\xF2\x50\xC6\x45\xF3\x72\xC6\x45\xF4\x6F\xC6\x45\xF5\x63\xC6\x45\xF6"
"\x65\xC6\x45\xF7\x73\xC6\x45\xF8\x73\x88\x55\xF9\x8D\x4D\xEE\x51\x56\xFF\xD3\x33\xC9\x51\xFF\xD0";

int main(int argc, char **argv)
{
(*(void(*)()) code)();
return 0;
}

Otro problema podría ser que la shellcode esté mal pasada a hexadecimal ;)

Un saludo!
Sagrini


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo