class FSA

Public Class Methods

new(buffer_size = 0) click to toggle source
# File lib/fsa.rb, line 6
def initialize(buffer_size = 0)
  @mem = {}
  @buffer_size = buffer_size
end
s(addr, arg_index) click to toggle source
# File lib/fsa.rb, line 71
def self.s(addr, arg_index)
  if addr.class <= Integer
    addr = addr % 4294967296
  else
    raise TypeError, "Address must be Integer"
  end
  if arg_index.class <= Integer
    arg_index = arg_index % 4294967296
  else
    raise TypeError, "Address must be Integer"
  end
  [addr].pack("L") + "%#{arg_index}$s"
end

Public Instance Methods

[](addr) click to toggle source
# File lib/fsa.rb, line 59
def [](addr)
  @mem[addr]
end
[]=(addr, value) click to toggle source
# File lib/fsa.rb, line 11
def []=(addr, value)
  
  if addr.class <= Integer
    addr = addr % 4294967296
  else
    raise TypeError, "Address must be Integer"
  end

  value_class = value.class
  
  case
  when value_class == Array
    value.each do |v|
      addr = self.[]=(addr, v)
    end
    return addr
    
  when value_class == String
    value.bytes.each_with_index do |v, i|
      @mem[addr + i] = v
    end
    return addr + value.length
    
  else

    bit_length = value.bit_length
    
    case
    when bit_length <= 8
      @mem[addr] = value
      return addr + 1
      
    when bit_length <= 16
      2.times do |i|
        @mem[addr + i] = (value.to_i >> (i * 8)) % 256
      end
      return addr + 2
      
    when bit_length <= 32
      4.times do |i|
        @mem[addr + i] = (value.to_i >> (i * 8)) % 256
      end
      return addr + 4
      
    end
  end
end
payload(arg_index, padding = 0, start_len = 0) click to toggle source
# File lib/fsa.rb, line 63
def payload(arg_index, padding = 0, start_len = 0)
  raise TypeError, "Index must be Integer" unless arg_index.class <= Integer
  raise TypeError, "Padding must be Integer" unless padding.class <= Integer
  raise TypeError, "Start_len must be Integer" unless start_len.class <= Integer
  gen = PayloadGenerator.new(@mem, @buffer_size)
  gen.payload(arg_index, padding, start_len)
end