Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - dRak0

#151
Jaja y para que existe?He ahi la cuestion jaja.Entonces no seria tan horrible asignarle el de la estructura PROCESSENTRY32.

Bueno , gracias.

Ya que tenes bastante experiencia con la API de windows , te hago otra consulta.

Al ejecutar un WriteProcessMemory() me tira un error. Como me dijistes en otro post ,"si tenes un error usa GetLastError()" .Me tira error 5. Busque y significa "Permiso denegado". Pero el problema es que tengo todos los permisos. Ejecuto como administrador y ademas le ajusto los privilegios del TOKEN. Nose que pasa.

El espacio que reserve tiene sus permisos correctamente.
#152
Charly que poco sabes de negocios.En todo el planeta la mayoria de las propuestas de trabajo son para programar orientado a mobile;ya que genera mucho dinero.El que te contrata no le interesa mas que su negocio funcione.

Te la pasas insultando a lenguajes de programacion , cuando lo importante no es el lenguaje , sino , el algoritmo.Y si bien yo soy del palo de C,C++ , hay lenguajes interpretados , Python, que son excelentes.

#153
Si pongo eso directamente ni me busca las dlls.

Modifico:No me buscaba las dlls porque tenia que inicializar el dwSize. Ahora me las busca , pero me muestra que pertenece al proceso 0 (Supongo debido al ZeroMemory) antes me mostraba q pertenician al 912.



while(Process32Next(snapshot,&processEntry)==TRUE)
{
printf("\nPID:%d\nExe:%s\n",processEntry.th32ProcessID,processEntry.szExeFile);


if(snapshotModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processEntry.th32ProcessID))
{
ZeroMemory(&moduleEntry, sizeof(MODULEENTRY32));
moduleEntry.dwSize=sizeof(MODULEENTRY32);
while(Module32Next(snapshotModule,&moduleEntry)==TRUE)
printf("%s %s %d\n",moduleEntry.szModule,moduleEntry.szExePath,moduleEntry.th32ProcessID);

}
}


Para solucionarlo podria asignar el valor de la estructura PROCESSENTRY32 al MODULEENTRY32 . O sea si:

PROCESSENTRY32 proEntry;
MODULEENTRY32 modEntry;

modEntry.th32ProcessID=proEntry.th32ProcessID;

Pero quedaria muy horrible y ademas no responderia el porque me muestra siempre un valor.
#154
Que tal , esperaba tu respuesta jaja. Fijate de compilarlo y correrlo. Hace todo bien hasta busca los modulos en los diferentes procesos como quiero. El tema es que no se porque cuando lo imprimo me imprime siempre el mismo proceso.

Ejemplo burdo:

PID:3911
Exe:apache.exe

kernel32.dll pathdekernel32 912(Aqui esta el problema)
user32.dll pathuser32 912

PID:3222
Exe:justina.exe

kernel32.dll pathkernel32 912
user32.dll pathuser32 912
DLL'S DIFERENTES AL ANTERIOR PROCESO

asi con todos los procesos.

Muy raro no? No es realmente un problema , pero no realiza lo correcto y nose porque.

Saludos!
#155
Pense igual que vos UND3R pero... podes encontrar muchos MZ , como identificas si es una dll o tu programa?Hay varios en un mismo proceso.

Offtopic:http://www.patterndiagnostics.com/Training/Accelerated-Memory-Dump-Analysis-Version3-Public.pdf Mirenlo esta interesante.
#156
Gracias por las aclaraciones.

¿Tenes idea como llegar hasta el ImageBase desde memoria?(Aclaro:Sin fijarme en el archivo del disco duro)
#157
Tenia algo de tiempo y me puse a repasar algunas cosas

Aca el codigo:


HANDLE snapshot,snapshotModule=NULL;

PROCESSENTRY32 processEntry;
MODULEENTRY32 moduleEntry;
if((snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0))==NULL){
printf("\n%s","FAIL!!!!SNAPSHOTCREATE");
return 0;

}

processEntry.dwSize=sizeof(PROCESSENTRY32);
moduleEntry.dwSize=sizeof(MODULEENTRY32);

while(Process32Next(snapshot,&processEntry)==TRUE)
{
printf("\nPID:%d\nExe:%s\n",processEntry.th32ProcessID,processEntry.szExeFile);
if(snapshotModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processEntry.th32ProcessID))
{
while(Module32Next(snapshotModule,&moduleEntry)==TRUE)
printf("%s %s %d\n",moduleEntry.szModule,moduleEntry.szExePath,moduleEntry.th32ProcessID);
}
}

return 0;




->gcc.exe archivo.c -o archivo . OK
->archivo.exe | more

Ok. Fijense que me devuelve siempre el mismo PID en los modulos... Ese es el problema y no entiendo porque.

Saludos.
#158
Que tal karmany?

Mira , lo que hago es :

Tengo un binario con formato PE.
Lo abro con un editor hexadecimal o alguna tool que me facilite la lectura de los encabezados PE.
Voy a OPTIONAL_HEADER , Obtengo el valor del ImageBase.

Ok. Suponole que es 0x00400000.

Entonces , se supone que el Loader , va a buscar en el encabezado este valor y tratara de cargarlo en esa Direccion de Memoria Virtual. Todo ok hasta aca.

Entonces , solo de curioso , me puse a ver si conseguia obtener este header desde memoria. Ok.
Abro archivo . CreateFile()
Mapeo.CreateFileMapping()
Dame La direccion del mapeo.. MapViewOfFile()

La duda es: Esa direccion de mapeo ,¿es la direccion donde se encuentra el DOS_HEADER en memoria?Si asi lo es , tendria que ser igual al ImageBase.

Voy a probar con varios , quizas , esa direccion (ImageBase) justo estaba ocupada y el loader tuvo que cargarlo en otro lugar.Segun recuerdo el ImageBase es la direccion virtual de preferencia, pero puede que este ocupada y se cargara en otro lugar.


Pregunta 2:

Toy tratando de hacer algo parecido en un proceso remoto.¿Alguna idea?

Yo pense en algo asi:

OpenProcess() ->Obtengo handle del proceso.
Aca el problema , ¿Como obtener la ubicacion exacta donde esta cargado el binario en memoria?

Se me habia ocurrido checkear el archivo en disco , buscar el ImageBase , y apartir de ahi hacer un ReadProcessMemory , si existe el MZ es que estamos bien ubicados.
Igual la idea es hacerlo sin abrir el archivo en disco.

Bueno Una vez obtenido la posicion inicial , ya se donde esta todo el resto.Hago un WriteProcessMemory y listo.
#159
Regla N°2:Usar positivamente las cosas negativas que te digan , para demostrar lo contrario.Todos lo que te digan que no podes , son aquellos que no pudieron , ni pueden.

Pasos para saber algo:

Aprende programacion estructurada(Cualquier lenguaje , pero , recomiendo C)
Aprende Assembly para la arquitectura x86.
Aprende Diseño y Implementacion de S.O
Aprende programacion orientada a objetos(Cualquier lenguaje , pero recomiendo JAVA porque te obliga a utilizar si o si orientado a objetos , tambien podes con C++ pero eres libre de programar orientado a objetos o no)
Aprende bases de datos sql(Empeza con MySQL. Luego metele a MSSQL , Oracle , etc)
Aprende Unix(Si queres GNU/Linux , aunque no sea puro Unix. Despues pasate por OpenBSD asi aprendes algo de los basados en bsd)

Bueno ahora que tenes una base mas o menos

Empeza con exploiting(Buffer Overflows , ya sea Stack Overflow o Heap Overflow,Integer Overflows,Format Strings,Protecciones(NX,ASLR,StackGuard,etc),Bypass Protecciones,Kernel Overflows,etc...)

Metele a la seguridad web , aprende a programar a nivel web(Recomiendo PHP).SQLi,XSS,RFI,LFI,RCE,HTTP Methods,etc.(Googlea OWASP)

Aprende Criptografia,redes y un monton de cosas mas... Esto es muy amplio.(Falta toda la parte de malware , reversing y otras mas).

Practica con WarGames,CTF ...
Ejemplos:
http://www.exploit-exercises.com/
https://media.defcon.org/
http://overthewire.org/wargames/

Saludos!

PD:No tenes que buscar maestro.Al no tenerlo vas a desarrollar la habilidad de investigacion que es muy importante en este campo.
#160
¿Si modifico el OPTIONAL_HEADER , el DLL_CHARACTERISTICS exactamente , quedaria deshabilitado totalmente el ASLR del binario?

PD:Estoy hablando del formato de binario PE.
PD2:Si , ya lo comprobe , queda deshabilitado.
Saludos!

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

Consulta 2

Tengo lo siguiente:


#include <stdio.h>
#include <windows.h>

int main(int argc,char**argv)
{
PIMAGE_DOS_HEADER dosHeader;
PIMAGE_NT_HEADERS ntHeader;
HANDLE handleArchivo,mapeadoArchivo=NULL;
LPVOID direccionMapeado=NULL;
char nombreArchivo[MAX_PATH];

printf("Ingrese el archivo:");
scanf("%s",nombreArchivo);

/*
HANDLE WINAPI CreateFile(
 _In_      LPCTSTR lpFileName,
 _In_      DWORD dwDesiredAccess,
 _In_      DWORD dwShareMode,
 _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
 _In_      DWORD dwCreationDisposition,
 _In_      DWORD dwFlagsAndAttributes,
 _In_opt_  HANDLE hTemplateFile
);
*/

handleArchivo=CreateFile(nombreArchivo,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(handleArchivo==INVALID_HANDLE_VALUE)
{
printf("\n%s\n","Error!");
return 0;
}
/*
HANDLE WINAPI CreateFileMapping(
 _In_      HANDLE hFile,
 _In_opt_  LPSECURITY_ATTRIBUTES lpAttributes,
 _In_      DWORD flProtect,
 _In_      DWORD dwMaximumSizeHigh,
 _In_      DWORD dwMaximumSizeLow,
 _In_opt_  LPCTSTR lpName
);
*/


mapeadoArchivo=CreateFileMapping(handleArchivo,NULL,PAGE_READONLY,0,0,NULL);
if(!mapeadoArchivo)
{
printf("\n%s\n","Error!");
return 0;
}

/*
LPVOID WINAPI MapViewOfFile(
 _In_  HANDLE hFileMappingObject,
 _In_  DWORD dwDesiredAccess,
 _In_  DWORD dwFileOffsetHigh,
 _In_  DWORD dwFileOffsetLow,
 _In_  SIZE_T dwNumberOfBytesToMap
);

*/

direccionMapeado=MapViewOfFile(mapeadoArchivo,FILE_MAP_READ,0,0,0);

dosHeader=(PIMAGE_DOS_HEADER)direccionMapeado;

printf("\n%x MZ , PE Header offset :0x%x\n",dosHeader->e_magic,dosHeader->e_lfanew);

ntHeader=(PIMAGE_NT_HEADERS)(direccionMapeado+dosHeader->e_lfanew);

printf("PE SIGNATURE:%x Machine:%x",ntHeader->Signature,ntHeader->FileHeader.Machine);
printf("\nDireccion Mapeado:%x   ImageBase:%x",direccionMapeado,ntHeader->OptionalHeader.ImageBase);


char a[MAX_PATH];
scanf("%s",a);

}



Funciona lo mas bien , no tiene mucha vuelta. Mi pregunta es , ¿porque la direccion de mapeado es diferente al ImageBase?Segun tengo entendido el ImageBase es la direccion que le indicamos al loader donde empezar a mapear.La unico que se me viene es que justo haya estado ocupado ese lugar y el loader haya asignado otra direccion. Aclarenme esto.
Gracias