Module: OneGadget

Defined in:
lib/one_gadget.rb,
lib/one_gadget/abi.rb,
lib/one_gadget/cli.rb,
lib/one_gadget/error.rb,
lib/one_gadget/gadget.rb,
lib/one_gadget/helper.rb,
lib/one_gadget/logger.rb,
lib/one_gadget/update.rb,
lib/one_gadget/version.rb,
lib/one_gadget/fetchers.rb,
lib/one_gadget/one_gadget.rb,
lib/one_gadget/fetchers/arm.rb,
lib/one_gadget/fetchers/x86.rb,
lib/one_gadget/emulators/arm.rb,
lib/one_gadget/emulators/x86.rb,
lib/one_gadget/fetchers/base.rb,
lib/one_gadget/fetchers/i386.rb,
lib/one_gadget/emulators/i386.rb,
lib/one_gadget/fetchers/amd64.rb,
lib/one_gadget/emulators/amd64.rb,
lib/one_gadget/emulators/lambda.rb,
lib/one_gadget/fetchers/aarch64.rb,
lib/one_gadget/fetchers/objdump.rb,
lib/one_gadget/emulators/aarch64.rb,
lib/one_gadget/emulators/processor.rb,
lib/one_gadget/emulators/arm_family.rb,
lib/one_gadget/emulators/safe_calls.rb,
lib/one_gadget/emulators/conditional.rb,
lib/one_gadget/emulators/instruction.rb,
lib/one_gadget/emulators/register_file.rb

Overview

Main module.

Defined Under Namespace

Modules: ABI, CLI, Emulators, Error, Fetchers, Gadget, Helper, Logger, Update

Constant Summary collapse

VERSION =

Current gem version.

'2.0.0'

Class Method Summary collapse

Class Method Details

.gadgets(file: nil, build_id: nil, details: false, force_file: false, level: 0) ⇒ Array<OneGadget::Gadget::Gadget>, Array<Integer>

The man entry of gem one_gadget. If want to find gadgets from file, it will search gadgets by its build id first.

Examples:

OneGadget.gadgets(file: './libc.so.6')
OneGadget.gadgets(build_id: '60131540dadc6796cab33388349e6e4e68692053')

Parameters:

  • file (String) (defaults to: nil)

    The relative path of libc.so.6.

  • build_id (String) (defaults to: nil)

    The BuildID of target libc.so.6.

  • details (Boolean) (defaults to: false)

    Return gadget objects or offset only.

  • force_file (Boolean) (defaults to: false)

    When file is given, OneGadget will search gadgets according its build id first. force_file = true to disable this feature.

  • level (Integer) (defaults to: 0)

    Output level. Higher levels show more of the gadgets found. 0 (default) shows only the gadgets with the highest successful probability; 1 shows the full trimmed set; 2 and above additionally include gadgets a lower level drops as duplicate or harder-to-satisfy (this emulates the file, bypassing the build-id database).

Returns:



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/one_gadget/one_gadget.rb', line 35

def gadgets(file: nil, build_id: nil, details: false, force_file: false, level: 0)
  ret = if build_id
          OneGadget::Fetchers.from_build_id(build_id, level:) || OneGadget::Logger.not_found(build_id)
        else
          # level >= RAW_LEVEL wants every gadget, but the build-id database
          # only stores the trimmed set, so emulate the file instead of it.
          force = force_file || level >= OneGadget::Fetchers::RAW_LEVEL
          from_file(OneGadget::Helper.abspath(file), force:, level:)
        end
  ret = refine_gadgets(ret, level)
  # An offset can recur at level >= 2 (one entry point, several branch-reach
  # constraint sets); the offset-only view lists it once. A no-op at lower
  # levels, where offsets are already unique.
  ret = ret.map(&:offset).uniq unless details
  ret
rescue OneGadget::Error::Error => e
  OneGadget::Logger.error("#{e.class.name.split('::').last}: #{e.message}")
  []
end