Module: PWN::Plugins::BusPirate

Defined in:
lib/pwn/plugins/bus_pirate.rb

Overview

This plugin is used for interacting with Bus Pirate v3.6 This plugin may be compatible with other versions, however, has not been tested with anything other than v3.6.

Class Method Summary collapse

Class Method Details

.authorsObject

Author(s)

0day Inc. <[email protected]>



112
113
114
115
116
# File 'lib/pwn/plugins/bus_pirate.rb', line 112

public_class_method def self.authors
  "AUTHOR(S):
    0day Inc. <[email protected]>
  "
end

.connect(opts = {}) ⇒ Object

Supported Method Parameters

bus_pirate_obj = PWN::Plugins::BusPirate.connect(

block_dev: 'optional serial block device path (defaults to /dev/ttyUSB0)',
baud: 'optional (defaults to 9600)',
data_bits: 'optional (defaults to 8)',
stop_bits: 'optional (defaults to 1)',
parity: 'optional (defaults to SerialPort::NONE)',
flow_control: 'optional (defaults to SerialPort::HARD) SerialPort::NONE|SerialPort::SOFT|SerialPort::HARD'

)



47
48
49
50
51
52
# File 'lib/pwn/plugins/bus_pirate.rb', line 47

public_class_method def self.connect(opts = {})
  PWN::Plugins::Serial.connect(opts)
rescue StandardError => e
  disconnect(bus_pirate_obj: bus_pirate_obj) unless bus_pirate_obj.nil?
  raise e
end

.connect_via_screen(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::BusPirate.connect_via_screen(

screen_bin: 'optional - defaults to /usr/bin/screen'
block_dev: 'optional - serial block device path (defaults to /dev/ttyUSB0)'

)



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/pwn/plugins/bus_pirate.rb', line 15

public_class_method def self.connect_via_screen(opts = {})
  block_dev = opts[:block_dev].to_s if File.exist?(
    opts[:block_dev].to_s
  )

  block_dev = '/dev/ttyUSB0' if opts[:block_dev].nil?

  if opts[:screen_bin].nil?
    screen_bin = '/usr/bin/screen'
  else
    screen_bin = opts[:screen_bin].to_s.strip.chomp.scrub
  end

  raise "ERROR: #{screen_bin} not found." unless File.exist?(screen_bin)

  screen_params = "#{block_dev} 115200 8 N 1"
  screen_cmd = "#{screen_bin} #{screen_params}"
  system(screen_cmd)
rescue StandardError => e
  raise e
end

.disconnect(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::BusPirate.disconnect(

bus_pirate_obj: 'required - bus_pirate_obj returned from #connect method'

)



102
103
104
105
106
107
108
# File 'lib/pwn/plugins/bus_pirate.rb', line 102

public_class_method def self.disconnect(opts = {})
  PWN::Plugins::Serial.disconnect(
    serial_obj: opts[:bus_pirate_obj]
  )
rescue StandardError => e
  raise e
end

.helpObject

Display Usage for this Module



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/pwn/plugins/bus_pirate.rb', line 120

public_class_method def self.help
  puts "USAGE:
    #{self}.connect_via_screen(
      screen_bin: 'optional - defaults to /usr/bin/screen'
      block_dev: 'optional serial block device path (defaults to /dev/ttyUSB0)'
    )

    bus_pirate_obj = #{self}.connect(
      block_dev: 'optional serial block device path (defaults to /dev/ttyUSB0)',
      baud: 'optional (defaults to 9600)',
      data_bits: 'optional (defaults to 8)',
      stop_bits: 'optional (defaults to 1)',
      parity: 'optional (defaults to SerialPort::NONE)',
      flow_control: 'optional (defaults to SerialPort::HARD) SerialPort::NONE|SerialPort::SOFT|SerialPort::HARD'
    )

    #{self}.init_mode(
      bus_pirate_obj: 'required - bus_pirate_obj returned from #connect method'
      mode: 'required - bus pirate mode to invoke'
    )

    #{self}.disconnect(
      bus_pirate_obj: 'required - bus_pirate_obj returned from #connect method'
    )

    #{self}.authors
  "
end

.init_mode(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::BusPirate.init_mode(

bus_pirate_obj: 'required - bus_pirate_obj returned from #connect method'
mode: 'required - bus pirate mode to invoke'

)



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/pwn/plugins/bus_pirate.rb', line 59

public_class_method def self.init_mode(opts = {})
  bus_pirate_obj = opts[:bus_pirate_obj]
  mode = opts[:mode].to_s.strip.chomp.scrub.upcase

  case mode
  when 'BBI01'
    # Enter reset binary mode
    PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x00')
  when 'SPI1'
    # Enter binary SPI mode
    PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x01')
  when 'I2C1'
    # Enter I2C mode
    PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x02')
  when 'ART1'
    # Enter UART mode
    PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x03')
  when '1W01'
    # Enter 1-Wire mode
    PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x04')
  when 'RAW1'
    # Enter raw-wire mode
    PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x05')
  when 'RESET'
    # Reset Bus Pirate
    PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x0F')
  when 'STEST'
    # Bus Pirate self-tests
    PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x10')
  else
    raise "Invalid mode: #{mode}"
  end

  PWN::Plugins::Serial.response(serial_obj: bus_pirate_obj)
rescue StandardError => e
  raise e
end