it-swarm-pt.tech

Como fazer isso para o buffer overflow?

Estou tentando entender o estouro de buffer e estou trabalhando com um simples pedaço de código, como abaixo.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int bof(char *str)
{
    char buffer[12];
    strcpy(buffer,str);
    return 1;
}

int main(int argc, char **argv)
{
    char str[517];
    FILE *badfile;

    badfile = fopen("badfile", "r");
    fread(str, sizeof(char), 517, badfile);
    bof(str);
    printf("Returned Properly\n");
    return 1;
}

Entendo que preciso injetar o código do Shell em "badfile", suponha que eu crie um badfile como este:

char buffer[517];
FILE *badfile;
memset(&buffer, 0x90, 517);
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);

Injeto no índice 12º do buffer []? Estou enfrentando um problema com isso. Mas acredito que é porque não é a posição de retorno. Preciso calcular a posição de retorno? Obrigado.

8
nubela

Não, não exatamente.

Há duas coisas para focar:

  • Substituindo o endereço de retorno. Você precisa descobrir quais bytes no arquivo acabarão substituindo o endereço de retorno. Suponha que esses sejam os bytes 20 a 23 do arquivo (por exemplo).

  • A localização do código da shell. Você deve colocar o código do Shell posteriormente no arquivo (por exemplo, próximo ao final). Então você precisa prever em qual endereço o código do Shell será carregado na memória. Suponha que [~ # ~] a [~ # ~] seja o endereço em que o código do shell será carregado na memória. Você precisa conhecer este endereço, porque é isso que você precisa usar para substituir o endereço de retorno.

Depois de conhecer os dois, você estará pronto. Você armazena o valor [~ # ~] a [~ # ~] nos bytes 20 a 23 do arquivo e o código do Shell posteriormente no arquivo onde você decidiu colocá-lo.

Para resolver essas duas coisas, você precisará examinar o layout da pilha.

  • Primeiro, encontre o deslocamento entre o local onde o início de str aparece na pilha e o local em que o endereço de retorno aparece. Esse deslocamento informa quais bytes no arquivo acabarão substituindo o endereço de retorno. Se esse deslocamento for, digamos, 20 bytes, os bytes 20 a 23 do arquivo serão gravados sobre o endereço de retorno. Para fazer o ataque funcionar, 20 bytes no arquivo, você precisa colocar um valor no local em que deseja que o programa salte (o endereço do início do código do Shell). Este valor substituirá o endereço de retorno. O valor para colocar lá é o endereço [~ # ~] a [~ # ~] mencionado acima.

  • Segundo, coloque o código do Shell ainda mais tarde no arquivo, preveja em que endereço o código do Shell será armazenado na memória depois que o arquivo for lido na memória e use esse endereço inicial como o valor para substituir o endereço de retorno.

Eu recomendo que você leia Smashing The Stack For Fun And Profit por Aleph One. Ele tem um excelente tutorial para aprender como fazer uma exploração de saturação de buffer de quebra de pilha. (Dica: em sistemas modernos, desabilite manualmente o ASLR e o DEP primeiro, para que a sua exploração funcione.)

8
D.W.

É definitivamente um estouro de buffer de baunilha. Mas você também precisa encontrar o deslocamento exato de onde o ponteiro de retorno está armazenado na pilha. (Dica: definitivamente não são 12 bytes, considere o EBP salvo armazenado). Você está certo, também precisa calcular o endereço de retorno do código do Shell injetado no arquivo inválido. Deixe-me avisá-lo, porém, como o buffer é de apenas 12 bytes aqui, acredito que é difícil injetar um código Shell de 12 bytes nesse espaço. Olhe em volta para ver se consegue encontrar um. Mas você pode colocar o código do Shell na parte posterior da pilha, pois o buf no main tem 517 bytes. Isso significa que os 12 bytes principais do seu arquivo podem ser indesejados.

Dicas : http://www.securitytube.net/groups?operation=view&groupId=4

Trate o tutorial em vídeo acima para armazenar buffer overflows como uma bíblia para buffer overflows

Use o GDB, rastreie seu código, fique de olho no ponteiro da pilha, na própria pilha.

0
sudhacker

Seu buffer é muito pequeno para caber no código do Shell + endereço de retorno. Aumente-o um pouco se você planeja testar o conceito. Além disso, você pode colocar o código de shell no ENV.

0
user41853