Больше Null Бесплатный Shellcode - PullRequest
4 голосов
/ 28 июля 2011

Мне нужно найти замены без нулей для следующих инструкций, чтобы я мог поместить следующий код в шелл-код.

Первая инструкция, которую мне нужно преобразовать в нулевую, это:

mov ebx, str    ; the string containing /dev/zero

Строка str определена в моем разделе .data.Второй:

mov    eax,0x5a

Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

Если вы хотите узнать, как составляется ассемблерный код, какой тип инструкций заканчивается в ассемблерном коде с определенными свойствами, то (на x86 / x64) выполните следующее:

  1. Возьмите справочные руководства по набору инструкций Intel (я думаю, четыре тома на момент написания этой статьи).Они содержат таблицы кодов операций (двоичные форматы команд) и подробные списки всех разрешенных кодов операций для конкретной мнемоники сборки (название инструкции).
    Ознакомьтесь с ними и мысленно разделите их на две группы - те, которые соответствуют ожидаемым свойствам (например,, не содержащий символ «х» ... или любой другой конкретный), и те, которые не.2-я категория, которую вы должны исключить из своего кода, если они присутствуют.

  2. Скомпилируйте ваш код, сказав компилятору не отбрасывать промежуточные компиляции:

    gcc -save-temps -c csource.c
  3. Разобрать объектный файл:
    objdump -d csource.o
  4. Вывод дизассемблирования из objdump будет содержать двоичные инструкции (коды операций), а такжеимена команд (мнемоника), т.е. вы точно увидите, какой формат кода операции был выбран.Теперь вы можете проверить, есть ли здесь какие-либо коды операций из 2-го набора, как указано выше.

  5. Приходит творческая часть работы.Когда вы обнаружили в выводе разборки инструкцию, что не не соответствует вашим ожиданиям / требованиям, найдите / создайте замену (или, чаще, заменяющую последовательность из нескольких инструкций), которая даеттот же конечный результат, но он составлен только из инструкций, которые do соответствуют тому, что вам нужно.
    Вернитесь к промежуточным компонентам компиляции, указанным выше, найдите сборку csource.s, внесите изменения, соберите / перекомпоновайте,test.

  6. Если вы хотите сделать свой код сборки автономным (т.е. не использовать системные библиотеки времени выполнения / выполнять системные вызовы напрямую), обратитесь к документации по внутренним компонентам вашей операционной системы (как выполнять системные вызовы)и / или разберите библиотеки времени выполнения, которые обычно делают это от вашего имени, чтобы узнать, как это делается.

Так как 5. определенно домашнее задание, такого же типа, как createцикл C for(), эквивалентный данному циклу while() , не ожидайте слишком большой помощи там.Справочные руководства по набору инструкций и эксперименты с (dis) ассемблером - вот что вам нужно.

Кроме того, если вы учитесь, посетите уроки о том, как работают компиляторы / как писать компиляторы - они охватывают как сборкувыбор инструкций выполняется компиляторами, и я могу себе представить, что это будет интересный / сложный проект термина, например, написать компилятор, в выводе которого гарантированно будет содержаться символ '?' (0x3f), но никогда '!'(0x21).Вы поняли.

1 голос
/ 28 июля 2011

Вы упоминаете постоянную загрузку через xor для очистки плюс inc и shl для получения любого набора битов, который вы хотите.

Наименее хрупкий способ загрузить неизвестную константу (вашу неизвестную str) - загрузить константу xor с некоторым значением, например 0xAAAAAAAA, а затем xor, который вернется в следующей инструкции , Например загрузить 0x1234:

   0:   89 1d 9e b8 aa aa       mov    %ebx,0xaaaab89e
   6:   31 1d aa aa aa aa       xor    %ebx,0xaaaaaaaa

Вы можете даже выбрать 0xAAAAAAAA, чтобы быть интересным ascii!

...