|
1
|
Seguridad Informática / Análisis y Diseño de Malware / pregunta sobre runPE en windows 10 basado en talleres antiguos del foro
|
en: 27 Febrero 2018, 03:27 am
|
Hola Estaba tratando de recrear el runPE que The Swash hizo una vez, quería ver si todavia funcionaba en Windows 10 y al parecer si, agregue una sección y notepad sigue funcionando. Pero me quedé con la idea de como se ejecutaba código, así que buscando en el foro, retomaron varios talleres y hay uno de Ferchu donde explica una manera de ejecutar código mediante opcodes, pero hay algo que no entendí, yo sé que la mejor manera es con programación pero siempre se me ha hecho más interesante saber como funcionan las cosas manualmente. Bueno, les explico. el menciona que agrega un registro y modifica algunas cosas El metodo para agregar la sección es igual que en el capitulo anterior, pero con la diferencia que ahora en vez de desvincular la "Bound Import Table", lo que vamos a hacer es un truquito que consiste en bajar la cabecera PE 0x28 bytes, para tener lugar para definir nuestra sección sin pisar la tabla. Al bajar la cabecera pisamos datos que no son importantes. Luego solo modificamos en offset PE, y listo, agregamos la sección sin desvincular la tabla.
Los datos a modificar en la cabecera entonces son:
Nombre Valor Tamaño offset PE: 0xE0 - 0x28 = 0xB8 (4 bytes) NumberOfSections: 0x0004 (+1) (2 bytes) AddressOfEntryPoint: 0x00014031 (4 bytes) SizeOfImagebase: 0x00014050 (4 bytes)
Como notaran, ahora modificamos el OEP, con el de nuestro codigo (como ya tengo el codigo echo ya se que empiza en esa dire), y debemos anotar el OEP original del programa para hacer un salto luego de que nuestro codigo finalize, para que comienze el programa normalmente. Lo cual elimina 0x28 bytes de la zona donde no hay nada o solo garbage, despues agrega esos 0x28 bytes para agregar la nueva sección y no modificar el archivo, sino queda inservible, después agrega la nueva sección. A SizeOfImageBase le agrega los 50 bytes de la sección o eso creo. En el código de ASM solo le agrega un jmp a donde inicia la ejecución normal, por ejemplo... en el ejemplo de Ferchu, la ejecución es en el offset 0x9D730000 e ImageBase 0x00000001 Entonces yo lo que haría es algo así [BITS 32] jmp short cmd init: mov edx,7634e695h call edx mov edx,76312acfh call edx mov eax, 0x010739D jmp eax cmd: CALL init db 'cmd',00h
lo que significa que es AddressOfEntryPoint + ImageBase = 0x010739D Pero aqui viene mi duda, ¿no entiendo donde Ferchu consiguió este dato?, ¿de dondé sacó 0x00014031? AddressOfEntryPoint: 0x00014031 (4 bytes) quiero imaginar que abrio con ollydbg su codigo en asm, y 0x00014031 es la dirección de donde inicia Cadena titulo "Soy el notepad y estoy infectado!!!\0" Cadena msg "Infectado!!!\0" call [siguiente instruccion] E8 00 00 00 00 pop eax 58 push 0 6A 00 sub eax, 0x12 2C 12 push eax 50 sub eax, 0x24 2C 24 push eax 50 push 0 6A 00 mov eax, 0x77D5050B B8 0B 05 D5 77 // B8 + direccion de MessageBoxA call eax FF D0 mov eax, 0x010739D B8 9D 73 00 01 // B8 + entry point jmp eax FF E0
¿Alguien sabe si 0x00014031 será la posición en memoria de "call [siguiente instruccion] E8 00 00 00 00"? o de donde saco 0x00014031?, a ver si alguien recuerda, y es que no puedo abrir cosas con ollydbg porque no me funciona aunque lo seguiré intentando, y casi no le entiendo a Windbg y con gdb pues no logro saber si funciona y no me gusta wine para cosas de windows. Ya se que es un metodo muy viejo, y practicamente los AV ya lo detienen y etc... pero me dio por repasar esto tan antiguo y tratar de hacerlas funcionar en Windows 10, ya es lo unico que me falta para intentar con nasm, espero me puedan ayudar Saludos
|
|
|
2
|
Programación / Programación C/C++ / problema con dll's en windows 8.1 pro y error en vinculación toupper
|
en: 5 Marzo 2016, 19:26 pm
|
Hola
¿A alguno de ustedes les ha pasado que en windows 8.1 pro les marca que les faltan dll's?
Lo que pasa es que hice un programa en C, compila correctamente y todo, en windows 10 se ejecuta bien, pero cuando intenté usarlo en un windows 8.1 pro, me aparece que necesito las librerías ms-win-crt-*; descargo todas las que me pide y cuando lo ejecuto me dice que no se puede vincular toupper con el programa
intenté intalando las herramientas de VC++ que mencionan en windows update sobre windows 8.1, pero tampoco me arregló el problema
¿alguien sabe como podría hacerlo funcionar?
|
|
|
3
|
Seguridad Informática / Nivel Web / como puedo visualizar los datos de un sql completos?, y como guardarlo en un txt
|
en: 19 Julio 2014, 23:01 pm
|
hola
como puedo visualizar los datos de un sql completos?, estuve haciendo pruebas con un php que hice pero me muestra solo una parte, por ejemplo
nombre, edad, horario entrada, horario salida, trabajo for key 'group_key'
en firefox asi me aparece....
juan penas de azares, 23, horario de en' for key 'group_key'
y quiero vizualizar todo... hay alguna forma de hacerlo?, o de que forma podria hacerlo mediante consola de comandos? o minimo en firefox
juan penas de azares, 23, horario de entrada 2 horas, horario de salida 21 horas, videojuegos for key 'group_key'
uso linux, por cierto, lo intente con wget pero me menciona que el link es demasiado largo, queria tomar el resultado y guardarlo en algun archivo de texto
salu2
|
|
|
5
|
Programación / Programación C/C++ / como hacer la conversión de hexadecimales a UTF?
|
en: 6 Marzo 2014, 21:06 pm
|
hola bueno, por fin tendré un tiempo para seguir con un programa que estoy haciendo, quise pedir ayuda a algún maestro pero aunque me entendían, no tienen idea de como hacer algo que pedía... así que me tendré que apoyar nuevamente en la ayuda de este foro para continuar, espero no ser una molestia bueno, anteriormente me quede con un código donde podía empezar a leer los datos de MFT que es la tabla donde se guarda la información de los archivos que se encuentran en una unidad pero están codificados y necesito decodificarlos a UTF-8 o UTF-16, hace tiempo me hicieron entender que convertir código de VB a C no es muy recomendable (y es cierto), y la mayoría de ejemplos que encuentro son para VB.net o C#, y utilizan mucho una función llamada Encoding utf8 que ya lo hace automáticamente y la mayoría de información que encontré fue en Wikipedia, la otra fue de ejemplos como mencione anteriormente, pero no se si no estoy buscando bien o casi no hay información me podrían ayudar diciéndome de que manera debería buscar en google sobre conversion de hexadecimales a UTF? porque no creo que haya tan poca documentación sobre eso en C o alguien conoce ejemplos o si alguien sabe como hacerlo, me podrían explicar como es la conversión de hexadecimales a UTF-8 o 16 porque aquí esta la tabla con la información del primer archivo, en este caso, seria el nombre, fecha de creación, etc, etc... $FileName 0x30 0x00 0x00 0x00 0x68 0x00 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x00 0x03 0x00 0x4A 0x00 0x00 0x00 0x18 0x00 0x01 0x00 0x05 0x00 0x00 0x00 0x00 0x00 0x05 0x00 0xC7 0xE6 0xC2 0x91 0x93 0x7B 0xCE 0x01 0xC7 0xE6 0xC2 0x91 0x93 0x7B 0xCE 0x01 0xC7 0xE6 0xC2 0x91 0x93 0x7B 0xCE 0x01 0xC7 0xE6 0xC2 0x91 0x93 0x7B 0xCE 0x01 0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x03 0x24 0x00 0x4D 0x00 0x46 0x00 0x54 0x00 0x00 0x00 0x00 0x00 0x00 0x00 según wikipedia hay que modificar algunos bits pero no comprendí muy bien encontré un programa forense para decodificar la fecha, pero no tiene código libre así que no logre saber como lo hace pero puedo asegurar que aquí esta la información necesaria espero alguien sepa sobre esto y me pueda pasar algo de información salu2
|
|
|
6
|
Programación / Programación C/C++ / no funciona ReadFile y overlapped
|
en: 4 Febrero 2014, 00:48 am
|
hola tengo un problema con Readfile d1 = (DWORD*)&crbig; overlapped.Offset = d1[1]; overlapped.OffsetHigh = d1[0]; ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
tengo a crbig que es igual a 322122547 los coloco en overlapped low y high offsethigh = 00000003 offset = 22122547; supuestamente ReadFile deberia leer los datos de la unidad hDevice, en este caso 1024 bytes y deberia empezar a leer desde donde le digo a overlapped que lo haga al inicio lo hago de esta manera ya que quiero leer el inicio de la unidad ZeroMemory(&overlapped ,sizeof(OVERLAPPED)); hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if(hDevice != INVALID_HANDLE_VALUE){ ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped); }
si coloco un for de esta manera para saber que aparecio, me salen los bytes sin probemas en un printf for (int n=0; n<sizeof(buff); n++) { }
pero despues es cuando modifico overlapped y uso por segunda vez ReadFile d1 = (DWORD*)&crbig; overlapped.Offset = d1[1]; overlapped.OffsetHigh = d1[0]; ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
pero me siguen apareciendo los mismo bytes en el for(), ya intente antes de usar por segunda vez ReadFile, borrar el buffer usando memset e incluso usando un buffer diferente, pero me sigue mostrando lo mismo y supuestamente como les mencione, deberia avanzar hacia donde overlapped dice, deberia leer los 1024 bytes de esa zona, y lo que deberia pasar es que el for me deberia mostrar otros bytes, pero no parece funcionar alguien sabe o tiene alguna idea de porque no funciona? salu2
|
|
|
7
|
Programación / .NET (C#, VB.NET, ASP) / podrian decirme si la conversion de VB.net a C lo hice bien?
|
en: 1 Febrero 2014, 05:41 am
|
hola Estoy tratado de pasar un codigo de VB.NET a C, pero hay unas cosas que no logro enteder, entre ellas una funcion llamada Bitconverter, me podrian ayudar analizando los codigos y decirme si lo estoy haciendo bien? segun MSDN Bitconverter.ToInt sirve para avanzar a cierto offset y tomar bytes, por ejemplo bitconverter.ToInt32(buffer, 11) aqui supuestamente avanzaria al offset 0xB, toma 4 bytes desde el offset 0xB, los cambia a big-endian y lo devuelve en un array de bytes tampoco se si estoy haciendo bien lo de BitConverter.GetBytes Esto es lo que hay en la multiplicacion MFTCluster * SectperCluster * BytesPerSect = 322122547 SetReadFileOffset(NO, MFTCluster * SectperCluster * BytesPerSect) Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64) Dim lowoffset() As Byte = BitConverter.GetBytes(curBig) Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0) Dim high As Int32 Dim lastbytes(3) As Byte Array.Copy(lowoffset, 4, lastbytes, 0, 4) high = BitConverter.ToInt32(lastbytes, 0) NO.OffsetLow = highoffset NO.OffsetHigh = high End Sub
Y este es el codigo que yo hice, endianhextodec lo hice para simular lo que haria Bitconverter.ToInt32 long endianhextodec(BYTE *buffers, int offs){ BYTE tmp[1] = {0}; if(offs == 0){ tmp[0] = buffers[0]; tmp[1] = buffers[1]; tmp[2] = buffers[2]; tmp[3] = buffers[3]; return tmp[3] << 24; } } setreadfileoffset(overlapped, (sectperclusters * (bytespercluster * MFTCluster))); void setreadfileoffset(OVERLAPPED overlap, INT64 crbig ){ BYTE *lowoffset = (BYTE *)malloc(sizeof(crbig )); INT32 higoffset = endianhextodec(lowoffset, 0); INT32 high; BYTE lastbytes[3]; for(int i = 0; i < 4; i++){ for(int n = 4; n > 0; n--){ lastbytes[i] = lowoffset[n]; } } high = endianhextodec(lastbytes, 0); overlap.Offset = higoffset; overlap.OffsetHigh = high; }
espero puedan decirme si lo encuentran bien o estoy totalmente equivocado salu2
|
|
|
8
|
Programación / Programación C/C++ / es posible concatenar un array byte?
|
en: 31 Enero 2014, 06:33 am
|
hola
alguien sabe como podria o si es posible concatenar bytes de un mismo array, por ejemplo
BYTE *buffer[2] = {0x00, 0x02}
me gustaria poder concatenarla pero al reves para que quede asi... 0x200, porque necesito cambiar ese valor a decimal, que serian 512 y guardarlo en algun integer
lo intente con strcpy, strcat y memcpy pero no me funcionan porque el buffer es BYTE y aun haciendo cast (char) me tira error
alguien sabe alguna forma de lograr juntar los hexadecimales del array?, porque tambien necesito hacerlo con arrays mas grandes por ejemplo
buff = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00}
y necesito que quede asi 0x20000 para poder convertirlo en decimal
aguna idea o ejemplo que me puedan dar porfavor.
|
|
|
9
|
Programación / Programación C/C++ / como encontrar offsets de MFT para cambiar los bytes en decimales?
|
en: 30 Enero 2014, 09:12 am
|
hola pues ya logre avanzar con un programa que estoy intentando hacer, despues de re-leer, hice un pequeño avance, pero tengo un problema a ver que opinan segun MSDN hay dos maneras de analizar la unidad C, ya sea "\\.\C:", "\\.\C:\" o "\\\\.\\PhysicalDrive0" En visual basic algunos programadores hacen esto "\\.\" & Mid(Drive, 1, 2) donde Drive es "C:\" supuestamente deberia quedar asi... "\\.\C:"... pero al colocarlo de esa forma en el programa ya no funciona, de igual forma en C tampoco funciona en C la unica forma que me funciona es usando "\\\\.\\PhysicalDrive0", pero tengo la duda de si funcionara o no, supuestamente si me esta funcionando, porque recibo datos, pero no se si haya alguna diferencia o porque razon en VB solo funcione si utilizan Mid, por que si hay alguna, entonces el programa falla desde el principio pero no me he dado cuenta, y me gustaria saber que opinan o si podrian compilar mi codigo y decirme si a ustedes le funciona "\\.\C:" o si es normal y solo les funciono PhysicalDrive0, mas abajo colocare mi codigo ahora tengo otro problema, necesito la informacion de los clusters, hay estructuras que puedo usar para saber esto pero no hay para algunas cosas que necesito, pero segun un codigo de VB que analice, se pueden conseguir 3 datos que necesito analizando los datos recibidos con ReadFile Aqui dejo una tabla de los datos que mencionare Offset Size Description 0x0000 3 Jump to the boot loader routine 0x0003 8 System Id: "NTFS " 0x000B 2 Bytes per sector 0x000D 1 Sectors per cluster 0x000E 7 Unused 0x0015 1 Media descriptor (a) 0x0016 2 Unused 0x0018 2 Sectors per track 0x001A 2 Number of heads 0x001C 8 Unused 0x0024 4 Usually 80 00 80 00 (b) 0x0028 8 Number of sectors in the volume 0x0030 8 LCN of VCN 0 of the $MFT 0x0038 8 LCN of VCN 0 of the $MFTMirr 0x0040 4 Clusters per MFT Record (c) 0x0044 4 Clusters per Index Record (c) 0x0048 8 Volume serial number los valores que necesito son el offset 0x0B 0x0D y 0x30 el codigo de VB usa una funcion llamaba bitconverter, que busca un offset y los valores los cambia a decimal el offset Bytepersector lo puedo sacar con una estructura, tambien tengo entendido que en NTFS un cluster tiene 512 bytes, y eso son 8 sectores, y me faltaria encontrar LCN of VCN 0 of the $MFT Supuestamente al leer los datos de la unidad, se puede saber eso unicamente llendo al offset y tomando los valores dependiendo del tamaño, y en la tabla esta el tamaño de cada offset Pero mi problema es que no logro encontrar el offset para tomar el valor hexadecimal y convertirlo en decimal, aqui es donde tambien incluyo el problema anterior, no se si no los encuentro porque CreateFile no abre la unidad C: o es porque no estoy interpretando bien los datos El resultado los compare con un codigo fuente de https://code.google.com/p/datarecover/ y obtengo el mismo resultado al ejecutar el programa, los dos me dan los mismo hexadecimales, aunque yo lo programe diferente En VB me arroja este resultado Bitconverter donde busca los offset y convierte en decimal los bytes 512 8 786432 Pero leyendo los datos que me arroja buffer, no logro encontrar esa informacion Me gustaria saber si alguien aqui podria ayudarme a encontrar la manera de saber donde se encuentran esos offset y como debo buscarlos para despues cambiar de hexadecimal a decimal espero me puedan ayudar salu2 #include <Windows.h> #include <winioctl.h> #include <stdio.h> #include <stdlib.h> #define zwpath L"\\\\.\\PhysicalDrive0" int main(int argc, char *argv[]){ HANDLE hDevice; OVERLAPPED overlapped; BYTE buff[1024] = {0}; DWORD numerobyte = 0; UINT32 ret; ZeroMemory(&overlapped, sizeof(OVERLAPPED)); hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if(hDevice != INVALID_HANDLE_VALUE){ ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped); }else { return NULL; } if(ret == 0){ ret = WaitForSingleObject(hDevice,INFINITE ); switch (ret) { case WAIT_OBJECT_0:break; case WAIT_TIMEOUT:break; default: break; } } else { return NULL; } CloseHandle(hDevice); for (int n=0; n<sizeof(buff); ++n) { } }
|
|
|
10
|
Programación / Programación C/C++ / como pasar la funcion BitConverter de VB.NEt a C?
|
en: 28 Enero 2014, 20:25 pm
|
hola
tengo un array byte donde guardo informacion guardada por ReadFile, por ejemplo
BYTE buffer[1024]
ReadFile(HFile, buffer, sizeof(buffer), 0);
en VB.net hay una funcion que te convierte bytes en enteros se llama Bitconverter.ToInt16, lo que supuestamente hace es buscar un offset y lo que haya en ese offset lo convierte en decimal
por ejemplo
offset = &HD
BitConverter.ToInt16(buffer, offset)
alli, hasta donde yo se, es que busca en el array BYTE buffer el offset o hexadecimal que en este caso seria 0x0D, y el contenido alli lo cambia a decimal
por ejemplo
primero busca en el array 0x0D, cuando lo encuentra hay un valor que es 0x08 y lo convierte a decimal que igual seria 8, pero puede cambiar el valor, podria ser 0xAF, 0x13, etc...
Entonces quisiera saber como podria leer el array BYTE para encontrar el offset y hacer la conversion de hexadecimal a decimal de lo que haya en cierto offset pero en codigo C
porque Bitconverter convierte dependiendo la base, por ejemplo Int16 convierte los dos primeros bytes, int32 convierte los 4 primeros bytes y int64 convierte los 8 primeros bytes
entonces si por ejemplo en el offset 0x0B hay un valor 0x0102, como encontraria el offset 0x0B para cambiar el valor 0x0102 de hexadecimal a decimal?
me podrian poner algun ejemplo porfavor
|
|
|
|
|
|
|