[SRC] andom_access_array - Evitar patrones de lectura/escritura

  • 3 Respuestas
  • 3401 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Karcrack

  • *
  • Underc0der
  • Mensajes: 87
  • Actividad:
    0%
  • Reputación 0
  • Se siente observado ¬¬'
    • Ver Perfil
Código: C++
  1. #ifndef __RA_ARRAY__
  2. #define __RA_ARRAY__
  3.  
  4. #include <intrin.h>
  5. #define ULONG unsigned long
  6.  
  7. template <typename T>
  8. class random_access_array{
  9.     const ULONG elements;
  10.     const ULONG R;
  11.     ULONG       a;
  12.     ULONG       c;
  13.     T*          buffer;
  14.  
  15.     const ULONG nextPowerOf2(ULONG n)const{
  16.         if ((n & (n - 1)) == 0)
  17.             return n;
  18.  
  19.         n |= (n >> 1);
  20.         n |= (n >> 2);
  21.         n |= (n >> 4);
  22.         n |= (n >> <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />;
  23.         n |= (n >> 16);
  24.         return n + 1;
  25.     }
  26.  
  27.     ULONG LCG(ULONG X, ULONG a, ULONG c, ULONG R){
  28.         return (a*X + c) % R;
  29.     }
  30.  
  31.     ULONG randmax(ULONG max){
  32.         return LCG((ULONG) __rdtsc(), 0x43FD43FDUL, 0xC39EC3UL, max);
  33.     }
  34.  
  35.     size_t getRealIdx(int index){
  36.         ULONG X = 0;
  37.         while (index-- >= 0)
  38.             while ((X = LCG(X, a, c, R)) >= elements){}
  39.  
  40.         return X;
  41.     }
  42.  
  43. public:
  44.     random_access_array(T* buffer, size_t elements) : elements(elements), buffer(buffer), R(nextPowerOf2(elements)){
  45.         a = 2 * randmax(R / 2) + 1;
  46.         c = 4 * randmax(R / 4) + 1;
  47.     }
  48.  
  49.     random_access_array(T* buffer, size_t elements, ULONG a, ULONG c) : elements(elements), buffer(buffer), R(nextPowerOf2(elements)), a(a), c(c){}
  50.  
  51.     T& operator [](size_t i){
  52.         return buffer[getRealIdx(i)];
  53.     }
  54.  
  55.     T  operator [](const size_t i) const{
  56.         return buffer[getRealIdx(i)];
  57.     }
  58. };
  59.  
  60. #endif//__RA_ARRAY__

Ejemplo de uso:
Código: C++
  1.     #define SIZE 573
  2.  
  3.     random_access_array<int> ra(new int[SIZE], SIZE);
  4.  
  5.     for (int i = 0; i < SIZE; i++)
  6.         ra[i] = i;
  7.  
  8.     for (int i = 0; i < SIZE; i++)
  9.         cout << ra[i] << endl;

Utilidad real:
Código: C++
  1.     #define SIZE sizeof(s) - 1
  2.  
  3.     char s[] = "!eru!akklccr !rza";
  4.  
  5.     random_access_array<char> ra(s, SIZE, 5, 25);
  6.  
  7.     for (int i = 0; i < SIZE; i++)
  8.         cout << ra[i];

Saludos :)
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Desconectado [L]ord [R]NA

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • H-Sec
  • Skype: lordrna
  • Twitter: lordrna
    • Ver Perfil
Pense que lo harias de manera mas inteligente... No validas la longitud del array dentro del template.

Desconectado Karcrack

  • *
  • Underc0der
  • Mensajes: 87
  • Actividad:
    0%
  • Reputación 0
  • Se siente observado ¬¬'
    • Ver Perfil
¿Como voy a validar el tamaño del array? Es el usuario quien me lo da.

Si el índice que se pasa es superior al tamaño no importa ya que si te fijas verás que getRealIdx() sólo devuelve un índice dentro del rango.
No habría jamás un buffer overflow.
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Desconectado [L]ord [R]NA

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • H-Sec
  • Skype: lordrna
  • Twitter: lordrna
    • Ver Perfil
:P no habia visto la validación.

 

[SNIPPET-CONFIG] Lectura de configuración binaria

Iniciado por Karcrack

Respuestas: 0
Vistas: 2473
Último mensaje Junio 16, 2013, 06:32:03 pm
por Karcrack