Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Karcrack

#1
Muy buena iniciativa ;D Suerte a los participantes :-*
#2
Yo soy más de escribir los opcodes de mis instrucciones directamente sobre el sector de HDD usando un imán.
#3
Respiro hondo y me preparo para escribir sobre el que como muchos sabréis fue mi primer lenguaje.

En mi opinión aprender un lenguaje te enriquece sea el que sea. No importa lo poco popular o antiguo que sea. Cada lenguaje te enseña una forma distinta de indicarle a la máquina qué hacer. Cada lenguaje tiene sus particularidades y aprenderlas te abrirá la mente.

Un lenguaje de programación no es más que una herramienta para resolver un problema.
Seleccionar la apropiada depende de ti. Es por eso que no aprender un lenguaje es perder la oportunidad de tener una herramienta extra en tu arsenal.



Hablando particularmente sobre VB6:
{Aclaro que me refiero a la experiencia de programar usando el compilador de MS. Si hablase únicamente sobre el lenguaje me atendría a la sintaxis y la especificación del mismo.}

Tiene una curva de aprendizaje excelente. Basta abrir el IDE arrastrar un par de controles, hacer doble click en ellos y estar listo para programar en un evento.
Las capas de abstracción que otorga son muy útiles para nuevos desarrolladores pero todo eso tiene un coste; te acostumbra a lo fácil.

La peor parte con diferencia es lo mal que ha envejecido el compilador. Es seguramente el compilador más estúpido que se esté utilizando hoy en día. Incapaz de realizar las optimizaciones más simples y limitando el acceso al programador avanzado a características internas de la implementación. En mi opinión un compilador moderno debe de tener un backend en LLVM o como mínimo permitir sacar ensamblados.

Para finalizar mi mensaje añadiré que si bien creo que conocer el lenguaje, ser capaz de leerlo no hará daño a nadie y otorgará una herramienta de desarrollo rápido, no creo que nadie deba usar VB6 como su lenguaje principal. Pero otra vez, todo depende del problema y el uso que vayas a darle.

Mi recomendación es que aprendan otros lenguajes que compilan a binario con sintaxis BASIC como freebasic que es prácticamente compatible con código VB6.



Podría escribir mucho más pero creo que eso sintetiza mi opinión. Ojalá alguien más se anime a participar y abriendo debate pueda continuar expandiendo mi opinión :)

Saludos! Happy coding ;D
#4
Visual Basic / Re:NtTerminateProcess Hook
Septiembre 29, 2013, 03:32:06 PM
A mí me hookea a la perfección. Para comprobar si hookea aplica el hook y haz attach a el proceso desde el Olly.

Igualmente deberías devolver STATUS_ACCESS_DENIED en lugar de STATUS_SUCCESS...
#5
Visual Basic / Re:NtTerminateProcess Hook
Septiembre 24, 2013, 04:34:48 AM
A mí me funciona perfectamente.

Comprueba que tu antivirus no esté deshaciendo el hook para meter el suyo. Algunos AVs como Avast tienen hooks en userland, interceptando las llamadas al sistema.

Para comprobar que te hookea correctamente abre un proceso en el OllyDbg luego desde el código hookeas. Te vas al OllyDbg y actualizas la memoria.

Saludos
#6
¿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.
#7
Código: cpp
#ifndef __RA_ARRAY__
#define __RA_ARRAY__

#include <intrin.h>
#define ULONG unsigned long

template <typename T>
class random_access_array{
    const ULONG elements;
    const ULONG R;
    ULONG       a;
    ULONG       c;
    T*          buffer;

    const ULONG nextPowerOf2(ULONG n)const{
        if ((n & (n - 1)) == 0)
            return n;

        n |= (n >> 1);
        n |= (n >> 2);
        n |= (n >> 4);
        n |= (n >> 8);
        n |= (n >> 16);
        return n + 1;
    }

    ULONG LCG(ULONG X, ULONG a, ULONG c, ULONG R){
        return (a*X + c) % R;
    }

    ULONG randmax(ULONG max){
        return LCG((ULONG) __rdtsc(), 0x43FD43FDUL, 0xC39EC3UL, max);
    }

    size_t getRealIdx(int index){
        ULONG X = 0;
        while (index-- >= 0)
            while ((X = LCG(X, a, c, R)) >= elements){}

        return X;
    }

public:
    random_access_array(T* buffer, size_t elements) : elements(elements), buffer(buffer), R(nextPowerOf2(elements)){
        a = 2 * randmax(R / 2) + 1;
        c = 4 * randmax(R / 4) + 1;
    }

    random_access_array(T* buffer, size_t elements, ULONG a, ULONG c) : elements(elements), buffer(buffer), R(nextPowerOf2(elements)), a(a), c(c){}

    T& operator [](size_t i){
        return buffer[getRealIdx(i)];
    }

    T  operator [](const size_t i) const{
        return buffer[getRealIdx(i)];
    }
};

#endif//__RA_ARRAY__


Ejemplo de uso:
Código: cpp
    #define SIZE 573

    random_access_array<int> ra(new int[SIZE], SIZE);

    for (int i = 0; i < SIZE; i++)
        ra[i] = i;

    for (int i = 0; i < SIZE; i++)
        cout << ra[i] << endl;


Utilidad real:
Código: cpp
    #define SIZE sizeof(s) - 1

    char s[] = "!eru!akklccr !rza";

    random_access_array<char> ra(s, SIZE, 5, 25);

    for (int i = 0; i < SIZE; i++)
        cout << ra[i];


Saludos :)
#8
En 32bits la convención de llamada de las APIs de Windows es stdcall... Debes hacer push de los parámetros en lugar de meterlos en eax, ebx, ecx, edx...

Ejemplo de fix:
Código: php
push 0h
push SIZEOF sbuff
push offset sbuff
push Socket
call send
#9
Códigos Fuentes / Re:NanoInvoke
Septiembre 13, 2013, 12:22:43 AM
Es la forma más corta que llamar a un API de forma dinámica que encontrarás :P

La shellcode de unos 90bytes se encarga de recorrer el SAFEARRAY de VARIANTs metiendo en el stack los parámetros para el API. Además busca en la IAT del proceso la importación de DllFunctionCall() para obtener el puntero del API. (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)
#10
Códigos Fuentes / NanoInvoke
Septiembre 12, 2013, 11:05:30 PM
Código: vb
'USER32
Private Declare Function CallWindowProcW Lib "USER32" (ByRef first_asm As Currency, ByRef params() As Variant, ByVal lib As String, ByVal fnc As String, Optional ByVal null0 As Long = 0) As Long
'---------------------------------------------------------------------------------------
' Author : Karcrack
' Date   : 12092013
' Credits: sonykuccio (http://hackhound.org/forums/topic/2790-vb6asm-%C2%B5callapi/)
'---------------------------------------------------------------------------------------

Public Function NanoInvoke(ByRef sLib As String, ByRef sFnc As String, ParamArray params() As Variant) As Long
    Dim asm(11)     As Currency
    Dim p()         As Variant
   
    If UBound(params) >= 0 Then p = params

    asm(0) = -881438862054780.1504@: asm(1) = -140193315782017.312@: asm(2) = 93112413858165.2867@: asm(3) = 593189448021741.0902@
    asm(4) = 843045704464075.3748@: asm(5) = -4834317066834.7356@: asm(6) = 260429944098681.7488@: asm(7) = 537140947255014.6699@
    asm(8) = 7683543183094.8624@: asm(9) = 598313605633923.5838@: asm(10) = -200740417519275.4208@: asm(11) = 109.8337@

    NanoInvoke = CallWindowProcW(asm(0), p, sLib, sFnc)
End Function
' ASM Code: pastebin.com/5gnLv7xn


Un pequeño reto que surgió en HackHound :P

Ejemplo de uso:
Código: vb
    Call NanoInvoke("user32", "MessageBoxW", 0, StrPtr("test"), StrPtr("karcrack"), 0)
    Call NanoInvoke("kernel32", "ExitProcess", 0)
#11
¿Para desbloquearlo hay que llevarlo a clase o qué?
#12
¿Qué clase de limitaciones trae el Netbook por defecto?
#13
Código: asm
;use32
; Karcrack - 190713
proc NotEmulated
   push  cs             ;//put 0x23 in stack
   call  to64
   ret
to64:
   push  $CB0033        ;//put 0x33 in stack
   call  to64 + 3       ;//call to retf
use64
   xor   rax, rax       ;//DEC EAX; XOR EAX, EAX
   inc   rax            ;//DEC EAX; INC EAX
   retf                 ;//Back to x86
endp   


El método consiste en ejecutar ensamblador x64 dentro de un proceso x86 usando la heaven's gate. Básicamente la técnica consiste en cambiar el segmento de código.

Si ensamblamos en x64 las siguientes instrucciones:
Código: asm
xor rax, rax
inc rax

Y luego las desensamblamos como si fuese x86 veremos que se transforma en:
Código: asm
dec eax
xor eax, eax
dec eax
inc eax

El prefijo que indica que se trata de un registro de 8bytes es "dec eax". Se observa que si las instrucciones se ejecutan en x64 devuelve 1 en EAX pero si se hace en x86 devuelve 0.

No conozco ningún emulador que detecte el cambio de segmento y cambie la arquitectura que emula jaja

Disfrutad :)
#14
ASM / Re:RunPE FASM
Julio 16, 2013, 07:26:11 PM
Buen código, gracias por compartir ;D

Si hay cargar un PE desde ASM y no necesites fwb yo siempre utilizo la técnica de cambiar tu baseaddr para poder cargar el PE en tu propio proceso sin necesidad de sección reloc :)
#15
Underc0de / Re:Biblioteca Virtual | Underc0de
Julio 15, 2013, 08:34:27 PM
No me quejo de los títulos sino más bien de los contenidos. Debería de haber algún sistema de votos y si algún documento recibe muchos votos negativos tal vez no merezca estar en la biblioteca...
#16
Underc0de / Re:Biblioteca Virtual | Underc0de
Julio 15, 2013, 07:28:28 PM
 :-\ Debería primar más la calidad que la cantidad en mi opinión. He bajado unos 4 con nombre interesante y han resultado ser PDFs de una página sin formato de contenido muy mediocre :-X
#17
Off Topic / Re:(No apto para fracasados)
Julio 14, 2013, 11:37:45 PM
Lástima que no pueda verlo porque soy un fracasado :'(
#18
Sí, yo miré la definición de la instrucción en el manual de Intel pero al no retornar la lectura de ningún modo no sirve de nada... Si prueba esto verás que devuelve $30:
Código: asm
        xor eax, eax
        lea eax, [FS:eax+$30]
        ret

El prefijo es superfluo...
#19
Uno usando FPU ;D
Código: asm
        push $30
        pop  eax
        push eax
        fld  dword[FS:eax]
        fstp dword[esp]
        pop  eax
        ret     
#20
No creo ya que lea no lee de memoria nada :-\ Igualmente he visto un par de instrucciones que pueden ser interesantes si tengo tiempo les echare un vistazo y actualizo :D