NOP - слайдинг

Discussion in 'Реверсинг' started by DeepBlue7, 24 Feb 2013.

  1. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    Думаю, это наиболее подходящий раздел для такого вопроса. Суть вот в чём: обьясните на пальцах зачем нужен nop-слайдинг, и как он вообще работает ? Данные лезут в стек, но как это использовать для эксплутации уязвимости типа переполнение буфера ?

    Для тестов юзаю
    Code:
    #include <stdio.h>
    
    int main()
    {
    	char buf[10];
    	char ch;
    	int counter = 0;
    
    	while((ch = getchar()) != 10) //Enter
    	{
    		buf[counter++] = ch;
    	}
    
    	printf("%s\n", buf);
    
    	printf("okay");
    	getchar();
    
    	return 0;
    }
    
    и православный ollydbg 1.10

    Заранее благодарю за ответ :).
     
    #1 DeepBlue7, 24 Feb 2013
    Last edited: 24 Feb 2013
  2. Zimper

    Zimper New Member

    Joined:
    12 Jan 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Незнаю что ты имееш в виду под Nop слайдингом.Например в твоем тесте,проверка в (ch = getchar()) != 10) абсолютно безполезна,тебе нужно проверять не символ который вводиться,а counter.Соответственно раз у тебя проверка не правильно работает,то с консоли можна ввести заведомо больше символов чем 10.
    А это в свою очередь произведет к переполнению,и затиранию данных в стеке.В втоем случае затреться адрес возврата,так как у тебя стоит return 0;В принципе в твоем примере после вызова return 0; программа просто должна завершить свою работу.Заместь этого после переполнения адрес возврата уже будет другим и
    выведеться ошибка.

    Потести этот пример.Он более наглядный.После переполнения "Hello" ненапечатаеться.Я думаю ты в Ольге разберешся почему так?

    Code:
    #include <stdio.h>
    #include <windows.h>
    #include <iostream.h>
    void test();
    int main()
    {
    	 test();
    	 cout<<"Hello";
    	 Sleep(4000);
    	return 0;
    }
    
    void test()
    {
      char buf[10];
    	char ch;
    	int counter = 0;
    
    	while((ch = getchar()) != 10) //Enter
    	{
    		buf[counter++] = ch;
    	}
    
    	printf("%s\n", buf);
    
    	printf("okay");
    
    
    
    	  return;
    }
    
     
    #2 Zimper, 24 Feb 2013
    Last edited: 24 Feb 2013