Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Переполнение буффера/Ubuntu/Gdb

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Для начинающих] >> Переполнение буффера/Ubuntu/Gdb
Имя
Сообщение << Старые топики   Новые топики >>
Переполнение буффера/Ubuntu/Gdb - 2011-06-09 04:27:38.290000   
mumeg

Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
Приветствую. Интересует вот такой вот вопрос =>
Возьмем простенькую программку.
#include &lt;stdio.h&gt; #include &lt;string.h&gt; int main(int argc, char** argv){ char buffer[500]; strcpy(buffer, argv[1]); return 0;} Отключаем Linux ASLR и компилируем с -fno-stack-protector.
Начинаем работу с gdb =>
Пытаемся вызвать переполнение буфера =>
run $(python -c 'print "\x41" * n') Где 'n' число превышающее наш буфер, и полностью затирающее eip, что собсна выходит =>
(gdb) run $(python -c 'print "\x41" * 506') The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/mumeg/training/a.out $(python -c 'print "\x41" * 506') Program received signal SIGSEGV, Segmentation fault. 0x00004141 in ?? () (gdb) run $(python -c 'print "\x41" * 507') The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/mumeg/training/a.out $(python -c 'print "\x41" * 507') Program received signal SIGSEGV, Segmentation fault. 0x00414141 in ?? () (gdb) run $(python -c 'print "\x41" * 508') The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/mumeg/training/a.out $(python -c 'print "\x41" * 508') Program received signal SIGSEGV, Segmentation fault. 0x080483ed in main (argc=0, argv=0xbffff234) at buf_stack_over.c:8 8 return 0;} (gdb) Почему в последнем моменте eip вообще изменяется в корне?
Ubuntu 11.*(i386), e5200, 2gb.
Заранее благодарен ответам!
Post #: 1
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 07:31:27.116666   
Ltonid

Сообщений: 4970
Оценки: 740
Присоединился: 2008-12-29 13:21:56.166666
Походу просто стек кончился. Попробуй с меньшим размером буфера.
Post #: 2
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 12:50:09.850000   
mumeg

Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
Сегмент стека переменного размера, и создается(выделяется память на него) при запуске программы. То есть если у меня будет одна переменная в 500б то и стек выделит на нее 500б, если 250б, => он будет 250б. => Он не может кончится, а может произойти переполнение.
Post #: 3
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 13:33:23.060000   
mumeg

Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
Проверил все равно. При любом размере происходит все это.
В месте полного затирания что то происходит, и еип указывать начинает на "адрес:ret"
Post #: 4
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 13:39:14.046666   
Ltonid

Сообщений: 4970
Оценки: 740
Присоединился: 2008-12-29 13:21:56.166666
А если попробовать уменьшить n, но удвоить байты. Такого не встречал)
Post #: 5
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 13:45:15.700000   
mumeg

Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
В том то и дело, уменьшаем 'n', стек начинает затираться потихоньку =>
0x00004141 in ?? ()
0x00414141 in ?? ()
Как видно…и на последних байтов оп, и все..Выкидывает. Трассировка на функцию указывает, а еип резко переходит на ret.

А насчет удвоить байты - самого буфера удвоить или чего именно, извиняюсь не совсем понял :\
Post #: 6
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 13:55:47.673333   
Ltonid

Сообщений: 4970
Оценки: 740
Присоединился: 2008-12-29 13:21:56.166666
ну ты щас пишешь по \41 и по одному наращиваешь, а я предлагаю попробовать \41\41 и также наращивать.
Post #: 7
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 17:06:00.560000   
mumeg

Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
Пробовал, к сожалению в любом случае при полном затирании происходит это :\ Сразу на ret и все :(
Post #: 8
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 18:16:57.726666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Я могу лишь высказать предположение. Может 0x41414141 – это адрес из какого-нибудь "особенного" диапазона, и процессор генерирует другое исключение при попытке перейти на него? И это другое исключение вылетает до того, как в eip загрузится новый адрес.
Ядро-то особо не парится на тему того, чтобы прибивать приложение разными сигналами при разных исключениях. Просто SIGSEGV при всех исключениях связанных с нарушением адресации, и SIGFPE при арифметических ошибках типа деления на ноль, или логарифма от отрицательного числа. Но у процессора, если память мне не изменяет, разнообразие исключений выше. Я, к сожалению, давным давно позабыл все эти исключения – я лет десять назад их разглядывал, и то больше из любопытства. А ты копни, глянь на карту памяти процесса, что там по адресу 0x41414141?
Post #: 9
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 18:43:41.440000   
mumeg

Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
Попробовал ручками в память значение положить, спокойно все проходит, а в гдб просто если просмотреть, до доступ дает спокойно, + лежит там какой мусор. Проверял перед формированием стека, и после.
Post #: 10
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 21:19:16.980000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Ну может быть, страница памяти, которая содержит логический адрес 0x41414141 не существует, и поэтому процессор выкидывает другое исключение. Скажем, при меньших адресах вылетает исключение связанное с тем, что те страницы на которые ссылаются эти адреса помечены как no-exec, а здесь просто страница не существует, вылетает другое исключение, а ядро не считает нужным эту страницу на лету создавать, и прибивает процесс сигналом SIGSEGV.
Но это всё предположения. И если они верны, то для того, чтобы убедительно объяснить происходящее, надо круто втыкать в работу менагера памяти ядра и в то, как работает процессор в protected mode.
Post #: 11
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 21:42:37.300000   
ef1r

Сообщений: 46
Оценки: 0
Присоединился: 2011-01-24 21:52:27.390000
эта статья?
Post #: 12
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-11 14:16:37.556666   
mumeg

Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
2ef1r агамс, под конец уже ей начал руководствоваться и все равно вот такая вот хрень.
NX биты есть у кого нить скрипт проверить?
Post #: 13
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-12 03:42:29.073333   
mumeg

Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
В принципе разобрался.
Использовалась NX зашита(DEP в Windows)
Линк кому интересно почитать - http://en.wikipedia.org/wiki/NX_bit
Post #: 14
Страниц:  [1]
Все форумы >> [Для начинающих] >> Переполнение буффера/Ubuntu/Gdb







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.