Зависимости Bit Flag в Sulley Fuzzing Framework

Я пытаюсь построить фаззер с Салли. Протокол, который я использую, имеет однобайтовое поле control. биты, установленные в этом поле, определяют, какие поля могут следовать. Теперь мне интересно, как реализовать это поведение, используя параметры dep в Sulley. Единственными доступными операторами dep_compare являются "==, !=, >, >=, <, <=", но я не думаю, что смогу проверить, установлен ли бит в другом поле с этими операторами. Так как же я мог это сделать?

s_byte(0b1000000, "control_field")

# The following block shall be present if bit 7 is set in control_field
# I'd like to use something like 
# > control_field & 0b1000000 != 0 
# but I don't know how

if s_block_start("something_optional", dep="control_field", dep_compare="?"):
    s_short(0x1234, "optional")
s_block_end()

person vicco    schedule 05.11.2015    source источник
comment
Если вы сделаете патч самостоятельно, отправьте запрос на включение в проект! Вы, вероятно, столкнетесь с рядом таких возможных улучшений, если будете использовать инструмент очень долго.   -  person jtpereyda    schedule 10.11.2015


Ответы (1)


Если вы хотите проверить только старший бит, вы можете использовать >=, так как 0b10000000 — это просто число.

if s_block_start("something_optional", dep="control_field", dep_compare=">=", dep_value=0b10000000):

Однако, если вы хотите проверить младшие биты, вам нужно будет реализовать свой собственный оператор. В sulley/blocks.py найдите класс Block и его метод render. Существует большая часть блоков if, которые не должны быть слишком сложными для изменения. Например.

        if self.dep_compare == "&" and self.dep_value & self.request.names[self.dep].value != self.dep_value:
            self.rendered = ""
            return
person jtpereyda    schedule 09.11.2015