Нулевой байт(асм)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by TheNozza, 19 Mar 2010.

  1. TheNozza

    TheNozza New Member

    Joined:
    18 Mar 2010
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Уважаемые специалисты асма, подскажите пожалуйста по следующему вопросу. Самому сообразить не удалось.
    Тут нужен опыт и закалка. Которые,надеюсь преобрету с годами.
    Вообщем к делу!
    Исследуется уязвимость переполнения буфера,расположенного в стековом кадре.

    Hight addr EIP EBP С Т Е К О В Ы Й К А Д Р ......аргументы функции2 EIP EBP .................. Low addr
    ...................................\buf before overflow \---------------------->-\ buf after overflow \

    Функция2 так красиво копирует локальную переменную стекового кадра функции1(В реале конечно всё намного сложнее,так устроен мир,но схемка отражает суть вопроса) .

    Сам вопрос:
    1)DEP влючен(код шеллкода на данном этапе в стеке не исполняется).
    Я осуществляю переполнение буфера по данной схеме перезаписывая адрес возврата функции2,и указатель базы стекового кадра функции2(база переписывается по любому-она в середине строки).
    База должна быть равна 0006FAE4 +- 10-14h байт. Это необходимо для последующего отключения
    DEPa(разрешения выполнения кода в стеке). Символы E4,FA,06 строкой передаю без проблем. А нулевой байт- засада! В середине строки его ясно передавать нельзя.

    Условия
    1) DEP включен пока. (Можно только вызывать функции (с любого адреса из дллок)).
    2) Мне достаточно даже чтобы просто EBP стал равным ESP и всё ок.
    Какие-то инструкции нужны из дллок выполнить типа
    1 mov EBP,ESP;retn;
    (но тут засада перед retn в функции будет торчать драное pop EBP -которое всю малину...))
    2 Просто хотя бы MOV EBP,ESP;...CALL DWORD PTR SS:[EBP+-несколько десятков байт];(Туда адрес я шелкодом положу.
    все адреса нормальные без нулевых байтов - только стек такой);
    (Такой последовательности инструкций не нашёл)
    Какие варианты?

    И последнее если кто-то знает хотя бы примерный адрес расположения инструкции (JMP ESP или CALL ESP
    в дллках SP2 или хотя бы название библиотеки напишите расцелую).

    Жду ответа от добрых людей! Есть же программеры с опытом, со специализацией - агрессивное программирование:переполнение буфера,использование уязвимостей стек,куча,захват нити(Thread'а), отточка шеллкодов,написание эксплойтов. (По моему мнению - существенная разница между написанием программы и шеллкода, шеллкод скорее не пишется, а точится [синоним - подгоняется к своему идеалу методом бесконечных проб и ошибок,доводится до совершенства!]Отточенный шеллкод-это красота, совершенство,которое не встретишь реальном мире,предмет гордости,сокровище,заключённое в объёме каких-то нескольких сотен байт.Как раз тот случай когда поражает не объём, а глубина.)

    Ждём профессионалов асма!
    http://www.insidepro.com/kk/063/063r.shtml - Красивая статья по обходу DEP'а.
    Цитата:
    "Главное, чтобы shell-код получил управление, и он его получит!Оторвать мыщъх'у хвост, если это не так!"
    LPVOID VirtualAlloc
    (
    LPVOID lpAddress,
    SIZE_T dwSize,
    WORD flAllocationType,
    DWORD flProtect
    );


    lpAddress Указатель на передаваемый регион памяти
    dwSize Размер передаваемого региона
    flAllocationType Тип запроса, MEM_COMMIT (1000h) - передача памяти
    flProtect Атрибуты защиты, PAGE_EXECUTE_READWRITE (40h) - rwx

    Что же великий и всемогущий Мыщъх недоговаривает или преднамеренно скрывает как положить шеллкодом напрмер четвёртый параметр функции VirtualAlloc flProtect (40h значение) в переполненный буфер при вкл. DEPe! (00000040h) Та же тема получится, только байтов нулевых поболее будет.
    Я просто другую функцию юзаю, тема та же - размещение шеллкодом в буфере нулевых байтов(байта) при включенном DEPe
    Не ради критики, а ради божественного света знаний!

    Подскажите молодёжи!