Hexadecimais? Letras e números em códigos de Exploits

1. Hexadecimais? Letras e números em códigos de Exploits

Fernando Souza
lanor

(usa KUbuntu)

Enviado em 30/01/2014 - 22:20h

Eu só tenho uma dúvida, não quero fazer nada errado. Vocês já devem ter visto códigos fontes de exploits, sempre tem algo parecido com um número hexadecimal.

Só um exemplo, achei essa foto no Google:

http://www.megaleecher.net/uploads/google-aurora-ie-exploit-code.jpg

http://www.tenouk.com/Bufferoverflowc/Bufferoverflow6.html


O que é? Alguém pode me explicar?


  


2. Re: Hexadecimais? Letras e números em códigos de Exploits

Sidney
Kwazza

(usa Debian)

Enviado em 31/01/2014 - 05:20h

Pesquise sobre shellcodes em exploits e você entenderá o porque do código hexadecimal.

Resumidamente, é o seguinte:

Quando se descobre alguma vulnerabilidade explorável em software, como o tal buffer overflow, precisa-se construir um código arbitrário capaz de corromper o programa e ser executado. O problema é que capturar esses eventos em tempo de execução é difícil e muito delicado, pois envolve manipulação de memória avançada para que você tire proveito do algoritmo que o código realiza e o faça executar o seu código arbitrário.

Para tudo isso, nada de linguanges de alto nível a lá Python, Ruby, Java ou Perl. Aqui se precisa de alguma linguagem de baixo nível que seja capaz de manipular memória, registradores e outros componentes de Hardware. O que se imagina a primeiro caso? C! Até vale, mas não é assim tão adequado: C permite manipulação direta de memória, mas as suas características de alto nível tal como controles de fluxos prontos e etc dificultam a exploração: Porque já que o C faz muita coisa pra você, você terá muita dificuldade em escrever um exploit totalmente em C que corrompa o programa, graças a exigência de manipulação profunda do hardware. Então, qual a melhor ferramenta? Assembly! Com ela você executa instruções de processador uma a uma, perfeita para explorar a implementação do programa.

O resto da história é simples: Você escreve seu exploit em Assembly que irá explorar a falha de segurança do programa e possibilitar execução de código arbitrário. Depois você pode executar o payload (código que você deseja executar depois do exploit ter sido exploitado), que pode ser escrito em C.

A questão do hexadecimal é a seguinte: Depois dos hackers/crackers escreverem o exploit em assembly, eles compilam, e com alguma ferramenta pra fazer aqueles dumps hexadecimais de executáveis eles pegam as instruções em assembly convertidas para código de máquina uma a uma e embedam num código em C. Então, quando o exploit for executado, ao invés de assembly o código em C chamará a rotina escrita em código de máquina.


3. Re: Hexadecimais? Letras e números em códigos de Exploits

???
gokernel

(usa Linux Mint)

Enviado em 31/01/2014 - 12:34h


Com esse tipo de ferramenta vc tem o controle(SE SABER O QUE ESTA FAZENDO) total:

LEMBRANDO:
Se não saber o que está fazendo não tente usar um programa do tipo abaixo:

WARNING: VC PODERÁ INVADIR SEM QUERER AS MÁQUINAS DA NSA ... ahahahah



/*
**-------------------------------------------------------------------
**
** A simple JIT ( x86 32 bits )
**
**-------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <windows.h>
#endif
#ifdef __linux__
#include <unistd.h>
#include <sys/mman.h> // to: mprotect()
#endif

unsigned char code[1000], *p;

int i = 1000;

//-------------------------------------------------------------------
// This function use the code of Fabrice Bellard:
//
// LIB: tcc-0.9.25
// FILE: libtcc.c
// FUNC: void set_pages_executable (void *ptr, unsigned long length);
// LINE: 400
//
// Set executable: a->code
//
//-------------------------------------------------------------------
void set_executable (void *ptr, unsigned long len)
{
#ifdef _WIN32
unsigned long old_protect;

if (!VirtualProtect(ptr, len, PAGE_EXECUTE_READWRITE, &old_protect))
{
printf ("ERROR: asm_set_executable() ... NOT FOUND - VirtualProtect()\n");
exit (-1);
}
#endif

#ifdef __linux__
unsigned long start, end, PageSize;

PageSize = sysconf (_SC_PAGESIZE);
start = (unsigned long)ptr & ~(PageSize - 1);
end = (unsigned long)ptr + len;
end = (end + PageSize - 1) & ~(PageSize - 1);
if (mprotect((void *)start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC) == -1)
{
printf ("ERROR: asm_set_executable() ... NOT FOUND - mprotec()\n");
exit (-1);
}
#endif
}


void execute (void)
{
p = code; // max size 1000

*p++ = 0x55; // push %ebp
*p++ = 0x89; *p++ = 0xe5; // mov %esp,%ebp

// ff 05 00 20 40 00 incl 0x402000
//
*p++ = 0xff;
*p++ = 0x05;
*(void**)p = &i;
p += sizeof (void*);

*p++ = 0xc9; // leave
*p++ = 0xc3; // ret

set_executable (code, p - code);

( (void(*)())code ) (); // <<<<<<< execute here >>>>>>>
}

int main()
{
execute ();
printf ("\nValue of i: %d\n", i);
return 0;
}







4. Re: Hexadecimais? Letras e números em códigos de Exploits

Roberto
mrx6s0

(usa Ubuntu)

Enviado em 13/08/2016 - 11:04h

gokernel escreveu:


Com esse tipo de ferramenta vc tem o controle(SE SABER O QUE ESTA FAZENDO) total:

LEMBRANDO:
Se não saber o que está fazendo não tente usar um programa do tipo abaixo:

WARNING: VC PODERÁ INVADIR SEM QUERER AS MÁQUINAS DA NSA ... ahahahah



/*
**-------------------------------------------------------------------
**
** A simple JIT ( x86 32 bits )
**
**-------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <windows.h>
#endif
#ifdef __linux__
#include <unistd.h>
#include <sys/mman.h> // to: mprotect()
#endif

unsigned char code[1000], *p;

int i = 1000;

//-------------------------------------------------------------------
// This function use the code of Fabrice Bellard:
//
// LIB: tcc-0.9.25
// FILE: libtcc.c
// FUNC: void set_pages_executable (void *ptr, unsigned long length);
// LINE: 400
//
// Set executable: a->code
//
//-------------------------------------------------------------------
void set_executable (void *ptr, unsigned long len)
{
#ifdef _WIN32
unsigned long old_protect;

if (!VirtualProtect(ptr, len, PAGE_EXECUTE_READWRITE, &old_protect))
{
printf ("ERROR: asm_set_executable() ... NOT FOUND - VirtualProtect()\n");
exit (-1);
}
#endif

#ifdef __linux__
unsigned long start, end, PageSize;

PageSize = sysconf (_SC_PAGESIZE);
start = (unsigned long)ptr & ~(PageSize - 1);
end = (unsigned long)ptr + len;
end = (end + PageSize - 1) & ~(PageSize - 1);
if (mprotect((void *)start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC) == -1)
{
printf ("ERROR: asm_set_executable() ... NOT FOUND - mprotec()\n");
exit (-1);
}
#endif
}


void execute (void)
{
p = code; // max size 1000

*p++ = 0x55; // push %ebp
*p++ = 0x89; *p++ = 0xe5; // mov %esp,%ebp

// ff 05 00 20 40 00 incl 0x402000
//
*p++ = 0xff;
*p++ = 0x05;
*(void**)p = &i;
p += sizeof (void*);

*p++ = 0xc9; // leave
*p++ = 0xc3; // ret

set_executable (code, p - code);

( (void(*)())code ) (); // <<<<<<< execute here >>>>>>>
}

int main()
{
execute ();
printf ("\nValue of i: %d\n", i);
return 0;
}






Amigo, esse seu código é em linguagem C?

Como ele realmente funciona?


Abraço


5. Re: Hexadecimais? Letras e números em códigos de Exploits

Roberto
mrx6s0

(usa Ubuntu)

Enviado em 13/08/2016 - 11:09h

[quote]mrx6s0 escreveu:

[quote]gokernel escreveu:


Com esse tipo de ferramenta vc tem o controle(SE SABER O QUE ESTA FAZENDO) total:

LEMBRANDO:
Se não saber o que está fazendo não tente usar um programa do tipo abaixo:

WARNING: VC PODERÁ INVADIR SEM QUERER AS MÁQUINAS DA NSA ... ahahahah



/*
**-------------------------------------------------------------------
**
** A simple JIT ( x86 32 bits )
**
**-------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <windows.h>
#endif
#ifdef __linux__
#include <unistd.h>
#include <sys/mman.h> // to: mprotect()
#endif

unsigned char code[1000], *p;

int i = 1000;

//-------------------------------------------------------------------
// This function use the code of Fabrice Bellard:
//
// LIB: tcc-0.9.25
// FILE: libtcc.c
// FUNC: void set_pages_executable (void *ptr, unsigned long length);
// LINE: 400
//
// Set executable: a->code
//
//-------------------------------------------------------------------
void set_executable (void *ptr, unsigned long len)
{
#ifdef _WIN32
unsigned long old_protect;

if (!VirtualProtect(ptr, len, PAGE_EXECUTE_READWRITE, &old_protect))
{
printf ("ERROR: asm_set_executable() ... NOT FOUND - VirtualProtect()\n");
exit (-1);
}
#endif

#ifdef __linux__
unsigned long start, end, PageSize;

PageSize = sysconf (_SC_PAGESIZE);
start = (unsigned long)ptr & ~(PageSize - 1);
end = (unsigned long)ptr + len;
end = (end + PageSize - 1) & ~(PageSize - 1);
if (mprotect((void *)start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC) == -1)
{
printf ("ERROR: asm_set_executable() ... NOT FOUND - mprotec()\n");
exit (-1);
}
#endif
}


void execute (void)
{
p = code; // max size 1000

*p++ = 0x55; // push %ebp
*p++ = 0x89; *p++ = 0xe5; // mov %esp,%ebp

// ff 05 00 20 40 00 incl 0x402000
//
*p++ = 0xff;
*p++ = 0x05;
*(void**)p = &i;
p += sizeof (void*);

*p++ = 0xc9; // leave
*p++ = 0xc3; // ret

set_executable (code, p - code);

( (void(*)())code ) (); // <<<<<<< execute here >>>>>>>
}

int main()
{
execute ();
printf ("\nValue of i: %d\n", i);
return 0;
}




Amigo, como o código funciona? Tentei compilar e não consegui, se pude me retornar... fiquei realmente curioso a respeito!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts