Переполнение буффера/Ubuntu/Gdb
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Переполнение буффера/Ubuntu/Gdb - 2011-06-09 04:27:38.290000
|
|
|
mumeg
Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
|
Приветствую. Интересует вот такой вот вопрос => Возьмем простенькую программку.
#include <stdio.h>
#include <string.h>
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. Заранее благодарен ответам!
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 07:31:27.116666
|
|
|
Ltonid
Сообщений: 4970
Оценки: 740
Присоединился: 2008-12-29 13:21:56.166666
|
Походу просто стек кончился. Попробуй с меньшим размером буфера.
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 12:50:09.850000
|
|
|
mumeg
Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
|
Сегмент стека переменного размера, и создается(выделяется память на него) при запуске программы. То есть если у меня будет одна переменная в 500б то и стек выделит на нее 500б, если 250б, => он будет 250б. => Он не может кончится, а может произойти переполнение.
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 13:33:23.060000
|
|
|
mumeg
Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
|
Проверил все равно. При любом размере происходит все это. В месте полного затирания что то происходит, и еип указывать начинает на "адрес:ret"
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 13:39:14.046666
|
|
|
Ltonid
Сообщений: 4970
Оценки: 740
Присоединился: 2008-12-29 13:21:56.166666
|
А если попробовать уменьшить n, но удвоить байты. Такого не встречал)
|
|
|
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. А насчет удвоить байты - самого буфера удвоить или чего именно, извиняюсь не совсем понял :\
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 13:55:47.673333
|
|
|
Ltonid
Сообщений: 4970
Оценки: 740
Присоединился: 2008-12-29 13:21:56.166666
|
ну ты щас пишешь по \41 и по одному наращиваешь, а я предлагаю попробовать \41\41 и также наращивать.
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 17:06:00.560000
|
|
|
mumeg
Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
|
Пробовал, к сожалению в любом случае при полном затирании происходит это :\ Сразу на ret и все :(
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 18:16:57.726666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
Я могу лишь высказать предположение. Может 0x41414141 – это адрес из какого-нибудь "особенного" диапазона, и процессор генерирует другое исключение при попытке перейти на него? И это другое исключение вылетает до того, как в eip загрузится новый адрес. Ядро-то особо не парится на тему того, чтобы прибивать приложение разными сигналами при разных исключениях. Просто SIGSEGV при всех исключениях связанных с нарушением адресации, и SIGFPE при арифметических ошибках типа деления на ноль, или логарифма от отрицательного числа. Но у процессора, если память мне не изменяет, разнообразие исключений выше. Я, к сожалению, давным давно позабыл все эти исключения – я лет десять назад их разглядывал, и то больше из любопытства. А ты копни, глянь на карту памяти процесса, что там по адресу 0x41414141?
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 18:43:41.440000
|
|
|
mumeg
Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
|
Попробовал ручками в память значение положить, спокойно все проходит, а в гдб просто если просмотреть, до доступ дает спокойно, + лежит там какой мусор. Проверял перед формированием стека, и после.
|
|
|
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.
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-09 21:42:37.300000
|
|
|
ef1r
Сообщений: 46
Оценки: 0
Присоединился: 2011-01-24 21:52:27.390000
|
эта статья?
|
|
|
RE: Переполнение буффера/Ubuntu/Gdb - 2011-06-11 14:16:37.556666
|
|
|
mumeg
Сообщений: 24
Оценки: 0
Присоединился: 2011-01-28 21:46:30.120000
|
2ef1r агамс, под конец уже ей начал руководствоваться и все равно вот такая вот хрень. NX биты есть у кого нить скрипт проверить?
|
|
|
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
|
|
|
|
|