![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 14.10.2012
Сообщений: 13
|
![]()
Доброго времени суток. Пытаюсь дизассемблировать программу:
Код:
дальше запускаю gdb qwa и при дизассемблировании функции main я получаю Код:
Код:
И как мне записать в ebp - чего-нибудь свое (пытаюсь воспроизвести ошибку переполнения буфера) пробовала вот так вот: Код:
Последний раз редактировалось Stilet; 14.10.2012 в 21:30. |
![]() |
![]() |
![]() |
#2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Вот если отладчиком пройтись по дизасму, как стек будет меняться после отработки этих двух функций?
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
Неисповедимы пути gcc )
32 байта нужно для твоего буфера; 8 для передачи параметров в функции (gcc не пушит их, как большинство остальных компиляторов, а резервирует место в стеке сразу); ну и 16 оставляет на всякий случай (или для выравнивания, как в 0x0040131c). А для переполнения буфера тебе нужно просто ввести длинную строчку (больше 44 байт) в ответ на gets, адрес возврата в стеке перезапишется и ты скорее всего увидишь сегфолт ![]() Чтобы вместо сегфолта вызвать какое-то осмысленное действие - в те 4 байта, которые перезапишут адрес возврата, нужно записать адрес кода, который должен выполниться. И принтф там не нужен. |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 14.10.2012
Сообщений: 13
|
![]()
спасибо за разъяснения.
я хочу туда что-то дельное пихнуть. пока я хочу туда записать адрес 0x00401340 - вызов моей функции lame. при переводе в в символы, что означает @!!@ по идее, моя программа main() { int i=0; char buf[44]; for (i=0;i<=40;i+=4) *(long *) &buf[i] = 0x00401340;(адрес вызова функции lame) puts(buf); } должна сгенерировать 11 раз 0x00401340 и вывести это в консоль, но во-первых, выводит она 1 раз, а во-вторых, не понимаю, как мне это в виде параметра донести первой программе? я конечно осознаю всю тяжесть моего психического состояния, что использую все это под Windows, но подскажите пожалуйста, как это возможно сделать ? я пытаюсь это сделать с помощью команды (ret;cat)| qwa но он упорно выдает мне @!!@ Последний раз редактировалось KellyDink; 14.10.2012 в 22:35. |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
Окей, давай разбираться.
На архитектуре X86 числа хранятся в памяти, начиная с младшего байта (little-endian). т. е. твой адрес 0x00401340 будет выглядеть как 0x40 0x13 0x40 0x00. И когда ты несколько раз подряд запишешь его в buf, там будет Код:
Потом ты передаешь этот буфер в puts. Она воспринимает его как строчку, и выводит на экран. А строчки в C всегда заканчиваются нулевым байтом. Следовательно, puts выведет только три байта (до первого нулевого). Потому ты и видишь это в консоли только один раз ) Ну и в этом коде переполнения буфера нету - ты выделяешь под него 44 байта и заполняешь 44 байта. Сделай буфер меньше или цикл дольше ![]() И следи за тем, чтобы после перекомпиляции нужный адрес не поменялся. |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 14.10.2012
Сообщений: 13
|
![]()
Спасибо большое за ответ =( мне очень стыдно, но у меня все-равно ничего не выходит.
увеличение цикла не помогло. он упорно выводит мне @!!@. правильно ли я поняла, что нужно изменить запись в массив? у меня же массив из 44 (уже из 48) однобайтовых элементов. то есть возможно он выводит не в той последовательности? Эксперементальным путем выяснила, что падает она только при 75 знаках О_О опять когнетивный диссонанс - почему не при 30-ти? как мне правильно вывести на входные данные первой программы мой массив buf из другой? интуиция мне подсказывает, что моё: "(ret;cat)| qwa" неверно в интернетах пишут ./buff `perl -e 'print "A" x 11'` You entered: AAAAAAAAAAA а у меня даже входную строку как параметр указать не удается, она ее игнорирует =( |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 14.10.2012
Сообщений: 13
|
![]()
для того, чтобы разложить для себя по полочкам сказанное - исправила написанное на:
main() { int i=0; char buf[80]; for (i=0;i<=84;i+=4) buf[i] = 0x40; buf[i+1]=0x13; buf[i+2]=0x40; buf[i+3]=0x00; puts(buf); } выводит @ " оно и понятно, видимо потом идет 0x00. если поставить в обратном порядке, то ничего не выводит (ибо первым идет 0x00) что-то мне подсказывает, что моя проблема в прямоте рук (ее отсутствии ![]() Последний раз редактировалось KellyDink; 14.10.2012 в 23:39. |
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
Так ты определись, что конкретно хочешь получить )
На экран ты никак эту длинную строчку не выведешь из-за нулевых байтов. Но для переполнения это и не нужно. А в последнем твоем коде ошибка - тело цикла нужно брать в скобки {}. В интернетах правильно пишут про perl ![]() Код:
Напиши итоговый код программы с листингом, и тогда посчитаем, что конкретно ей нужно передать ) |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 14.10.2012
Сообщений: 13
|
![]()
хочу развернуть свою программу на 180 градусов и вернуть ее на выполнение функции lame.
сама программа выглядит так: void lame (void) { char small[30]; gets (small); printf("%s\n", small); } int main() { lame (); return 0; } экспериментальным путем я вычислила, что если вставлять строчку xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxa из 81 x и 1 a, то программа падает на 0x78787878 (то есть x), а если 80-ый символ поставить a, то программа падает на адресе 0x61787878 правильно ли я понимаю, что мне нужно записать 76 x и потом записать желаемый адрес? main() { int i=0; char buf[81]; for (i=0;i<=75;i+=1) buf[i] = 0x78; buf[76]=0x00; buf[77]=0x40; buf[78]=0x13; buf[79]=0x40; puts(buf); } тока она все-равно не работает =) при вызове команды (ret;cat) | qwa она падает , но второй раз на функцию lame не идет =( и вот еще вопрос: http://www.wasm.ru/article.php?article=buf_over4noob вот тут работало с нулевыми байтами =( пыталась повторить, но увы безуспешно =( с перлом у меня не вышло. при попытке записи perl -e 'print "A"*3' / qwa пишет Can't find string terminator " ' " anywhere before EOF as -e line 1. ** адрес вызова функции lame еще раз проверила, он остался прежним. Последний раз редактировалось KellyDink; 15.10.2012 в 01:06. |
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
На каком адресе падает? )
Вообще, стукни лучше в icq, там удобнее. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Дизассемблирование exe | Garmon | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 10.12.2011 15:48 |
Дизассемблирование\Снятие защиты ORiEN | Goblenus | Помощь студентам | 0 | 05.10.2011 23:10 |
дизассемблирование команд | [MI_nor] | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 23.05.2011 02:19 |
Дизассемблирование | Slavic111 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 15 | 19.07.2010 16:46 |
Исследование программ (дизассемблирование) | Вавел из ГМТУ | Свободное общение | 11 | 12.11.2009 23:37 |