Class: FSA

Inherits:
Object
  • Object
show all
Defined in:
lib/fsa.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(buffer_size = 0) ⇒ FSA

Returns a new instance of FSA.



6
7
8
9
# File 'lib/fsa.rb', line 6

def initialize(buffer_size = 0)
  @mem = {}
  @buffer_size = buffer_size
end

Class Method Details

.s(addr, arg_index) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
# 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

Instance Method Details

#[](addr) ⇒ Object



59
60
61
# File 'lib/fsa.rb', line 59

def [](addr)
  @mem[addr]
end

#[]=(addr, value) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 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) ⇒ Object

Raises:

  • (TypeError)


63
64
65
66
67
68
69
# 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