Двухчастный: SPIKE фаззер: "неопределенный символ: s_word"

В настоящее время я изучаю разработку эксплойтов для Windows и работаю над обнаружением некоторых сбоев в приложении через Spike. Я вручную обнаружил сбой через скрипт scapy, который я написал, и изменил некоторые данные. Моя текущая проблема - попытка написать шаблон Spike, чтобы он записывал для других сбоев, но в настоящее время я не могу заставить Spike записывать двоичные данные, которые я отправляю - он всегда отправляет одно и то же. Использование других вызовов Spike, т.е. s_word, s_binary_bigendian_word все результат в:

generic_send_tcp: undefined symbol: s_word

generic_send_tcp: undefined symbol: s_binary_bigendian_word и т.п.

Это приложение Disk Saavy 10.4.18, в котором известно переполнение буфера через SEH. Я знаю, что есть эксплойт, пожалуйста, не связывай меня с этим. Я пытаюсь узнать, как перейти от фаззинга двоичного протокола к полному использованию.

Я захватил некоторый начальный трафик и обработал его в скриптовый скрипт для 3WHS, затем PSH,ACK мои данные. Ниже приведены исходные данные примера пакета:

0000   75 19 ba ab 03 00 00 00 00 00 00 00 1a 00 00 00  u...............
0010   20 00 00 00 00 00 00 00 53 45 52 56 45 52 5f 47   .......SERVER_G
0020   45 54 5f 49 4e 46 4f 02 32 01 44 41 54 41 01 30  ET_INFO.2.DATA.0
0030   01 00 00 00 60 c0 f1 02                          ....`.......`...                   

Первые 12 байтов должны остаться такими, какие они есть (по-видимому, не являются частью моего вопроса), иначе приложение не проанализирует их должным образом. Однако четыре байта сразу после этого подключаются к ECX. Изменение этих четырех на что-то похожее 1A CC CC CC вызывает ECX хорошо, быть CC CC CC 1A и приложение вылетает. Это все хорошо. Scapy - это круто, но я бы предпочел использовать fuzzing фреймворк, такой как SPIKE.

Первый (и, конечно, второй) вопрос: хотя просмотр "документации" Спайка позволил мне создать шаблон размытия и отправить мои данные, в настоящее время я не могу фактически "размыть" байты, на которые нацеливаюсь. Мой скрипт Spike (вероятно, плохой) ниже:

s_binary("\\x75\\x19\\xBA\\xAB\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00");
s_block_start("ecx");
s_binary("0x1A000000");
s_block_end("ecx");
s_binary("\\x20\\x00\\x00\\x00\\x00\\x00\\x00\\x00");
s_string("SERVER_GET_INFO");
s_binary("\\x02");
s_string("2");
s_binary("\\x01");
s_string("DATA");
s_binary("\\x01");
s_string("0");
s_binary("\\x01\\x00\\x00\\x00");
s_string("`");
s_binary("\\xC0\\xF1\\x02");

Side note-- if there's a better way to write this script, let me know.
(minus the block, that's just for learning)

Запуск шаблона с generic_send_tcp 192.168.138.134 9124 diskSaavy.spk ecx 0 работает и сервер отвечает, но байты в полезной нагрузке никогда не изменяются, и одна и та же полезная нагрузка отправляется снова и снова. Что я делаю неправильно?

Теперь, просматривая документацию и многие другие варианты поиска, мы попытались использовать многие другие, более целенаправленные значения, такие как s_word, s_binary_words_binary_bigendian_word_variable и LE соответственно. Все вышеизложенное можно найти в Google и статьях, таких как Введение в SPIKE, Набор для создания Fuzzer и Fuzzing Frameworks.

Так я меняю s_binary("0x1A000000"); в s_binary_variable("0x1A000000");, s_word("0x1A000000"); и т.д., и каждый раз, когда я получаю:

# generic_send_tcp 192.168.138.134 9124 diskSaavy.spk ecx 0
Total Number of Strings is 681
Fuzzing
Fuzzing Variable 0:0
generic_send_tcp: undefined symbol: s_word <--- my call

Это сводит меня с ума. До сих пор я пробовал всевозможные звонки, такие как приведенные выше примеры, и установку binutils как предложено ответом на связанный вопрос о SO, но решение не сработало. Я прочитал, что undefined symbol скорее всего, это связано с проблемой компоновщика, но это немного выше моего уровня знаний. Буду признателен за любую помощь, которую я могу получить.

Есть идеи? Благодарю.

2 ответа

Решение

Итак, я действительно делал несколько вещей неправильно в этом (очевидно). Может, кто-то борется с этим, увидит мой вопрос, и это может помочь.

SPIKE не предназначен для шестнадцатеричного / двоичного размытия - он выделяется при размытых строках и целочисленных значениях, но нет встроенных методов размытия двоичных строк (о которых я знаю). Они должны быть добавлены вручную, и многие статьи, которые я прочитал, вызывают методы, к которым у меня нет доступа, что вызывает большие трудности. Двоичные строки считаются статическими, поэтому они всегда будут отправлены как есть. Вы можете получить информацию обо всех методах, которые SPIKE поддерживает изначально, просмотрев spike.h файл и глядя на все структуры внутри. Вот почему я получаю unknown symbol: XXXX пытаясь использовать их - они никогда не были определены.

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

Я не знаю, что Спайк поддерживается больше. Салли заменил это, но тоже не очень активно. boofuzz более активно поддерживается и функционирует по тем же принципам. Документация

Не уверен насчет Спайка, но у Sulley и boofuzz ​​есть параметр "fuzzable", который при значении false отключает фаззинг на элементе, поэтому вы можете попытаться установить для него значение true (хотя по умолчанию оно обычно равно true).

Изменить: Раскрытие: я поддерживаю boofuzz.

Другие вопросы по тегам