heapinfo 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/heapinfo.rb +8 -8
- data/lib/heapinfo/arena.rb +47 -45
- data/lib/heapinfo/cache.rb +12 -13
- data/lib/heapinfo/chunk.rb +23 -23
- data/lib/heapinfo/chunks.rb +16 -5
- data/lib/heapinfo/dumper.rb +55 -44
- data/lib/heapinfo/ext/string.rb +2 -2
- data/lib/heapinfo/glibc/error.rb +2 -1
- data/lib/heapinfo/glibc/free.rb +29 -16
- data/lib/heapinfo/glibc/glibc.rb +5 -1
- data/lib/heapinfo/glibc/helper.rb +9 -6
- data/lib/heapinfo/helper.rb +22 -26
- data/lib/heapinfo/libc.rb +18 -17
- data/lib/heapinfo/nil.rb +14 -8
- data/lib/heapinfo/process.rb +34 -25
- data/lib/heapinfo/process_info.rb +15 -14
- data/lib/heapinfo/segment.rb +10 -9
- data/lib/heapinfo/tools/get_arena.c +0 -1
- data/lib/heapinfo/version.rb +1 -1
- metadata +75 -31
- data/spec/cache_spec.rb +0 -46
- data/spec/chunk_spec.rb +0 -40
- data/spec/chunks_spec.rb +0 -25
- data/spec/dumper_spec.rb +0 -105
- data/spec/files/32bit_maps +0 -23
- data/spec/files/64bit_maps +0 -29
- data/spec/files/victim.cpp +0 -33
- data/spec/helper_spec.rb +0 -73
- data/spec/libc_spec.rb +0 -75
- data/spec/nil_spec.rb +0 -15
- data/spec/process_spec.rb +0 -201
- data/spec/spec_helper.rb +0 -98
- data/spec/string_spec.rb +0 -18
data/lib/heapinfo/libc.rb
CHANGED
@@ -2,15 +2,15 @@ module HeapInfo
|
|
2
2
|
# Record libc's base, name, and offsets.
|
3
3
|
class Libc < Segment
|
4
4
|
include HeapInfo::Glibc
|
5
|
-
# Instantiate a
|
5
|
+
# Instantiate a {HeapInfo::Libc} object.
|
6
6
|
#
|
7
|
-
# @param [Mixed] args See
|
7
|
+
# @param [Mixed] args See {HeapInfo::Segment#initialize} for more information.
|
8
8
|
def initialize(*args)
|
9
9
|
super
|
10
10
|
@offset = {}
|
11
11
|
end
|
12
12
|
|
13
|
-
# Get the offset of
|
13
|
+
# Get the offset of +main_arena+ in libc.
|
14
14
|
# @return [Integer]
|
15
15
|
def main_arena_offset
|
16
16
|
return @offset[:main_arena] if @offset[:main_arena]
|
@@ -18,17 +18,17 @@ module HeapInfo
|
|
18
18
|
@offset[:main_arena]
|
19
19
|
end
|
20
20
|
|
21
|
-
# Get the
|
21
|
+
# Get the +main_arena+ of libc.
|
22
22
|
# @return [HeapInfo::Arena]
|
23
23
|
def main_arena
|
24
24
|
return @main_arena.reload! if @main_arena
|
25
25
|
off = main_arena_offset
|
26
26
|
return if off.nil?
|
27
|
-
@main_arena = Arena.new(off +
|
27
|
+
@main_arena = Arena.new(off + base, size_t, dumper)
|
28
28
|
end
|
29
29
|
|
30
|
-
# @param [Array] maps See
|
31
|
-
# @param [String] name See
|
30
|
+
# @param [Array] maps See {HeapInfo::Segment#find} for more information.
|
31
|
+
# @param [String] name See {HeapInfo::Segment#find} for more information.
|
32
32
|
# @param [Integer] bits Either 64 or 32.
|
33
33
|
# @param [String] ld_name The loader's realpath, will be used for running subprocesses.
|
34
34
|
# @param [Proc] dumper The memory dumper for fetch more information.
|
@@ -41,7 +41,8 @@ module HeapInfo
|
|
41
41
|
obj
|
42
42
|
end
|
43
43
|
|
44
|
-
|
44
|
+
private
|
45
|
+
|
45
46
|
attr_accessor :ld_name
|
46
47
|
# only for searching offset of main_arena now
|
47
48
|
def exhaust_search(symbol)
|
@@ -51,23 +52,23 @@ module HeapInfo
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def read_main_arena_offset
|
54
|
-
key = HeapInfo::Cache
|
55
|
-
@offset = HeapInfo::Cache
|
56
|
-
return @offset[:main_arena] if @offset.key?
|
55
|
+
key = HeapInfo::Cache.key_libc_offset(name)
|
56
|
+
@offset = HeapInfo::Cache.read(key) || {}
|
57
|
+
return @offset[:main_arena] if @offset.key?(:main_arena)
|
57
58
|
@offset[:main_arena] = resolve_main_arena_offset
|
58
|
-
HeapInfo::Cache
|
59
|
+
HeapInfo::Cache.write(key, @offset)
|
59
60
|
end
|
60
61
|
|
61
62
|
def resolve_main_arena_offset
|
62
|
-
tmp_elf = HeapInfo::TMP_DIR +
|
63
|
-
libc_file = HeapInfo::TMP_DIR +
|
64
|
-
ld_file = HeapInfo::TMP_DIR +
|
63
|
+
tmp_elf = HeapInfo::TMP_DIR + '/get_arena'
|
64
|
+
libc_file = HeapInfo::TMP_DIR + '/libc.so.6'
|
65
|
+
ld_file = HeapInfo::TMP_DIR + '/ld.so'
|
65
66
|
flags = "-w #{size_t == 4 ? '-m32' : ''}"
|
66
|
-
|
67
|
+
`cp #{name} #{libc_file} && \
|
67
68
|
cp #{ld_name} #{ld_file} && \
|
68
69
|
gcc #{flags} #{File.expand_path('../tools/get_arena.c', __FILE__)} -o #{tmp_elf} 2>&1 > /dev/null && \
|
69
70
|
#{ld_file} --library-path #{HeapInfo::TMP_DIR} #{tmp_elf} && \
|
70
|
-
rm #{tmp_elf} #{libc_file} #{ld_file}
|
71
|
+
rm #{tmp_elf} #{libc_file} #{ld_file}`.to_i(16)
|
71
72
|
end
|
72
73
|
end
|
73
74
|
end
|
data/lib/heapinfo/nil.rb
CHANGED
@@ -1,24 +1,30 @@
|
|
1
1
|
module HeapInfo
|
2
|
-
# Self
|
2
|
+
# Self define a +nil+ like class.
|
3
3
|
#
|
4
|
-
#
|
4
|
+
# Can be the return value of {HeapInfo::Process#dump} and {HeapInfo::Process#dump_chunks},
|
5
|
+
# to prevent use the return value for calculating accidentally while exploiting remote.
|
5
6
|
class Nil
|
6
7
|
%i(nil? inspect to_s).each do |method_sym|
|
7
|
-
define_method(method_sym){|*args, &block| nil.send(method_sym, *args, &block)}
|
8
|
+
define_method(method_sym) { |*args, &block| nil.send(method_sym, *args, &block) }
|
8
9
|
end
|
9
10
|
|
10
11
|
# Hook all missing methods
|
11
|
-
# @return [HeapInfo::Nil] return
|
12
|
+
# @return [HeapInfo::Nil] return +self+ so that it can be a +nil+ chain.
|
12
13
|
# @example
|
13
14
|
# # h.dump would return Nil when process not found
|
14
|
-
# p h.dump(:heap)[8,8].unpack(
|
15
|
+
# p h.dump(:heap)[8, 8].unpack('Q*')
|
15
16
|
# # => nil
|
16
17
|
def method_missing(method_sym, *args, &block)
|
17
|
-
return nil.send(method_sym, *args, &block) if nil.respond_to?
|
18
|
-
self
|
18
|
+
return nil.send(method_sym, *args, &block) if nil.respond_to?(method_sym)
|
19
|
+
self || super
|
19
20
|
end
|
20
21
|
|
21
|
-
#
|
22
|
+
# Yap
|
23
|
+
def respond_to_missing?(*)
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
# To prevent error raised when using +puts Nil.new+.
|
22
28
|
# @return [Array] Empty array
|
23
29
|
def to_ary
|
24
30
|
[]
|
data/lib/heapinfo/process.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
#encoding: ascii-8bit
|
1
|
+
# encoding: ascii-8bit
|
2
2
|
module HeapInfo
|
3
3
|
# Main class of heapinfo.
|
4
4
|
class Process
|
5
5
|
# The default options of libaries,
|
6
6
|
# use for matching glibc and ld segments in <tt>/proc/[pid]/maps</tt>
|
7
7
|
DEFAULT_LIB = {
|
8
|
-
libc: /bc
|
9
|
-
ld:
|
10
|
-
}
|
8
|
+
libc: /bc[^a-z]*\.so/,
|
9
|
+
ld: %r{/ld-.+\.so}
|
10
|
+
}.freeze
|
11
11
|
# @return [Fixnum, NilClass] return the pid of process, <tt>nil</tt> if no such process found
|
12
12
|
attr_reader :pid
|
13
13
|
|
@@ -34,7 +34,7 @@ module HeapInfo
|
|
34
34
|
|
35
35
|
# Use this method to wrapper all HeapInfo methods.
|
36
36
|
#
|
37
|
-
# Since <tt>::HeapInfo</tt> is a tool(debugger) for local usage,
|
37
|
+
# Since <tt>::HeapInfo</tt> is a tool(debugger) for local usage,
|
38
38
|
# while exploiting remote service, all methods will not work properly.
|
39
39
|
# So I suggest to wrapper all methods inside <tt>#debug</tt>,
|
40
40
|
# which will ignore the block while the victim process is not found.
|
@@ -54,10 +54,13 @@ module HeapInfo
|
|
54
54
|
|
55
55
|
# Dump the content of specific memory address.
|
56
56
|
#
|
57
|
-
# Note: This method require you have permission of attaching another process.
|
57
|
+
# Note: This method require you have permission of attaching another process.
|
58
|
+
# If not, a warning message will present.
|
58
59
|
#
|
59
60
|
# @param [Mixed] args Will be parsed into <tt>[base, offset, length]</tt>, see Examples for more information.
|
60
|
-
# @return [String, HeapInfo::Nil]
|
61
|
+
# @return [String, HeapInfo::Nil]
|
62
|
+
# The content needed. When the request address is not readable or the process not exists,
|
63
|
+
# <tt>HeapInfo::Nil.new</tt> is returned.
|
61
64
|
#
|
62
65
|
# @example
|
63
66
|
# h = heapinfo('victim')
|
@@ -102,22 +105,27 @@ module HeapInfo
|
|
102
105
|
# # 0x1f0d000: 0x0000000000000000 0x0000000000002011
|
103
106
|
# # 0x1f0d010: 0x00007f892a9f87b8 0x00007f892a9f87b8
|
104
107
|
# # 0x1f0d020: 0x0000000000000000 0x0000000000000000
|
105
|
-
# # 0x1f0d030: 0x0000000000000000 0x0000000000000000
|
108
|
+
# # 0x1f0d030: 0x0000000000000000 0x0000000000000000
|
106
109
|
# @example
|
107
110
|
# h.x 3, 0x400000
|
108
111
|
# # 0x400000: 0x00010102464c457f 0x0000000000000000
|
109
112
|
# # 0x400010: 0x00000001003e0002
|
110
113
|
def x(count, *commands, io: $stdout)
|
111
|
-
return unless load?
|
114
|
+
return unless load? && io.respond_to?(:puts)
|
112
115
|
dumper.x(count, *commands, io: io)
|
113
116
|
end
|
114
117
|
|
115
118
|
# Gdb-like command.
|
116
119
|
#
|
117
120
|
# Search a specific value/string/regexp in memory.
|
118
|
-
# @param [Integer, String, Regexp] pattern
|
119
|
-
#
|
120
|
-
# @param [Integer
|
121
|
+
# @param [Integer, String, Regexp] pattern
|
122
|
+
# The desired search pattern, can be value(<tt>Integer</tt>), string, or regular expression.
|
123
|
+
# @param [Integer, String, Symbol] from
|
124
|
+
# Start address for searching, can be segment(<tt>Symbol</tt>) or segments with offset.
|
125
|
+
# See examples for more information.
|
126
|
+
# @param [Integer] length
|
127
|
+
# The search length limit, default is unlimited,
|
128
|
+
# which will search until pattern found or reach unreadable memory.
|
121
129
|
# @return [Integer, NilClass] The first matched address, <tt>nil</tt> is returned when no such pattern found.
|
122
130
|
# @example
|
123
131
|
# h.find(0xdeadbeef, 'heap+0x10', 0x1000)
|
@@ -134,8 +142,8 @@ module HeapInfo
|
|
134
142
|
dumper.find(pattern, from, length)
|
135
143
|
end
|
136
144
|
|
137
|
-
#
|
138
|
-
alias
|
145
|
+
# +search+ is more intutive to me
|
146
|
+
alias search find
|
139
147
|
|
140
148
|
# Pretty dump of bins layouts.
|
141
149
|
#
|
@@ -146,8 +154,8 @@ module HeapInfo
|
|
146
154
|
# @example
|
147
155
|
# h.layouts :fastbin, :unsorted_bin, :smallbin
|
148
156
|
def layouts(*args, io: $stdout)
|
149
|
-
return unless load?
|
150
|
-
io.puts
|
157
|
+
return unless load? && io.respond_to?(:puts)
|
158
|
+
io.puts libc.main_arena.layouts(*args)
|
151
159
|
end
|
152
160
|
|
153
161
|
# Show simple information of target process.
|
@@ -157,16 +165,17 @@ module HeapInfo
|
|
157
165
|
# @example
|
158
166
|
# puts h
|
159
167
|
def to_s
|
160
|
-
return
|
168
|
+
return 'Process not found' unless load?
|
161
169
|
"Program: #{Helper.color program.name} PID: #{Helper.color pid}\n" +
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
170
|
+
program.to_s +
|
171
|
+
heap.to_s +
|
172
|
+
stack.to_s +
|
173
|
+
libc.to_s +
|
174
|
+
ld.to_s
|
167
175
|
end
|
168
176
|
|
169
|
-
|
177
|
+
private
|
178
|
+
|
170
179
|
attr_accessor :dumper
|
171
180
|
def load?
|
172
181
|
@pid != nil
|
@@ -192,7 +201,7 @@ module HeapInfo
|
|
192
201
|
|
193
202
|
def clear_process
|
194
203
|
ProcessInfo::EXPORT.each do |m|
|
195
|
-
self.class.send(:define_method, m) {Nil.new}
|
204
|
+
self.class.send(:define_method, m) { Nil.new }
|
196
205
|
end
|
197
206
|
false
|
198
207
|
end
|
@@ -200,7 +209,7 @@ module HeapInfo
|
|
200
209
|
def load_info! # :nodoc:
|
201
210
|
@info = ProcessInfo.new(self)
|
202
211
|
ProcessInfo::EXPORT.each do |m|
|
203
|
-
self.class.send(:define_method, m) {@info.send(m)}
|
212
|
+
self.class.send(:define_method, m) { @info.send(m) }
|
204
213
|
end
|
205
214
|
@dumper = Dumper.new(@info, mem_filename)
|
206
215
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
#encoding: ascii-8bit
|
1
|
+
# encoding: ascii-8bit
|
2
2
|
module HeapInfo
|
3
|
-
# for
|
4
|
-
#
|
3
|
+
# for {Process} to record current info(s)
|
4
|
+
# {Process} has a +process_info+ object iff the process found (pid not +nil+).
|
5
5
|
# Mainly records segments' base.
|
6
6
|
class ProcessInfo
|
7
|
-
# Methods to be transparent to
|
8
|
-
# e.g.
|
9
|
-
EXPORT = %i(libc ld heap elf program stack bits)
|
10
|
-
|
7
|
+
# Methods to be transparent to +process+.
|
8
|
+
# e.g. +process.libc+ alias to +process.info.libc+.
|
9
|
+
EXPORT = %i(libc ld heap elf program stack bits).freeze
|
10
|
+
|
11
11
|
# @return [Integer] 32 or 64.
|
12
12
|
attr_reader :bits
|
13
13
|
# @return [HeapInfo::Segment]
|
@@ -18,11 +18,11 @@ module HeapInfo
|
|
18
18
|
attr_reader :libc
|
19
19
|
# @return [HeapInfo::Segment]
|
20
20
|
attr_reader :ld
|
21
|
-
alias
|
21
|
+
alias elf program
|
22
22
|
|
23
|
-
# Instantiate a
|
23
|
+
# Instantiate a {ProcessInfo} object
|
24
24
|
#
|
25
|
-
# @param [HeapInfo::Process] process Load information from maps/memory for
|
25
|
+
# @param [HeapInfo::Process] process Load information from maps/memory for +process+.
|
26
26
|
def initialize(process)
|
27
27
|
@pid = process.pid
|
28
28
|
options = process.instance_variable_get(:@options)
|
@@ -33,18 +33,19 @@ module HeapInfo
|
|
33
33
|
# well.. stack is a strange case because it will grow in runtime..
|
34
34
|
# should i detect stack base growing..?
|
35
35
|
@ld = Segment.find(maps, match_maps(maps, options[:ld]))
|
36
|
-
@libc = Libc.find(maps, match_maps(maps, options[:libc]), @bits, @ld.name, ->(*args){ process.dump(*args) })
|
36
|
+
@libc = Libc.find(maps, match_maps(maps, options[:libc]), @bits, @ld.name, ->(*args) { process.dump(*args) })
|
37
37
|
end
|
38
38
|
|
39
39
|
# Heap will not be mmapped if the process not use heap yet, so create a lazy loading method.
|
40
40
|
# Will re-read maps when heap segment not found yet.
|
41
41
|
#
|
42
|
-
# @return [HeapInfo::Segment] The
|
42
|
+
# @return [HeapInfo::Segment] The {Segment} of heap
|
43
43
|
def heap # special handle because heap might not be initialized in the beginning
|
44
44
|
@heap ||= Segment.find(maps!, '[heap]')
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
private
|
48
|
+
|
48
49
|
attr_reader :maps
|
49
50
|
|
50
51
|
# force reload maps
|
@@ -57,7 +58,7 @@ module HeapInfo
|
|
57
58
|
end
|
58
59
|
|
59
60
|
def match_maps(maps, pattern)
|
60
|
-
maps.map{|s| s[3]}.find{|seg| pattern.is_a?(Regexp) ? seg =~ pattern : seg.include?(pattern)}
|
61
|
+
maps.map { |s| s[3] }.find { |seg| pattern.is_a?(Regexp) ? seg =~ pattern : seg.include?(pattern) }
|
61
62
|
end
|
62
63
|
end
|
63
64
|
end
|
data/lib/heapinfo/segment.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module HeapInfo
|
2
2
|
# Record the base address and name in maps
|
3
3
|
class Segment
|
4
|
-
|
5
4
|
# Base address of segment
|
6
5
|
attr_reader :base
|
7
6
|
# Name of segment
|
@@ -17,20 +16,22 @@ module HeapInfo
|
|
17
16
|
# Hook <tt>#to_s</tt> for pretty printing
|
18
17
|
# @return [String] Information of name and base address wrapper with color codes.
|
19
18
|
def to_s
|
20
|
-
"%-28s\tbase @ #{Helper.color(
|
19
|
+
format("%-28s\tbase @ #{Helper.color(format('%#x', base))}\n", Helper.color(name.split('/')[-1]))
|
21
20
|
end
|
22
21
|
|
23
|
-
# Helper for create
|
22
|
+
# Helper for create a {HeapInfo::Segment}.
|
24
23
|
#
|
25
|
-
# Search the specific <tt>pattern</tt> in <tt>maps</tt> and return a
|
24
|
+
# Search the specific <tt>pattern</tt> in <tt>maps</tt> and return a {HeapInfo::Segment} object.
|
26
25
|
#
|
27
|
-
# @param [Array] maps <tt>maps</tt> is in the form of the return value of <tt>HeapInfo::Helper.parse_maps</tt
|
28
|
-
# @param [Regexp, String] pattern
|
29
|
-
#
|
26
|
+
# @param [Array] maps <tt>maps</tt> is in the form of the return value of <tt>HeapInfo::Helper.parse_maps</tt>.
|
27
|
+
# @param [Regexp, String] pattern
|
28
|
+
# The segment name want to match in maps. If +String+ is given, the pattern is matched as a substring.
|
29
|
+
# @return [HeapInfo::Segment, NilClass]
|
30
|
+
# The request {HeapInfo::Segment} object. If the pattern is not matched, <tt>nil</tt> will be returned.
|
30
31
|
def self.find(maps, pattern)
|
31
32
|
return Nil.new if pattern.nil?
|
32
|
-
needs = maps.select{|m| pattern.is_a?(Regexp) ? m[3] =~ pattern : m[3].include?(pattern)}
|
33
|
-
|
33
|
+
needs = maps.select { |m| pattern.is_a?(Regexp) ? m[3] =~ pattern : m[3].include?(pattern) }
|
34
|
+
new(needs.map(&:first).min, needs[0][3]) unless needs.empty?
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
@@ -21,7 +21,6 @@ int main() {
|
|
21
21
|
void *z = malloc(SZ); // prevent p merge with top chunk
|
22
22
|
*p = z; // prevent compiler optimize
|
23
23
|
free(p); // now *p must be the pointer of the (chunk_ptr) unsorted bin
|
24
|
-
//TODO: check if this offset change in different version glibc
|
25
24
|
z = (void*)((*p) - (4 + 4 + SZ * 10 )); // mutex+flags+fastbin[]
|
26
25
|
void* a = search_head((size_t)__builtin_return_address(0));
|
27
26
|
printf("%p\n", z-a);
|
data/lib/heapinfo/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heapinfo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- david942j
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
12
|
-
dependencies:
|
11
|
+
date: 2017-02-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.5'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubocop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.46'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.46'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '12.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '12.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.13.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.13.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: codeclimate-test-reporter
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.6'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.6'
|
13
83
|
description: create an interactive memory info interface while pwn / exploiting
|
14
84
|
email:
|
15
85
|
- david942j@gmail.com
|
@@ -37,19 +107,6 @@ files:
|
|
37
107
|
- lib/heapinfo/segment.rb
|
38
108
|
- lib/heapinfo/tools/get_arena.c
|
39
109
|
- lib/heapinfo/version.rb
|
40
|
-
- spec/cache_spec.rb
|
41
|
-
- spec/chunk_spec.rb
|
42
|
-
- spec/chunks_spec.rb
|
43
|
-
- spec/dumper_spec.rb
|
44
|
-
- spec/files/32bit_maps
|
45
|
-
- spec/files/64bit_maps
|
46
|
-
- spec/files/victim.cpp
|
47
|
-
- spec/helper_spec.rb
|
48
|
-
- spec/libc_spec.rb
|
49
|
-
- spec/nil_spec.rb
|
50
|
-
- spec/process_spec.rb
|
51
|
-
- spec/spec_helper.rb
|
52
|
-
- spec/string_spec.rb
|
53
110
|
homepage: https://github.com/david942j/heapinfo
|
54
111
|
licenses:
|
55
112
|
- MIT
|
@@ -70,21 +127,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
127
|
version: '0'
|
71
128
|
requirements: []
|
72
129
|
rubyforge_project:
|
73
|
-
rubygems_version: 2.
|
130
|
+
rubygems_version: 2.6.10
|
74
131
|
signing_key:
|
75
132
|
specification_version: 4
|
76
133
|
summary: HeapInfo - interactive heap exploitation helper
|
77
|
-
test_files:
|
78
|
-
- spec/files/32bit_maps
|
79
|
-
- spec/files/victim.cpp
|
80
|
-
- spec/files/64bit_maps
|
81
|
-
- spec/cache_spec.rb
|
82
|
-
- spec/dumper_spec.rb
|
83
|
-
- spec/process_spec.rb
|
84
|
-
- spec/chunk_spec.rb
|
85
|
-
- spec/chunks_spec.rb
|
86
|
-
- spec/string_spec.rb
|
87
|
-
- spec/spec_helper.rb
|
88
|
-
- spec/helper_spec.rb
|
89
|
-
- spec/nil_spec.rb
|
90
|
-
- spec/libc_spec.rb
|
134
|
+
test_files: []
|