one_gadget 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +0 -2
- data/lib/one_gadget/builds/libc-2.23-369de0e1d833caa693af17f17c83ba937f0a4dad.rb +8 -0
- data/lib/one_gadget/builds/libc-2.23-926eb99d49cab2e5622af38ab07395f5b32035e9.rb +1 -1
- data/lib/one_gadget/builds/libc-2.23-edceed30099baad51871c5fc277daf9b74dc726a.rb +8 -0
- data/lib/one_gadget/fetchers/amd64.rb +2 -0
- data/lib/one_gadget/fetchers/base.rb +5 -0
- data/lib/one_gadget/fetchers/i386.rb +2 -0
- data/lib/one_gadget/helper.rb +7 -4
- data/lib/one_gadget/logger.rb +4 -0
- data/lib/one_gadget/version.rb +1 -1
- metadata +5 -21
- data/spec/data/libc-2.19-cf699a15caae64f50311fc4655b86dc39a479789.so +0 -0
- data/spec/data/libc-2.19-fd51b20e670e9a9f60dc3b06dc9761fb08c9358b.so +0 -0
- data/spec/data/libc-2.23-60131540dadc6796cab33388349e6e4e68692053.so +0 -0
- data/spec/data/libc-2.23-926eb99d49cab2e5622af38ab07395f5b32035e9.so +0 -0
- data/spec/gadget_spec.rb +0 -22
- data/spec/helper_spec.rb +0 -25
- data/spec/one_gadget_amd64_spec.rb +0 -31
- data/spec/one_gadget_i386_spec.rb +0 -24
- data/spec/spec_helper.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43bf496ed69e442f3a6672eff7b0e3f7dffe9256
|
4
|
+
data.tar.gz: 2ef6da1b0f7173adf036ad43e99533fd98005606
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa4a2851e9ad28b690c7f2d7c4bcb4c3797d4b587b0b5a02d130d06628576aabbc73812d837c8efd04ea099c98659f0b9447c3d184894781198deae234707a44
|
7
|
+
data.tar.gz: 76ff23514c99da82136f7f55d3ba44d7dfcf48a56dba3db853e994ad90bcd8f341d963cb5cf9fb53bebf562dcadf1819bab6d02fbbd5f80625ce9ac20f94504d
|
data/README.md
CHANGED
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'one_gadget/gadget'
|
2
|
+
# Ubuntu GLIBC 2.23-0ubuntu3
|
3
|
+
# ELF 64-bit LSB shared object, x86-64
|
4
|
+
build_id = File.basename(__FILE__, '.rb').split('-').last
|
5
|
+
OneGadget::Gadget.add(build_id, 0x4525a, constraints: ['[rsp+0x30] == NULL'])
|
6
|
+
OneGadget::Gadget.add(build_id, 0xef9f4, constraints: ['[rsp+0x50] == NULL'])
|
7
|
+
OneGadget::Gadget.add(build_id, 0xf0897, constraints: ['[rsp+0x70] == NULL'])
|
8
|
+
OneGadget::Gadget.add(build_id, 0xf5e40, constraints: ['[rbp-0xf8] == NULL', 'rcx == NULL'])
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'one_gadget/gadget'
|
2
2
|
# Ubuntu GLIBC 2.23-0ubuntu5
|
3
3
|
# ELF 32-bit LSB shared object, Intel 80386
|
4
|
-
build_id = File.basename(__FILE__, '.rb').split('-').last
|
4
|
+
build_id = File.basename(__FILE__, '.rb').split('-').last
|
5
5
|
rw_area_constraint = 'esi is the address of `rw-p` area of libc'
|
6
6
|
OneGadget::Gadget.add(build_id, 0x3ac69, constraints: [rw_area_constraint, '[esp+0x34] == NULL'])
|
7
7
|
OneGadget::Gadget.add(build_id, 0x5fbbe, constraints: [rw_area_constraint, 'eax == NULL'])
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'one_gadget/gadget'
|
2
|
+
# Ubuntu GLIBC 2.23-0ubuntu5
|
3
|
+
# ELF 32-bit LSB shared object, Intel 80386
|
4
|
+
build_id = File.basename(__FILE__, '.rb').split('-').last
|
5
|
+
rw_area_constraint = 'esi is the address of `rw-p` area of libc'
|
6
|
+
OneGadget::Gadget.add(build_id, 0x3a7f9, constraints: [rw_area_constraint, '[esp+0x34] == NULL'])
|
7
|
+
OneGadget::Gadget.add(build_id, 0x5ef3e, constraints: [rw_area_constraint, 'eax == NULL'])
|
8
|
+
OneGadget::Gadget.add(build_id, 0x11dcb5, constraints: [rw_area_constraint, 'eax == NULL'])
|
@@ -3,6 +3,8 @@ module OneGadget
|
|
3
3
|
module Fetcher
|
4
4
|
# Fetcher for amd64.
|
5
5
|
class Amd64 < OneGadget::Fetcher::Base
|
6
|
+
# Gadgets for amd64 glibc.
|
7
|
+
# @return [Array<OneGadget::Gadget::Gadget>] Gadgets found.
|
6
8
|
def find
|
7
9
|
bin_sh_hex = str_offset('/bin/sh').to_s(16)
|
8
10
|
cands = candidates do |candidate|
|
@@ -4,12 +4,17 @@ module OneGadget
|
|
4
4
|
module Fetcher
|
5
5
|
# define common methods for gadget fetchers.
|
6
6
|
class Base
|
7
|
+
# The absolute path of glibc.
|
8
|
+
# @return [String] The filename.
|
7
9
|
attr_reader :file
|
10
|
+
# Instantiate a fetcher object.
|
8
11
|
# @param [String] file Absolute path of target libc.
|
9
12
|
def initialize(file)
|
10
13
|
@file = ::Shellwords.escape(file)
|
11
14
|
end
|
12
15
|
|
16
|
+
# Method need to be implemented in inheritors.
|
17
|
+
# @return [Array<OneGadget::Gadget::Gadget>] Gadgets found.
|
13
18
|
def find; raise NotImplementedError
|
14
19
|
end
|
15
20
|
|
data/lib/one_gadget/helper.rb
CHANGED
@@ -68,10 +68,10 @@ module OneGadget
|
|
68
68
|
# Fetch the latest release version's tag name.
|
69
69
|
# @return [String] The tag name, in form +vx.x.x+.
|
70
70
|
def latest_tag
|
71
|
-
|
71
|
+
releases_url = 'https://github.com/david942j/one_gadget/releases'
|
72
|
+
@latest_tag ||= 'v' + url_request(releases_url).scan(%r{/tree/v([\d.]+)"}).map do |tag|
|
72
73
|
Gem::Version.new(tag.first)
|
73
74
|
end.max.to_s
|
74
|
-
'v' + latest
|
75
75
|
end
|
76
76
|
|
77
77
|
# Get the url which can fetch +filename+ from remote repo.
|
@@ -97,14 +97,13 @@ module OneGadget
|
|
97
97
|
# Get the latest builds list from repo.
|
98
98
|
# @return [Array<String>] List of build ids.
|
99
99
|
def remote_builds
|
100
|
-
url_request(url_of_file('builds_list')).lines.map(&:strip)
|
100
|
+
@remote_builds ||= url_request(url_of_file('builds_list')).lines.map(&:strip)
|
101
101
|
end
|
102
102
|
|
103
103
|
# Get request.
|
104
104
|
# @param [String] url The url.
|
105
105
|
# @return [String] The request response body.
|
106
106
|
def url_request(url)
|
107
|
-
# TODO: add timeout to handle github crashed or in no network environment.
|
108
107
|
uri = URI.parse(url)
|
109
108
|
http = Net::HTTP.new(uri.host, uri.port)
|
110
109
|
http.use_ssl = true
|
@@ -113,7 +112,11 @@ module OneGadget
|
|
113
112
|
request = Net::HTTP::Get.new(uri.request_uri)
|
114
113
|
|
115
114
|
response = http.request(request)
|
115
|
+
raise ArgumentError, "Fail to get response of #{url}" unless response.code == '200'
|
116
116
|
response.body
|
117
|
+
rescue NoMethodError, SocketError, ArgumentError => e
|
118
|
+
p e
|
119
|
+
nil
|
117
120
|
end
|
118
121
|
|
119
122
|
# Show the message of ask user to update gem.
|
data/lib/one_gadget/logger.rb
CHANGED
data/lib/one_gadget/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: one_gadget
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- david942j
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -97,8 +97,10 @@ files:
|
|
97
97
|
- bin/one_gadget
|
98
98
|
- lib/one_gadget.rb
|
99
99
|
- lib/one_gadget/abi.rb
|
100
|
+
- lib/one_gadget/builds/libc-2.23-369de0e1d833caa693af17f17c83ba937f0a4dad.rb
|
100
101
|
- lib/one_gadget/builds/libc-2.23-60131540dadc6796cab33388349e6e4e68692053.rb
|
101
102
|
- lib/one_gadget/builds/libc-2.23-926eb99d49cab2e5622af38ab07395f5b32035e9.rb
|
103
|
+
- lib/one_gadget/builds/libc-2.23-edceed30099baad51871c5fc277daf9b74dc726a.rb
|
102
104
|
- lib/one_gadget/fetcher.rb
|
103
105
|
- lib/one_gadget/fetchers/amd64.rb
|
104
106
|
- lib/one_gadget/fetchers/base.rb
|
@@ -107,15 +109,6 @@ files:
|
|
107
109
|
- lib/one_gadget/helper.rb
|
108
110
|
- lib/one_gadget/logger.rb
|
109
111
|
- lib/one_gadget/version.rb
|
110
|
-
- spec/data/libc-2.19-cf699a15caae64f50311fc4655b86dc39a479789.so
|
111
|
-
- spec/data/libc-2.19-fd51b20e670e9a9f60dc3b06dc9761fb08c9358b.so
|
112
|
-
- spec/data/libc-2.23-60131540dadc6796cab33388349e6e4e68692053.so
|
113
|
-
- spec/data/libc-2.23-926eb99d49cab2e5622af38ab07395f5b32035e9.so
|
114
|
-
- spec/gadget_spec.rb
|
115
|
-
- spec/helper_spec.rb
|
116
|
-
- spec/one_gadget_amd64_spec.rb
|
117
|
-
- spec/one_gadget_i386_spec.rb
|
118
|
-
- spec/spec_helper.rb
|
119
112
|
homepage: https://github.com/david942j/one_gadget
|
120
113
|
licenses:
|
121
114
|
- MIT
|
@@ -140,13 +133,4 @@ rubygems_version: 2.5.2
|
|
140
133
|
signing_key:
|
141
134
|
specification_version: 4
|
142
135
|
summary: one_gadget
|
143
|
-
test_files:
|
144
|
-
- spec/one_gadget_i386_spec.rb
|
145
|
-
- spec/one_gadget_amd64_spec.rb
|
146
|
-
- spec/data/libc-2.23-926eb99d49cab2e5622af38ab07395f5b32035e9.so
|
147
|
-
- spec/data/libc-2.19-cf699a15caae64f50311fc4655b86dc39a479789.so
|
148
|
-
- spec/data/libc-2.23-60131540dadc6796cab33388349e6e4e68692053.so
|
149
|
-
- spec/data/libc-2.19-fd51b20e670e9a9f60dc3b06dc9761fb08c9358b.so
|
150
|
-
- spec/spec_helper.rb
|
151
|
-
- spec/helper_spec.rb
|
152
|
-
- spec/gadget_spec.rb
|
136
|
+
test_files: []
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/spec/gadget_spec.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'one_gadget/gadget'
|
2
|
-
require 'one_gadget/helper'
|
3
|
-
describe OneGadget::Gadget do
|
4
|
-
before(:all) do
|
5
|
-
@build_id = 'fake_id'
|
6
|
-
OneGadget::Helper.color_off! # disable colorize for easy testing.
|
7
|
-
OneGadget::Gadget.add(@build_id, 0x1234, constraints: ['[rsp+0x30] == NULL', 'rax == 0'])
|
8
|
-
end
|
9
|
-
|
10
|
-
after(:all) do
|
11
|
-
OneGadget::Gadget::ClassMethods::BUILDS.delete @build_id
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'inspect' do
|
15
|
-
expect(OneGadget::Gadget.builds(@build_id).map(&:inspect).join).to eq <<-EOS
|
16
|
-
offset: 0x1234
|
17
|
-
constraints:
|
18
|
-
[rsp+0x30] == NULL
|
19
|
-
rax == 0
|
20
|
-
EOS
|
21
|
-
end
|
22
|
-
end
|
data/spec/helper_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'one_gadget/helper'
|
2
|
-
|
3
|
-
describe OneGadget::Helper do
|
4
|
-
before(:all) do
|
5
|
-
OneGadget::Helper.color_on!
|
6
|
-
@libcpath = File.join(File.dirname(__FILE__), 'data', 'libc-2.23-60131540dadc6796cab33388349e6e4e68692053.so')
|
7
|
-
end
|
8
|
-
it 'abspath' do
|
9
|
-
expect(OneGadget::Helper.abspath('./spec/data/libc-2.23-60131540dadc6796cab33388349e6e4e68692053.so'))
|
10
|
-
.to eq @libcpath
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'build_id_of' do
|
14
|
-
expect(OneGadget::Helper.build_id_of(@libcpath)).to eq '60131540dadc6796cab33388349e6e4e68692053'
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'colorize' do
|
18
|
-
expect(OneGadget::Helper.colorize('123', sev: :integer)).to eq "\e[38;5;12m123\e[0m"
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'architecture' do
|
22
|
-
expect(OneGadget::Helper.architecture(@libcpath)).to be :amd64
|
23
|
-
expect(OneGadget::Helper.architecture(__FILE__)).to be :unknown
|
24
|
-
end
|
25
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'one_gadget'
|
2
|
-
|
3
|
-
describe 'one_gadget' do
|
4
|
-
before(:each) do
|
5
|
-
@build_id = '60131540dadc6796cab33388349e6e4e68692053'
|
6
|
-
@libcpath = File.join(File.dirname(__FILE__), 'data', 'libc-2.19-cf699a15caae64f50311fc4655b86dc39a479789.so')
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'from file' do
|
10
|
-
expect(OneGadget.gadgets(file: @libcpath)).to eq [0x4647c, 0xe5765, 0xe66bd]
|
11
|
-
end
|
12
|
-
|
13
|
-
describe 'from build id' do
|
14
|
-
it 'normal' do
|
15
|
-
# only check not empty because the gadgets might add frequently.
|
16
|
-
expect(OneGadget.gadgets(build_id: @build_id)).not_to be_empty
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'invalid' do
|
20
|
-
expect { OneGadget.gadgets(build_id: '^_^') }.to raise_error(ArgumentError, 'invalid BuildID format: "^_^"')
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'fetch from remote' do
|
24
|
-
entry = OneGadget::Gadget::ClassMethods::BUILDS.delete(@build_id)
|
25
|
-
OneGadget::Gadget::ClassMethods::BUILDS[:a] = 1
|
26
|
-
expect(OneGadget.gadgets(build_id: @build_id)).not_to be_empty
|
27
|
-
OneGadget::Gadget::ClassMethods::BUILDS.delete(:a)
|
28
|
-
OneGadget::Gadget::ClassMethods::BUILDS[@build_id] = entry unless entry.nil?
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'one_gadget'
|
2
|
-
|
3
|
-
describe 'one_gadget' do
|
4
|
-
before(:each) do
|
5
|
-
@build_id = '926eb99d49cab2e5622af38ab07395f5b32035e9'
|
6
|
-
@libcpath19 = File.join(File.dirname(__FILE__), 'data', 'libc-2.19-fd51b20e670e9a9f60dc3b06dc9761fb08c9358b.so')
|
7
|
-
@libcpath23 = File.join(File.dirname(__FILE__), 'data', 'libc-2.23-926eb99d49cab2e5622af38ab07395f5b32035e9.so')
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'from file libc-2.19' do
|
11
|
-
expect(OneGadget.gadgets(file: @libcpath19, force_file: true)).to eq [0x3fd27, 0x64c60, 0x1244a6]
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'from file libc-2.23' do
|
15
|
-
expect(OneGadget.gadgets(file: @libcpath23, force_file: true)).to eq [0x3ac69, 0x5fbbe, 0x12036c]
|
16
|
-
end
|
17
|
-
|
18
|
-
describe 'from build id' do
|
19
|
-
it 'normal' do
|
20
|
-
# only check not empty because the gadgets might add frequently.
|
21
|
-
expect(OneGadget.gadgets(build_id: @build_id)).not_to be_empty
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/spec/spec_helper.rb
DELETED