ronin-asm 0.1.0 → 0.2.0
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.
- data/.ruby-version +1 -0
- data/.travis.yml +12 -0
- data/ChangeLog.md +32 -6
- data/Gemfile +2 -2
- data/README.md +30 -22
- data/Rakefile +5 -4
- data/gemspec.yml +1 -0
- data/lib/ronin/asm.rb +1 -1
- data/lib/ronin/asm/archs.rb +1 -1
- data/lib/ronin/asm/archs/amd64.rb +53 -53
- data/lib/ronin/asm/archs/x86.rb +48 -48
- data/lib/ronin/asm/asm.rb +1 -1
- data/lib/ronin/asm/config.rb +1 -1
- data/lib/ronin/asm/immediate_operand.rb +18 -11
- data/lib/ronin/asm/instruction.rb +1 -1
- data/lib/ronin/asm/memory_operand.rb +22 -16
- data/lib/ronin/asm/os.rb +1 -1
- data/lib/ronin/asm/os/freebsd.rb +1 -1
- data/lib/ronin/asm/os/linux.rb +1 -1
- data/lib/ronin/asm/os/os.rb +1 -1
- data/lib/ronin/asm/program.rb +60 -33
- data/lib/ronin/asm/register.rb +1 -1
- data/lib/ronin/asm/shellcode.rb +2 -2
- data/lib/ronin/asm/syntax.rb +1 -1
- data/lib/ronin/asm/syntax/att.rb +39 -12
- data/lib/ronin/asm/syntax/common.rb +40 -2
- data/lib/ronin/asm/syntax/intel.rb +27 -28
- data/lib/ronin/asm/version.rb +2 -2
- data/spec/{asm_spec.rb → asm/asm_spec.rb} +0 -0
- data/spec/{immediate_operand_spec.rb → asm/immediate_operand_spec.rb} +2 -0
- data/spec/{instruction_spec.rb → asm/instruction_spec.rb} +0 -0
- data/spec/{memory_operand_spec.rb → asm/memory_operand_spec.rb} +0 -0
- data/spec/{program_spec.rb → asm/program_spec.rb} +106 -50
- data/spec/{register_spec.rb → asm/register_spec.rb} +0 -0
- data/spec/{shellcode_spec.rb → asm/shellcode_spec.rb} +15 -7
- data/spec/{syntax → asm/syntax}/att_spec.rb +15 -5
- data/spec/{syntax → asm/syntax}/common_spec.rb +0 -0
- data/spec/{syntax → asm/syntax}/intel_spec.rb +24 -6
- metadata +16 -16
- data/.gemtest +0 -0
- data/spec/helpers/database.rb +0 -7
data/lib/ronin/asm/asm.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
data/lib/ronin/asm/config.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
@@ -38,17 +38,24 @@ module Ronin
|
|
38
38
|
# The size in bytes of the value.
|
39
39
|
#
|
40
40
|
def initialize(value,width=nil)
|
41
|
-
value
|
42
|
-
|
43
|
-
when (0x100000000..0xffffffffffffffff),
|
44
|
-
(-0x7fffffffffffffff..-0x800000000) then 8
|
45
|
-
when (0x10000..0xffffffff),
|
46
|
-
(-0x7fffffff..-0x80000) then 4
|
47
|
-
when (0x100..0xffff), (-0x7fff..-0x80) then 2
|
48
|
-
when (0..0xff), (-0x7f..0) then 1
|
49
|
-
end
|
41
|
+
super(value.to_i,width)
|
42
|
+
end
|
50
43
|
|
51
|
-
|
44
|
+
#
|
45
|
+
# The width of the immediate operand.
|
46
|
+
#
|
47
|
+
# @return [8, 4, 2, 1]
|
48
|
+
# The width.
|
49
|
+
#
|
50
|
+
def width
|
51
|
+
super || case value
|
52
|
+
when (0x100000000..0xffffffffffffffff),
|
53
|
+
(-0x7fffffffffffffff..-0x800000000) then 8
|
54
|
+
when (0x10000..0xffffffff),
|
55
|
+
(-0x7fffffff..-0x80000) then 4
|
56
|
+
when (0x100..0xffff), (-0x7fff..-0x80) then 2
|
57
|
+
when (0..0xff), (-0x7f..0) then 1
|
58
|
+
end
|
52
59
|
end
|
53
60
|
|
54
61
|
#
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
@@ -28,7 +28,7 @@ module Ronin
|
|
28
28
|
#
|
29
29
|
# @see http://asm.sourceforge.net/articles/linasm.html#Memory
|
30
30
|
#
|
31
|
-
class MemoryOperand < Struct.new(:base, :offset, :index, :scale)
|
31
|
+
class MemoryOperand < Struct.new(:base, :offset, :index, :scale, :width)
|
32
32
|
|
33
33
|
#
|
34
34
|
# Creates a new Memory Operand.
|
@@ -48,7 +48,7 @@ module Ronin
|
|
48
48
|
# @raise [TypeError]
|
49
49
|
# `base` or `index` was not a {Register} or `nil`.
|
50
50
|
#
|
51
|
-
def initialize(base=nil,offset=0,index=nil,scale=1)
|
51
|
+
def initialize(base=nil,offset=0,index=nil,scale=1,width=nil)
|
52
52
|
unless (base.nil? || base.kind_of?(Register))
|
53
53
|
raise(TypeError,"base must be a Register or nil")
|
54
54
|
end
|
@@ -65,7 +65,11 @@ module Ronin
|
|
65
65
|
raise(TypeError,"scale must be an Integer")
|
66
66
|
end
|
67
67
|
|
68
|
-
|
68
|
+
if base
|
69
|
+
width ||= base.width
|
70
|
+
end
|
71
|
+
|
72
|
+
super(base,offset,index,scale,width)
|
69
73
|
end
|
70
74
|
|
71
75
|
#
|
@@ -78,7 +82,13 @@ module Ronin
|
|
78
82
|
# The new Memory Operand.
|
79
83
|
#
|
80
84
|
def +(offset)
|
81
|
-
MemoryOperand.new(
|
85
|
+
MemoryOperand.new(
|
86
|
+
self.base,
|
87
|
+
self.offset + offset,
|
88
|
+
self.index,
|
89
|
+
self.scale,
|
90
|
+
self.width
|
91
|
+
)
|
82
92
|
end
|
83
93
|
|
84
94
|
#
|
@@ -91,17 +101,13 @@ module Ronin
|
|
91
101
|
# The new Memory Operand.
|
92
102
|
#
|
93
103
|
def -(offset)
|
94
|
-
MemoryOperand.new(
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
# The width taken from the base {Register}.
|
102
|
-
#
|
103
|
-
def width
|
104
|
-
base.width
|
104
|
+
MemoryOperand.new(
|
105
|
+
self.base,
|
106
|
+
self.offset - offset,
|
107
|
+
self.index,
|
108
|
+
self.scale,
|
109
|
+
self.width
|
110
|
+
)
|
105
111
|
end
|
106
112
|
|
107
113
|
end
|
data/lib/ronin/asm/os.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
data/lib/ronin/asm/os/freebsd.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
data/lib/ronin/asm/os/linux.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
data/lib/ronin/asm/os/os.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
data/lib/ronin/asm/program.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
@@ -38,14 +38,14 @@ module Ronin
|
|
38
38
|
|
39
39
|
# Supported Assembly Syntaxs
|
40
40
|
SYNTAX = {
|
41
|
-
:
|
42
|
-
:
|
41
|
+
att: Syntax::ATT,
|
42
|
+
intel: Syntax::Intel
|
43
43
|
}
|
44
44
|
|
45
45
|
# The Assembly Parsers
|
46
46
|
PARSERS = {
|
47
|
-
:
|
48
|
-
:
|
47
|
+
att: :gas,
|
48
|
+
intel: :nasm
|
49
49
|
}
|
50
50
|
|
51
51
|
# The targeted architecture
|
@@ -94,7 +94,7 @@ module Ronin
|
|
94
94
|
# The given block will be evaluated within the program.
|
95
95
|
#
|
96
96
|
# @example
|
97
|
-
# Program.new(:
|
97
|
+
# Program.new(arch: :amd64) do
|
98
98
|
# push rax
|
99
99
|
# push rbx
|
100
100
|
#
|
@@ -193,53 +193,73 @@ module Ronin
|
|
193
193
|
#
|
194
194
|
# Creates an operand of size 1 (byte).
|
195
195
|
#
|
196
|
-
# @param [Integer]
|
196
|
+
# @param [MemoryOperand, Integer] op
|
197
197
|
# The value of the operand.
|
198
198
|
#
|
199
|
-
# @return [ImmediateOperand]
|
199
|
+
# @return [MemoryOperand, ImmediateOperand]
|
200
200
|
# The new operand value.
|
201
201
|
#
|
202
|
-
def byte(
|
203
|
-
|
202
|
+
def byte(op)
|
203
|
+
case op
|
204
|
+
when MemoryOperand
|
205
|
+
MemoryOperand.new(op.base,op.offset,op.index,op.scale,1)
|
206
|
+
else
|
207
|
+
ImmediateOperand.new(op,1)
|
208
|
+
end
|
204
209
|
end
|
205
210
|
|
206
211
|
#
|
207
212
|
# Creates a operand of size 2 (bytes).
|
208
213
|
#
|
209
|
-
# @param [Integer]
|
214
|
+
# @param [MemoryOperand, Integer] op
|
210
215
|
# The value of the operand.
|
211
216
|
#
|
212
|
-
# @return [ImmediateOperand]
|
217
|
+
# @return [MemoryOperand, ImmediateOperand]
|
213
218
|
# The new operand value.
|
214
219
|
#
|
215
|
-
def word(
|
216
|
-
|
220
|
+
def word(op)
|
221
|
+
case op
|
222
|
+
when MemoryOperand
|
223
|
+
MemoryOperand.new(op.base,op.offset,op.index,op.scale,2)
|
224
|
+
else
|
225
|
+
ImmediateOperand.new(op,2)
|
226
|
+
end
|
217
227
|
end
|
218
228
|
|
219
229
|
#
|
220
230
|
# Creates a operand of size 4 (bytes).
|
221
231
|
#
|
222
|
-
# @param [Integer]
|
232
|
+
# @param [MemoryOperand, Integer] op
|
223
233
|
# The value of the operand.
|
224
234
|
#
|
225
235
|
# @return [ImmediateOperand]
|
226
236
|
# The new operand value.
|
227
237
|
#
|
228
|
-
def dword(
|
229
|
-
|
238
|
+
def dword(op)
|
239
|
+
case op
|
240
|
+
when MemoryOperand
|
241
|
+
MemoryOperand.new(op.base,op.offset,op.index,op.scale,4)
|
242
|
+
else
|
243
|
+
ImmediateOperand.new(op,4)
|
244
|
+
end
|
230
245
|
end
|
231
246
|
|
232
247
|
#
|
233
248
|
# Creates a operand of size 8 (bytes).
|
234
249
|
#
|
235
|
-
# @param [Integer]
|
250
|
+
# @param [MemoryOperand, Integer] op
|
236
251
|
# The value of the operand.
|
237
252
|
#
|
238
|
-
# @return [ImmediateOperand]
|
253
|
+
# @return [MemoryOperand, ImmediateOperand]
|
239
254
|
# The new operand.
|
240
255
|
#
|
241
|
-
def qword(
|
242
|
-
|
256
|
+
def qword(op)
|
257
|
+
case op
|
258
|
+
when MemoryOperand
|
259
|
+
MemoryOperand.new(op.base,op.offset,op.index,op.scale,8)
|
260
|
+
else
|
261
|
+
ImmediateOperand.new(op,8)
|
262
|
+
end
|
243
263
|
end
|
244
264
|
|
245
265
|
#
|
@@ -318,15 +338,15 @@ module Ronin
|
|
318
338
|
#
|
319
339
|
# Generic method for setting a register.
|
320
340
|
#
|
321
|
-
# @param [Register, Immediate, Integer] value
|
322
|
-
# The new value for the register.
|
323
|
-
#
|
324
341
|
# @param [Symbol] name
|
325
342
|
# The name of the reigster.
|
326
343
|
#
|
344
|
+
# @param [Register, Immediate, Integer] value
|
345
|
+
# The new value for the register.
|
346
|
+
#
|
327
347
|
# @abstract
|
328
348
|
#
|
329
|
-
def register_set(value
|
349
|
+
def register_set(name,value)
|
330
350
|
end
|
331
351
|
|
332
352
|
#
|
@@ -386,10 +406,17 @@ module Ronin
|
|
386
406
|
# @param [Symbol] syntax
|
387
407
|
# The syntax to compile the program to.
|
388
408
|
#
|
389
|
-
def to_asm(syntax=:
|
409
|
+
def to_asm(syntax=:intel)
|
390
410
|
SYNTAX[syntax].emit_program(self)
|
391
411
|
end
|
392
412
|
|
413
|
+
#
|
414
|
+
# @see #to_s
|
415
|
+
#
|
416
|
+
def to_s
|
417
|
+
to_asm
|
418
|
+
end
|
419
|
+
|
393
420
|
#
|
394
421
|
# Assembles the program.
|
395
422
|
#
|
@@ -399,7 +426,7 @@ module Ronin
|
|
399
426
|
# @param [Hash] options
|
400
427
|
# Additional options.
|
401
428
|
#
|
402
|
-
# @option options [Symbol, String] :syntax (:
|
429
|
+
# @option options [Symbol, String] :syntax (:intel)
|
403
430
|
# The syntax to compile the program to.
|
404
431
|
#
|
405
432
|
# @option options [Symbol] :format (:bin)
|
@@ -424,7 +451,7 @@ module Ronin
|
|
424
451
|
# The path to the assembled program.
|
425
452
|
#
|
426
453
|
def assemble(output,options={})
|
427
|
-
syntax = options.fetch(:syntax,:
|
454
|
+
syntax = options.fetch(:syntax,:intel)
|
428
455
|
format = options.fetch(:format,:bin)
|
429
456
|
parser = PARSERS[syntax]
|
430
457
|
|
@@ -433,11 +460,11 @@ module Ronin
|
|
433
460
|
source.close
|
434
461
|
|
435
462
|
YASM::Program.assemble(
|
436
|
-
:
|
437
|
-
:
|
438
|
-
:
|
439
|
-
:
|
440
|
-
:
|
463
|
+
file: source.path,
|
464
|
+
parser: PARSERS[syntax],
|
465
|
+
target: @arch,
|
466
|
+
output_format: format,
|
467
|
+
output: output
|
441
468
|
)
|
442
469
|
|
443
470
|
return output
|
data/lib/ronin/asm/register.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
data/lib/ronin/asm/shellcode.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
@@ -60,7 +60,7 @@ module Ronin
|
|
60
60
|
def assemble(options={})
|
61
61
|
output = Tempfile.new(['ronin-shellcode', '.bin']).path
|
62
62
|
|
63
|
-
super(output,options.merge(:
|
63
|
+
super(output,options.merge(format: :bin))
|
64
64
|
|
65
65
|
return File.new(output,'rb').read
|
66
66
|
end
|
data/lib/ronin/asm/syntax.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
data/lib/ronin/asm/syntax/att.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Ronin ASM - A Ruby DSL for crafting Assembly programs and Shellcode.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2007-
|
4
|
+
# Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
|
5
5
|
#
|
6
6
|
# This file is part of Ronin ASM.
|
7
7
|
#
|
@@ -87,6 +87,23 @@ module Ronin
|
|
87
87
|
return asm
|
88
88
|
end
|
89
89
|
|
90
|
+
#
|
91
|
+
# Emits multiple operands.
|
92
|
+
#
|
93
|
+
# @param [Array<ImmediateOperand, MemoryOperand, Register, Symbol>] ops
|
94
|
+
# The Array of operands.
|
95
|
+
#
|
96
|
+
# @return [String]
|
97
|
+
# The formatted operands.
|
98
|
+
#
|
99
|
+
def self.emit_operands(ops)
|
100
|
+
if ops.length > 1
|
101
|
+
[*ops[1..-1], ops[0]].map { |op| emit_operand(op) }.join(",\t")
|
102
|
+
else
|
103
|
+
super(ops)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
90
107
|
#
|
91
108
|
# Emits an instruction.
|
92
109
|
#
|
@@ -111,23 +128,33 @@ module Ronin
|
|
111
128
|
end
|
112
129
|
|
113
130
|
#
|
114
|
-
# Emits a
|
131
|
+
# Emits a section name.
|
132
|
+
#
|
133
|
+
# @param [Symbol] name
|
134
|
+
# The section name.
|
135
|
+
#
|
136
|
+
# @return [String]
|
137
|
+
# The formatted section name.
|
138
|
+
#
|
139
|
+
# @since 0.2.0
|
140
|
+
#
|
141
|
+
def self.emit_section(name)
|
142
|
+
".#{name}"
|
143
|
+
end
|
144
|
+
|
145
|
+
#
|
146
|
+
# Emits the program's prologue.
|
115
147
|
#
|
116
148
|
# @param [Program] program
|
117
149
|
# The program.
|
118
150
|
#
|
119
151
|
# @return [String]
|
120
|
-
# The formatted
|
152
|
+
# The formatted prologue.
|
121
153
|
#
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
#
|
126
|
-
if program.arch == :amd64
|
127
|
-
asm = [".code64", '', asm].join($/)
|
128
|
-
end
|
129
|
-
|
130
|
-
return asm
|
154
|
+
# @since 0.2.0
|
155
|
+
#
|
156
|
+
def self.emit_prologue(program)
|
157
|
+
".code#{BITS[program.arch]}"
|
131
158
|
end
|
132
159
|
|
133
160
|
end
|