[ create a new paste ] login | about

Link: http://codepad.org/akQC6LzI    [ raw code | output | fork ]

C, pasted on Jan 25:
//-------------------------------------------------------------------
//
// Gloria e Honra para ao unico DEUS, criador dos ceus e da terra
// em nome de Cristo Jesus. \o/
//
// Tiny Assembly ShellCode, test/prototype:
//
// DESC:
//   Escreve/gera uma funcao compila ...
//
// BY: gokernel - gokernel@hotmail.com
//-------------------------------------------------------------------

#include <stdio.h>

#define CALL  0xe8
#define RET   0xc3

int   i, x = 123;
char  code[200];
char  *p; // p = code;
int   len;

//-------------------------------------------------------------------
// NAME: o
//
// DESC:
//   Adiciona uma assembly instrucao na array (code) e incrementa 1
//
//-------------------------------------------------------------------
void o (char c)
{
    *p++ = c;
    len++;
}

//-------------------------------------------------------------------
// NAME: get_addr
//
// DESC:
//   Incrementa(4) a array de char com o ENDERECO da variavel ...
//
// USAGE:
//   get_addr ( &var_name );
//
//-------------------------------------------------------------------
void get_addr (void *func)
{
    if (func) {
        *(long *)p = func;
		    p += sizeof (long);
		    len += sizeof (long);
        printf ("OK FUNCAO ENCONTRADA\n");
    }
    else printf ("function NOT FOUND\n");
}


void hello (void)
{
    x = 1000;
    printf ("\nFUNCAO FUNCIONA - Hello World - GLORIA A DEUS \\o/ \n\n");
}

//---------------------------------------------------------------
// howto ... ;)
//
// esta funcao foi usada como COBAIA para aprender como fazer ...
//---------------------------------------------------------------
void assembly (void)
{
    asm ("movl $_hello, %ebp");
    asm ("movl %ebp, %eax");
    asm ("call *%eax");
}

void incl (void *var)
{
    if (var) {
        o(0xff); o(0x05); // <<<<<<< opcode

        *(long *)p = var;
        p += sizeof (long);
		    len += sizeof (long);
    }
}

//-------------------------------------------------------------------
// NAME: movl
//
// DESC:
//   Assembly ( MOVL ) instrucao ...
//   Seta uma variavel (int/long) com um valor
//
// USAGE:
//    movl ( &var_name, valor );
//
//-------------------------------------------------------------------
//
void movl (int var_name, int value)
{
    if (var_name)
    {
        o(0xc7); o(0x05);

        //*(int *)a = &x;
        *(long *)p = var_name;
        p += sizeof (long);
		    len += sizeof (long);

        *(long *)p = value;
		    p += sizeof (long);
		    len += sizeof (long);
    }
}

int main (int argc, char *argv[])
{
    p = code;

    o(0x55);                    // push   %ebp
    o(0x89); o(0xe5);           // mov    %esp,%ebp

    //---------------------------------------------------------------
    // 40129e:	bd 90 12 40 00       	mov    $0x401290,%ebp
    // 4012a3:	89 e8                	mov    %ebp,%eax
    // 4012a5:	ff d0                	call   *%eax
    //---------------------------------------------------------------
    //
    o(0xbd); get_addr (&hello); // mov    $0x401290,%ebp
    o(0x89); o(0xe8);           // mov    %ebp,%eax
    o(0xff); o(0xd0);           // call   *%eax

    o(0x5d);                    // pop    %ebp
    o(RET);                     // ret

#ifdef __WIN32__
    asm ("call _code");
#endif
#ifdef __linux__
    asm ("call code");
#endif

    // x inicia com: 123
    //
    // veja o valor agora
    //
    printf("Valor de x: %d\n", x);

    return 0;
}


Output:
1
2
In function `assembly':
undefined reference to `_hello'


Create a new paste based on this one


Comments: