Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет, недавно я решил изучить тему геймхакинга, так как всегда любил игры и программирование. Недавно наткнулся на интересную технику, которая часто используется не только в относительно мирном геймхакинге, но и в кряке лицензионного ПО и для троянизации исполняемых файлов.
Программы которые нам понадобятся:
PE-bear (опционально)
x32/64dbg
Использовать я буду 32-битную версию putty, так как именно с него я начал изучение ассемблера, однако если вы хотите троянизировать 64-битную программу, то вся разница будет лишь в том, что на стадии генерации шеллкода нужно будет указать 64 бита, и в том что в x86-64 нет команд pushad/pushfd, таким образом придется вручную сохранить каждый из регистров.
Суть техники в том, что мы должны найти или создать достаточно большую область, где мы сможем модифицировать код программы так, чтобы перед исполнением самого оригинального кода программа исполняла произвольный код, который мы заложим в нее, а затем уже делала то, что она должна была.
В данном гайде будет показан способ с созданием новой секции, куда будет залит шеллкод. Главное преимущество этого подхода в том, что иногда для шеллкода может не найтись достаточно нулевых байтов, особенно если мы будем использовать Donut, но об этом попозже. Минусы заключаются в том, что вес программы увеличится и антивирусы могут с подозрением отнестись к выделенной секции.
Поэтому если вы используете небольшой шеллкод, то в конце .text секции будет более чем достаточно свободного места.
Очевидно, что исходный код троянизируемого приложения нам никто не даст, то придется использовать дебаггер, для редактирования кода на языке ассемблера.
Первым делом открываем PE-bear и в левом верхнем углу выбираем file --> load PEs, затем ищем наш экзешник в проводнике
После того как открыли файл слева появится информация о секциях. Нажимаем пкм по Sections и жмем Add a new section.
Называем секцию и выделяем под нее место. 1000 байт более чем достаточно для метасплойтовского шелла, однако, в зависимости от пейлоуда вам может понадобится намного больше места.
Далее пкм по названию нашей проги и выбираем save executable as. Более PEbear нам не понадобится.
Теперь сгенерируем полезную нагрузку для которой мы выделили место
Записываем пейлоуд и начинаем слушать на порте который мы определили для шелла.
Далее переходим в x32dbg жмем файл –> открыть и ищем в проводнике нашу программу с новой секцией.
Перед нами открывается ассемблированный код программы. Выглядит страшно, но не стоит пугаться сейчас я все объясню. В самой первой колонке адреса инструкций в шестнадцатиричном формате, следующая за ней колонка это инструкции для процессора в шестнадцатиричной системе, следующая колонка это интерпретация этих инструкций на языке ассемблера.
Далее однократно нажимаем на кнопку выполнить (синяя стрелочка, подчеркнутая красным цветом). Нас переносит в точку входа в программу. Сразу же ставим здесь брейкпоинт для более удобной навигации по программе. Для этого нажимаем на точку рядом с адресом точки входа.
Переходим во вкладку карта памяти, где нас интересует название созданной нами секции.
Жмем пкм по ней --> перейти к дизассемблированному коду
В этой секции записываем адрес начала, чуть позже он нам понадобится.
Переходим во вкладку точки остановки и из нее возвращаемя к точке входа в программу. Теперь сохраняем инструкцию сразу же под точкой входа в программу.
После этого нажимаем пробел и вписываем инструкцию jmp с адресом пока что пустой секции для шеллкода. Жмем OK. Далее всплывет еще одно окошко, где предложат заменить следующую инструкцию, просто закройте его.
Дважды нажимаем шаг с обходом и оказываемся в новой секции
Далее необходимо сохранить состояние регистров и флагов командами pushad pushfd
После этого снова делаем 2 шага по коду программы и после исполнения команд pushad pushfd записываем значение регистра esp указывающего на текущую позицию в стеке.
Теперь выбираем следующую инструкцию и зажав лкм от души тянем вниз
Далее вставляем шеллкод в выделенное пространство
Забегая вперёд скажу, что по какой то причине метасплойтовский шеллкод не дает программе продолжить свое нормально выполнение. Так как сам я только начинаю изучать ассемблер, то диагностировать в чем причина подобного поведения я не смог. Есть подозрение, что это связано с аттрибутом EXITFUNC, который можно указать при генерации шеллкода. Тем не менее, проблема решается если убрать две команды dec esi и call ebp заменив их на nop. Должно это выглядит вот так.
На данном этапе бекдор уже готов за исключением того, что необходимо вернутся к коду оригинальной программы, перед этим выровняв регистры.
Ставим брейкпоинт последнем nop`е и жмем кнопку выполнить
Если сейчас вернуться в линукс то можно увидеть, что мы получили шелл
Далее возвращаемся в дебаггер и снимаем состояние esp регистра. После этого необходимо вычесть из значения esp перед исполнением шеллкода значение esp после.
Далее восстанавливаем значение esp до уровню, который был до исполнение шеллкода при помощи команды add
Далее возвращаем значения регистров командами popad и popfd
Теперь регистры находятся в таком же состоянии как и до того как мы начали исполнения шеллкода. Осталось только выполнить ту команду которую мы заменили на jmp и вернутся обычному исполнению кода.
Команда была push cave.477B70. Cave в данном случае это просто название секции, его писать не надо, так что просто push 477B70
Возвращаемся к точке входа и копируем адрес прямо под прыжком к шеллкоду.
Далее при помощи jmp переходим к этому адресу.
На этом всё, осталось только сохранить полученный файл. Для этого нажимаем на пластырь в верху экрана и жмем исправить файл
Теперь осталось проверить наш бекдор в полевых условиях.
Поздравляю всех, у кого получилось добиться желаемого результата. Если у вас все получилось, то вы должны были уже заметить, что дефендер триггерится на получившийся файл. Оно и не удивительно, учитывая, что мы используем стандартный метасплойтовский шеллкод, который к тому же никак не был закодирован для того, чтобы избежать обнаружения по сигнатуре. Да и даже если как следует закодировать полезную нагрузку, то избежать обнаружения от серьезных антивирусных систем не получится.
Есть 2 выхода из данной ситуации. Либо написать свой кастомный шеллкод (о чем я планирую выпустить статью в будущем), но это очень затратно по времени и быстро реализовать не получится, либо можно сконвертировать конкретный файл в шеллкод при помощи Donut или pe_to_shellcode.
Пробовал я только Donut, но он мне не очень понравился в виду результирующего веса шеллкода, ничуть не уступавшего весу программы из которой он был сделан.
github.com/TheWover/donut
Pe_to_shellcode протестировать просто не дошли руки поэтому просто оставлю здесь на случай, если кому-то эта тулза понравится больше чем Donut.
github.com/hasherezade/pe_to_shellcode
Если вы знакомы с похожими по функционалу тулзами, то можете поделиться ими в комментариях.
Обычно эта техника используется пиратам, репакерами, и прочими “благородными” кракерами, которые денно и нощно корпят над кодом лицензионных программ, ради того, чтобы мы с вами смогли поиграть в любимую игру или отредактировать фото или видео без необходимости платить жадным корпорациям.
Также иногда создаются фишинговые ресурсы, имитирующие сайты популярных бесплаьных программ типа обса или винрара, которые порой в поисковой строке высвечиваются и выше оригинальных. Особенно, на мой взгляд, выгодно проворачивать такое с криптокошельками.
Если вы посчитали эту статью полезно, то можете поддержать автора
BTC:bc1q5caeczraet2avfq0ww407m8t06k9rydpq76mrn
Автор: Amphisbaena
Специально для xss.pro
Программы которые нам понадобятся:
PE-bear (опционально)
x32/64dbg
Использовать я буду 32-битную версию putty, так как именно с него я начал изучение ассемблера, однако если вы хотите троянизировать 64-битную программу, то вся разница будет лишь в том, что на стадии генерации шеллкода нужно будет указать 64 бита, и в том что в x86-64 нет команд pushad/pushfd, таким образом придется вручную сохранить каждый из регистров.
Суть техники в том, что мы должны найти или создать достаточно большую область, где мы сможем модифицировать код программы так, чтобы перед исполнением самого оригинального кода программа исполняла произвольный код, который мы заложим в нее, а затем уже делала то, что она должна была.
В данном гайде будет показан способ с созданием новой секции, куда будет залит шеллкод. Главное преимущество этого подхода в том, что иногда для шеллкода может не найтись достаточно нулевых байтов, особенно если мы будем использовать Donut, но об этом попозже. Минусы заключаются в том, что вес программы увеличится и антивирусы могут с подозрением отнестись к выделенной секции.
Поэтому если вы используете небольшой шеллкод, то в конце .text секции будет более чем достаточно свободного места.
Очевидно, что исходный код троянизируемого приложения нам никто не даст, то придется использовать дебаггер, для редактирования кода на языке ассемблера.
Первым делом открываем PE-bear и в левом верхнем углу выбираем file --> load PEs, затем ищем наш экзешник в проводнике
После того как открыли файл слева появится информация о секциях. Нажимаем пкм по Sections и жмем Add a new section.
Называем секцию и выделяем под нее место. 1000 байт более чем достаточно для метасплойтовского шелла, однако, в зависимости от пейлоуда вам может понадобится намного больше места.
Далее пкм по названию нашей проги и выбираем save executable as. Более PEbear нам не понадобится.
Теперь сгенерируем полезную нагрузку для которой мы выделили место
Записываем пейлоуд и начинаем слушать на порте который мы определили для шелла.
Далее переходим в x32dbg жмем файл –> открыть и ищем в проводнике нашу программу с новой секцией.
Перед нами открывается ассемблированный код программы. Выглядит страшно, но не стоит пугаться сейчас я все объясню. В самой первой колонке адреса инструкций в шестнадцатиричном формате, следующая за ней колонка это инструкции для процессора в шестнадцатиричной системе, следующая колонка это интерпретация этих инструкций на языке ассемблера.
Далее однократно нажимаем на кнопку выполнить (синяя стрелочка, подчеркнутая красным цветом). Нас переносит в точку входа в программу. Сразу же ставим здесь брейкпоинт для более удобной навигации по программе. Для этого нажимаем на точку рядом с адресом точки входа.
Переходим во вкладку карта памяти, где нас интересует название созданной нами секции.
Жмем пкм по ней --> перейти к дизассемблированному коду
В этой секции записываем адрес начала, чуть позже он нам понадобится.
Переходим во вкладку точки остановки и из нее возвращаемя к точке входа в программу. Теперь сохраняем инструкцию сразу же под точкой входа в программу.
После этого нажимаем пробел и вписываем инструкцию jmp с адресом пока что пустой секции для шеллкода. Жмем OK. Далее всплывет еще одно окошко, где предложат заменить следующую инструкцию, просто закройте его.
Дважды нажимаем шаг с обходом и оказываемся в новой секции
Далее необходимо сохранить состояние регистров и флагов командами pushad pushfd
После этого снова делаем 2 шага по коду программы и после исполнения команд pushad pushfd записываем значение регистра esp указывающего на текущую позицию в стеке.
Теперь выбираем следующую инструкцию и зажав лкм от души тянем вниз
Далее вставляем шеллкод в выделенное пространство
Забегая вперёд скажу, что по какой то причине метасплойтовский шеллкод не дает программе продолжить свое нормально выполнение. Так как сам я только начинаю изучать ассемблер, то диагностировать в чем причина подобного поведения я не смог. Есть подозрение, что это связано с аттрибутом EXITFUNC, который можно указать при генерации шеллкода. Тем не менее, проблема решается если убрать две команды dec esi и call ebp заменив их на nop. Должно это выглядит вот так.
На данном этапе бекдор уже готов за исключением того, что необходимо вернутся к коду оригинальной программы, перед этим выровняв регистры.
Ставим брейкпоинт последнем nop`е и жмем кнопку выполнить
Если сейчас вернуться в линукс то можно увидеть, что мы получили шелл
Далее возвращаемся в дебаггер и снимаем состояние esp регистра. После этого необходимо вычесть из значения esp перед исполнением шеллкода значение esp после.
Далее восстанавливаем значение esp до уровню, который был до исполнение шеллкода при помощи команды add
Далее возвращаем значения регистров командами popad и popfd
Теперь регистры находятся в таком же состоянии как и до того как мы начали исполнения шеллкода. Осталось только выполнить ту команду которую мы заменили на jmp и вернутся обычному исполнению кода.
Команда была push cave.477B70. Cave в данном случае это просто название секции, его писать не надо, так что просто push 477B70
Возвращаемся к точке входа и копируем адрес прямо под прыжком к шеллкоду.
Далее при помощи jmp переходим к этому адресу.
На этом всё, осталось только сохранить полученный файл. Для этого нажимаем на пластырь в верху экрана и жмем исправить файл
Теперь осталось проверить наш бекдор в полевых условиях.
Поздравляю всех, у кого получилось добиться желаемого результата. Если у вас все получилось, то вы должны были уже заметить, что дефендер триггерится на получившийся файл. Оно и не удивительно, учитывая, что мы используем стандартный метасплойтовский шеллкод, который к тому же никак не был закодирован для того, чтобы избежать обнаружения по сигнатуре. Да и даже если как следует закодировать полезную нагрузку, то избежать обнаружения от серьезных антивирусных систем не получится.
Есть 2 выхода из данной ситуации. Либо написать свой кастомный шеллкод (о чем я планирую выпустить статью в будущем), но это очень затратно по времени и быстро реализовать не получится, либо можно сконвертировать конкретный файл в шеллкод при помощи Donut или pe_to_shellcode.
Пробовал я только Donut, но он мне не очень понравился в виду результирующего веса шеллкода, ничуть не уступавшего весу программы из которой он был сделан.
github.com/TheWover/donut
Pe_to_shellcode протестировать просто не дошли руки поэтому просто оставлю здесь на случай, если кому-то эта тулза понравится больше чем Donut.
github.com/hasherezade/pe_to_shellcode
Если вы знакомы с похожими по функционалу тулзами, то можете поделиться ими в комментариях.
Обычно эта техника используется пиратам, репакерами, и прочими “благородными” кракерами, которые денно и нощно корпят над кодом лицензионных программ, ради того, чтобы мы с вами смогли поиграть в любимую игру или отредактировать фото или видео без необходимости платить жадным корпорациям.
Также иногда создаются фишинговые ресурсы, имитирующие сайты популярных бесплаьных программ типа обса или винрара, которые порой в поисковой строке высвечиваются и выше оригинальных. Особенно, на мой взгляд, выгодно проворачивать такое с криптокошельками.
Если вы посчитали эту статью полезно, то можете поддержать автора
BTC:bc1q5caeczraet2avfq0ww407m8t06k9rydpq76mrn
Автор: Amphisbaena
Специально для xss.pro
Вложения
Последнее редактирование: