Method: Rex::Poly::Machine#generate
- Defined in:
- lib/rex/poly/machine/machine.rb
#generate ⇒ Object
Try to generate a solution.
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 |
# File 'lib/rex/poly/machine/machine.rb', line 614 def generate if( @blocks.has_key?( 'end' ) ) @blocks.delete( 'end' ) end @blocks['end'] = Block.new( 'end' ) @blocks['end'] << SymbolicPermutation.new( 'end', self, 1 ) # Mix up the permutation orders for each block and create the tree structure. previous = ::Array.new @blocks.each_value do | block | # Shuffle the order of the blocks permutations. block.shuffle # create the tree by adding the current blocks permutations as children of the previous block. current = ::Array.new block.each do | permutation | permutation.remove_children previous.each do | prev | prev.add_child( permutation ) end current << permutation end previous = current end # Shuffle the order of the available registers @reg_available = @reg_available.shuffle # We must try every permutation of the register orders, so if we fail to # generate a solution we rotate the available registers to try again with # a different order. This ensures we perform and exhaustive search. 0.upto( @reg_available.length - 1 ) do @solution.reset # Start from the root node in the solution space and generate a # solution by traversing the solution space's tree structure. if( @blocks['begin'].solve ) # Return the solutions buffer (perform a last pass to fixup all offsets)... return @solution.buffer end @reg_available.push( @reg_available.shift ) end # :( nil end |