# frozen_string_literal: true # # ronin-payloads - A Ruby micro-framework for writing and running exploit # payloads. # # Copyright (c) 2007-2024 Hal Brodigan (postmodern.mod3 at gmail.com) # # ronin-payloads is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # ronin-payloads is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with ronin-payloads. If not, see . # module Ronin module Payloads class CLI # # Adds a `-F,--format hex|c|shell|powershell|xml|html|js|ruby` option. # module FormatOption # Available formats. FORMATS = { hex: -> { require 'ronin/support/encoding/hex' Support::Encoding::Hex.method(:escape) }, c: -> { require 'ronin/support/encoding/c' Support::Encoding::C.method(:quote) }, shell: -> { require 'ronin/support/encoding/shell' Support::Encoding::Shell.method(:quote) }, powershell: -> { require 'ronin/support/encoding/powershell' Support::Encoding::PowerShell.method(:quote) }, xml: -> { require 'ronin/support/encoding/xml' Support::Encoding::XML.method(:encode) }, html: -> { require 'ronin/support/encoding/html' Support::Encoding::HTML.method(:encode) }, js: -> { require 'ronin/support/encoding/js' Support::Encoding::JS.method(:quote) }, ruby: -> { require 'ronin/support/encoding/ruby' Support::Encoding::Ruby.method(:quote) } } # # Adds the `-F,--format hex|c|shell|powershell|xml|html|js|ruby` option. # # @param [Class] command # The command class including {FormatOption}. # def self.included(command) command.option :format, short: '-F', value: {type: FORMATS.keys}, desc: 'Formats the outputed data' do |format| @format = FORMATS.fetch(format).call end end # The format to encode data with. # # @return [Method, nil] attr_reader :format # # Formats the given data based on the `-F,--format` option. # # @param [String] data # The data to format. # # @return [String] # The formatted data. # def format_data(data) if @format then @format.call(data) else data end end # # Formats and prints the given data. # # @param [String] data # The raw data to format and print. # def print_data(data) formatted_data = format_data(data) if stdout.tty? then puts formatted_data else stdout.write(formatted_data) end end end end end end