Chucky Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 (изменено) Всем привет! Имеется скрипт: [ENABLE]alloc(newmem,2048) //2kb should be enoughlabel(returnhere)label(originalcode)label(exit)newmem:mov dword ptr [eax+6C],#1120403456originalcode:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]exit:jmp returnhere"Amnesia.exe"+D9FC1:jmp newmemnopnopreturnhere:[DISABLE]dealloc(newmem)"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08] Все работает отлично. Но вот если использовать инструкции CALL и RET: [ENABLE]alloc(newmem,2048) //2kb should be enoughlabel(originalcode)label(exit)newmem:mov dword ptr [eax+6C],#1120403456originalcode:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]exit:ret"Amnesia.exe"+D9FC1:call newmemnopnop[DISABLE]dealloc(newmem)"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08] то масло в фонаре почему-то 0. Как правильно писать скрипт при использовании CALL и RET??? Изменено 10 марта, 2015 пользователем Chucky Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 (изменено) У тебя нет выхода из твоей инъекции, попробуй так:Правда зачем тебе call и ret в этом скрипте? Если бы много повторяющихся элементов, тогда их очень хорошо использовать.[ENABLE]alloc(newmem,64) label(exit)newmem:mov dword ptr [eax+6C],#1120403456fsubr dword ptr [eax+6C]fst dword ptr [esp+08]ret"Amnesia.exe"+D9FC1:call newmemnopnopexit:[DISABLE]"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]dealloc(newmem) Изменено 10 марта, 2015 пользователем garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Chucky Опубликовано 10 марта, 2015 Автор Поделиться Опубликовано 10 марта, 2015 Посмотри внимательно мой второй скрипт. exit: Ошибка не в этом. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 (изменено) Посмотри внимательно мой второй скрипт. exit: Ошибка не в этом.У тебя неправильно. я же тебе написал: у тебя нету выхода из инъекции И ещё одно: я сейчас не могу посмотреть, сколько занимает байт call newmem, если 5 (как и jmp newmem), то проверь мой скрипт на работу.Если call newmem больше, нужно убрать соответствующее количество NOP. PS: Посмотрел: call newmem - 5 байт. Так что проверь скрипт - должен работать. Если не понятно как работает связка call/ret, пиши - постараюсь объяснить. Изменено 10 марта, 2015 пользователем garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Chucky Опубликовано 10 марта, 2015 Автор Поделиться Опубликовано 10 марта, 2015 garik66, проверил твой скрипт. Так же как и у меня, масло в фонаре равно 0. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Странно, по-идеи, если твой первый скрипт работает должен работать и мой скрипт, только смущают два nop после call, попробуй ещё такой вариант: Если и этот, не сработает, то нужно ставить бряк на инструкции и смотреть, что с регистрами происходит. Либо подождать, когда мастера ответят.[ENABLE]alloc(newmem,64) label(exit)newmem:mov dword ptr [eax+6C],#1120403456fsubr dword ptr [eax+6C]fst dword ptr [esp+08]ret"Amnesia.exe"+D9FC1:nopnopcall newmemexit:[DISABLE]"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Chucky Опубликовано 10 марта, 2015 Автор Поделиться Опубликовано 10 марта, 2015 (изменено) Не работает тоже. Попробовал поработать с другой инструкцией. Все работает. Вот скрипт:[ENABLE]alloc(newmem,2048)newmem:mov dword ptr [eax+6C],#1120404556ret"Amnesia.exe"+D9F16:call newmemnopnopnopnop[DISABLE]dealloc(newmem)"Amnesia.exe"+D9F16:fld dword ptr [eax+6C]fcom dword ptr [esi+000000E8] Просто странно. Мой первый скрипт с использованием JMP тоже работает! Изменено 10 марта, 2015 пользователем Chucky Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Действительно странно, а попробуй тогда скрипт от первой инструкции в таком виде:И напиши - работает/нет. Тоже уже интересно.[ENABLE]alloc(newmem,64) newmem:mov dword ptr [eax+6C],#1120403456fsubr dword ptr [eax+6C]fst dword ptr [esp+08]ret"Amnesia.exe"+D9FC1:call newmemnopnop[DISABLE]"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Chucky Опубликовано 10 марта, 2015 Автор Поделиться Опубликовано 10 марта, 2015 Нет, garik66, тоже не пашет! Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Нет, garik66, тоже не пашет! Давай тогда посмотрим: fld dword ptr [eax+6C] - аналог push, т.е. выталкивает в стек значение из адреса eax+6C.а fsubr dword ptr [eax+6C] - отнимает из верха стека значение по адресу eax+6c.Не понятно почему Call/ret так по разному влияют.Твой первый скрипт (без call/ret) точно работает? Тогда вопрос чему равно во float число - #1120403456? Ссылка на комментарий Поделиться на другие сайты Поделиться
Chucky Опубликовано 10 марта, 2015 Автор Поделиться Опубликовано 10 марта, 2015 Первый скрипт точно работает!!! Число - #1120403456 = (float)100 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 (изменено) Тогда ещё один вариант попробуй:Если и это не сработает. То я наверное не смогу помочь, нужно будет либо Xipho подождать, либо MasterGH (MasterGH быстрее в ассемблер СЕ разберётся).[ENABLE]alloc(newmem,64) label(exit)newmem:fsubr dword ptr [eax+6C]mov dword ptr [eax+6C],#1120403456 // ещё можно попробовать опустить эту инструкцию ещё ниже - перед ret fst dword ptr [esp+08] // поставить.ret"Amnesia.exe"+D9FC1:call newmemnopnopexit:[DISABLE]"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]dealloc(newmem) Изменено 10 марта, 2015 пользователем garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 call смещает ESP на 4 байта или на 8 байт (зависит от 32 или 64 разрядной платформы) Тогда fst dword ptr [esp+08] уже будет другим например 0x8+0x4 = 0xСfst dword ptr [esp+0С] или 0x8+0x8 = 0x10fst dword ptr [rsp+10] Ссылка на комментарий Поделиться на другие сайты Поделиться
Dison Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 (изменено) Попробуй так. Скройте скрипт под спойлер я просто пишу с телефона и не могу скрыть.. [ENABLE]alloc(newmem,2048) //2kb should be enoughlabel(originalcode)label(exit)label(returnhere)newmem:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]mov dword ptr [eax+6C],#100exit:returnhere"Amnesia.exe"+D9FC1:call newmemnopnopreturnhere[DISABLE]dealloc(newmem)"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]ARM4ND0: Используем тег кода. Изменено 10 марта, 2015 пользователем ARM4ND0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Chuckyя же говорил MasterGH быстро объяснит,Короче мой второй вариант в "Иcправлении 4" должен работать, т.е. поставить mov dword ptr [eax+6C],#1120403456 ниже fst dword ptr [esp+08]. MasterGHСпасибо большое. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 (изменено) Попробуй так. Скройте скрипт под спойлер я просто пишу с телефона и не могу скрыть..Не mov dword ptr [eax+6C],#100, а mov dword ptr [eax+6C],(float)100. Изменено 10 марта, 2015 пользователем garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Мастер все верно сказал, нужно внимательно посмореть на стек перед вызовом ret - на верхушке будет лежать адрес, куда передастся управление. Если не туда, куда нужно, то исправить. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 (изменено) Мастер все верно сказал, нужно внимательно посмореть на стек перед вызовом ret - на верхушке будет лежать адрес, куда передастся управление. Если не туда, куда нужно, то исправить.ChuckyТ.к. компы у пользователей твоего скрипта будут разные, то лучше не исправлять esp, а вообще исключить инструкцию fst dword ptr [esp+08]., т.е. взять инструкцию выше твоей fsubr dword ptr [eax+6C] и из неё сделать инъекцию и там уже mov dword ptr [eax+6C],(float)100 сработает. Изменено 10 марта, 2015 пользователем garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dison Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Не mov dword ptr [eax+6C],#100, а mov dword ptr [eax+6C],(float)100.Да-да спешил правильно будет (float)100 Ссылка на комментарий Поделиться на другие сайты Поделиться
Chucky Опубликовано 10 марта, 2015 Автор Поделиться Опубликовано 10 марта, 2015 (изменено) Спасибо, парни. Взял инструкцию чуть выше:http://radikal.ru/fp/d86c7fdf3be144739325af6808d64eda сделал такой скрипт:[ENABLE]alloc(newmem,2048)newmem:fmul dword ptr [esi+000000E4]mov dword ptr [eax+6C],(float)100ret"Amnesia.exe"+D9FBB:call newmemnop[DISABLE]dealloc(newmem)"Amnesia.exe"+D9FBB:fmul dword ptr [esi+000000E4] Все правильно? Изменено 10 марта, 2015 пользователем Chucky Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Почти. dealloc(newmem) опускай в самый низ.[ENABLE]alloc(newmem,64)newmem: // Очерёдность выполнения инструкций.fmul dword ptr [esi+000000E4] // 2mov dword ptr [eax+6C],(float)100 // 3ret // 4"Amnesia.exe"+D9FBB:call newmem // 1nop // 5[DISABLE]"Amnesia.exe"+D9FBB:fmul dword ptr [esi+000000E4] dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Chucky Опубликовано 10 марта, 2015 Автор Поделиться Опубликовано 10 марта, 2015 garik66, а так же все остальные, кто принимал участие в диалоге, большое спасибо! Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Chucky,это тебе спасибо и MasterGH.Теперь я знаю не много больше про CALL/RET. Удачного взлома!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 10 марта, 2015 Поделиться Опубликовано 10 марта, 2015 Вообще, читайте документацию по командам, если не до конца уверены в том, как они работают. Пара "call-ret" существует аж в трех экземплярах, но в 99% случаев все работает без аргументов, т.е. просто call и просто ret. Мораль - сперва нужно разобраться в чужом исходнике, прежде чем его использовать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения