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.
Files changed (41) hide show
  1. data/.ruby-version +1 -0
  2. data/.travis.yml +12 -0
  3. data/ChangeLog.md +32 -6
  4. data/Gemfile +2 -2
  5. data/README.md +30 -22
  6. data/Rakefile +5 -4
  7. data/gemspec.yml +1 -0
  8. data/lib/ronin/asm.rb +1 -1
  9. data/lib/ronin/asm/archs.rb +1 -1
  10. data/lib/ronin/asm/archs/amd64.rb +53 -53
  11. data/lib/ronin/asm/archs/x86.rb +48 -48
  12. data/lib/ronin/asm/asm.rb +1 -1
  13. data/lib/ronin/asm/config.rb +1 -1
  14. data/lib/ronin/asm/immediate_operand.rb +18 -11
  15. data/lib/ronin/asm/instruction.rb +1 -1
  16. data/lib/ronin/asm/memory_operand.rb +22 -16
  17. data/lib/ronin/asm/os.rb +1 -1
  18. data/lib/ronin/asm/os/freebsd.rb +1 -1
  19. data/lib/ronin/asm/os/linux.rb +1 -1
  20. data/lib/ronin/asm/os/os.rb +1 -1
  21. data/lib/ronin/asm/program.rb +60 -33
  22. data/lib/ronin/asm/register.rb +1 -1
  23. data/lib/ronin/asm/shellcode.rb +2 -2
  24. data/lib/ronin/asm/syntax.rb +1 -1
  25. data/lib/ronin/asm/syntax/att.rb +39 -12
  26. data/lib/ronin/asm/syntax/common.rb +40 -2
  27. data/lib/ronin/asm/syntax/intel.rb +27 -28
  28. data/lib/ronin/asm/version.rb +2 -2
  29. data/spec/{asm_spec.rb → asm/asm_spec.rb} +0 -0
  30. data/spec/{immediate_operand_spec.rb → asm/immediate_operand_spec.rb} +2 -0
  31. data/spec/{instruction_spec.rb → asm/instruction_spec.rb} +0 -0
  32. data/spec/{memory_operand_spec.rb → asm/memory_operand_spec.rb} +0 -0
  33. data/spec/{program_spec.rb → asm/program_spec.rb} +106 -50
  34. data/spec/{register_spec.rb → asm/register_spec.rb} +0 -0
  35. data/spec/{shellcode_spec.rb → asm/shellcode_spec.rb} +15 -7
  36. data/spec/{syntax → asm/syntax}/att_spec.rb +15 -5
  37. data/spec/{syntax → asm/syntax}/common_spec.rb +0 -0
  38. data/spec/{syntax → asm/syntax}/intel_spec.rb +24 -6
  39. metadata +16 -16
  40. data/.gemtest +0 -0
  41. data/spec/helpers/database.rb +0 -7
@@ -0,0 +1 @@
1
+ 1.9.3
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ before_install:
3
+ - sudo apt-get install yasm
4
+ rvm:
5
+ - 1.9.2
6
+ - 1.9.3
7
+ - jruby-19mode
8
+ - rbx-19mode
9
+ - 2.0.0
10
+ matrix:
11
+ allow_failures:
12
+ - rvm: jruby-19mode
@@ -1,10 +1,36 @@
1
+ ### 0.2.0 / 2013-06-17
2
+
3
+ * Require [Ruby] >= 1.9.1.
4
+ * Added {Ronin::ASM::Syntax::ATT.emit_section} and
5
+ {Ronin::ASM::Syntax::Intel.emit_section}.
6
+ * Added {Ronin::ASM::Syntax::ATT.emit_prologue} and
7
+ {Ronin::ASM::Syntax::Intel.emit_prologue}.
8
+ * {Ronin::ASM::Instruction} now assumes Intel operand order:
9
+
10
+ mov eax, 0x41
11
+
12
+ * {Ronin::ASM::Program#byte}, {Ronin::ASM::Program#word},
13
+ {Ronin::ASM::Program#dword} and {Ronin::ASM::Program#qword} methods can now
14
+ accept {Ronin::ASM::MemoryOperand}s.
15
+
16
+ mov bx, word(ebp+8)
17
+
18
+ * {Ronin::ASM::Program#to_asm} now emits Intel syntax by default.
19
+ * {Ronin::ASM::Program#assemble} now uses Intel syntax by default.
20
+ * {Ronin::ASM::Syntax::ATT} emit `.code32` directive to forcibly enable 32-bit
21
+ mode for the x86 architecture. [YASM][yasm] apparently defaults to 16-bit
22
+ mode.
23
+ * {Ronin::ASM::Syntax::Intel} emit `BITS 32` directive to forcibly enable
24
+ 32-bit mode for the x86 architecture.
25
+
1
26
  ### 0.1.0 / 2012-08-26
2
27
 
3
- * Initial release:
4
- * Provides a Ruby DSL for writing Assembly programs.
5
- * Supports X86 and AMD64 instruction sets.
6
- * Supports ATT and Intel syntax.
7
- * Uses [yasm] to assemble the programs.
8
- * Supports assembling Shellcode.
28
+ * Initial release:
29
+ * Provides a Ruby DSL for writing Assembly programs.
30
+ * Supports X86 and AMD64 instruction sets.
31
+ * Supports ATT and Intel syntax.
32
+ * Uses [yasm] to assemble the programs.
33
+ * Supports assembling Shellcode.
9
34
 
35
+ [Ruby]: http://www.ruby-lang.org
10
36
  [yasm]: http://yasm.tortall.net/
data/Gemfile CHANGED
@@ -2,10 +2,10 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'jruby-openssl', '~> 0.7', :platforms => :jruby
5
+ gem 'jruby-openssl', '~> 0.7', platforms: :jruby
6
6
 
7
7
  group :development do
8
- gem 'rake', '~> 0.8'
8
+ gem 'rake', '~> 10.0'
9
9
  gem 'kramdown', '~> 0.12'
10
10
 
11
11
  gem 'ripl', '~> 0.3'
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Ronin Asm
1
+ # Ronin ASM
2
2
 
3
3
  * [Source](https://github.com/ronin-ruby/ronin-asm)
4
4
  * [Issues](https://github.com/ronin-ruby/ronin-asm/issues)
@@ -6,6 +6,8 @@
6
6
  * [Mailing List](https://groups.google.com/group/ronin-ruby)
7
7
  * [irc.freenode.net #ronin](http://ronin-ruby.github.com/irc/)
8
8
 
9
+ [![Build Status](https://secure.travis-ci.org/ronin-ruby/ronin-asm.png?branch=master)](https://travis-ci.org/ronin-ruby/ronin-asm)
10
+
9
11
  ## Description
10
12
 
11
13
  {Ronin::ASM} is a Ruby DSL for crafting Assmebly programs and Shellcode.
@@ -24,28 +26,32 @@ Create a program:
24
26
 
25
27
  asm = ASM.new do
26
28
  push ebx
27
- mov ebx, eax
29
+ mov eax, 0xc0ffee
28
30
  pop ebx
29
31
  hlt
30
32
  end
31
33
 
32
34
  puts asm.to_asm
35
+ # BITS 32
36
+ # section .text
33
37
  # _start:
34
- # pushl %ebx
35
- # movl %ebx, %eax
36
- # popl %ebx
38
+ # push ebx
39
+ # mov eax, WORD 0xc0ffee
40
+ # pop ebx
37
41
  # hlt
38
42
 
39
- puts asm.to_asm(:intel)
43
+ puts asm.to_asm(:att)
44
+ # .code32
45
+ # .text
40
46
  # _start:
41
- # push ebx
42
- # mov eax, ebx
43
- # pop ebx
47
+ # pushl %ebx
48
+ # movl %ebx, %eax
49
+ # popl %ebx
44
50
  # hlt
45
51
 
46
52
  Create shellcode:
47
53
 
48
- shellcode = ASM::Shellcode.new(:arch => :x86) do
54
+ shellcode = ASM::Shellcode.new(arch: :x86) do
49
55
  xor eax, eax
50
56
  push eax
51
57
  push 0x68732f2f
@@ -55,19 +61,19 @@ Create shellcode:
55
61
  push ebx
56
62
  mov esp, ecx
57
63
  xor edx, edx
58
- mov 0xb, al
64
+ mov al, 0xb
59
65
  int 0x80
60
66
  end
61
67
 
62
68
  shellcode.assemble
63
- # => "f1\xC0fPfh//shfh/binf\x89\xE3fPfSf\x89\xE1f1\xD2\xB0\v\xCD\x80"
69
+ # => "1\xC0Ph//shh/bin\x89\xDCPS\x89\xCC1\xD2\xB0\v\xCD\x80"
64
70
 
65
71
  ### Immediate Operands
66
72
 
67
73
  Immediate operands can be Integers or `nil`:
68
74
 
69
- mov 0xff, eax
70
- mov nil, ebx
75
+ mov eax, 0xff
76
+ mov ebx, nil
71
77
 
72
78
  The size of the operand can also be specified explicitly:
73
79
 
@@ -80,10 +86,10 @@ The size of the operand can also be specified explicitly:
80
86
 
81
87
  Memory operands can be expressed as arithmatic on registers:
82
88
 
83
- mov eax+8, ebx
84
- mov eax-8, ebx
85
- mov eax+esi, ebx
86
- mov eax+(esi*4), ebx
89
+ mov ebx, eax+8
90
+ mov ebx, eax-8
91
+ mov ebx, eax+esi
92
+ mov ebx, eax+(esi*4)
87
93
 
88
94
  ### Labels
89
95
 
@@ -100,15 +106,16 @@ Labels can be expressed with blocks:
100
106
  If the `:os` option is specified, then syscall numbers can be looked up via the
101
107
  `syscalls` Hash:
102
108
 
103
- ASM.new(:os => 'Linux') do
109
+ ASM.new(os: 'Linux') do
104
110
  # ...
105
- mov syscalls[:execve], al
111
+ mov al, syscalls[:execve]
106
112
  int 0x80
107
113
  end
108
114
 
109
115
  ## Requirements
110
116
 
111
- * [data_paths] ~> 0.3
117
+ * [Ruby] >= 1.9.1
118
+ * [data\_paths] ~> 0.3
112
119
  * [yasm] >= 0.6.0
113
120
  * [ruby-yasm] ~> 0.2
114
121
 
@@ -120,7 +127,7 @@ If the `:os` option is specified, then syscall numbers can be looked up via the
120
127
 
121
128
  Ronin::ASM - A Ruby DSL for crafting Assmebly programs and Shellcode.
122
129
 
123
- Copyright (c) 2007-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
130
+ Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
124
131
 
125
132
  This file is part of Ronin ASM.
126
133
 
@@ -137,6 +144,7 @@ GNU General Public License for more details.
137
144
  You should have received a copy of the GNU General Public License
138
145
  along with Ronin Asm. If not, see <http://www.gnu.org/licenses/>.
139
146
 
147
+ [Ruby]: http://www.ruby-lang.org
140
148
  [yasm]: http://yasm.tortall.net/
141
149
  [data_paths]: https://github.com/postmodern/data_paths#readme
142
150
  [ruby-yasm]: https://github.com/sophsec/ruby-yasm#readme
data/Rakefile CHANGED
@@ -19,7 +19,7 @@ end
19
19
  require 'rake'
20
20
 
21
21
  require 'rubygems/tasks'
22
- Gem::Tasks.new(:sign => {:checksum => true, :pgp => true}) do |tasks|
22
+ Gem::Tasks.new(sign: {checksum: true, pgp: true}) do |tasks|
23
23
  tasks.console.command = 'ripl'
24
24
  tasks.console.options = %w[
25
25
  -rripl/multi_line
@@ -31,11 +31,12 @@ end
31
31
  require 'rspec/core/rake_task'
32
32
  RSpec::Core::RakeTask.new
33
33
  task :default => :spec
34
+ task :test => :spec
34
35
 
35
36
  namespace :spec do
36
- RSpec::Core::RakeTask.new(:yasm) do |t|
37
- t.pattern = 'spec/program_spec.rb spec/shellcode_spec.rb'
38
- t.rspec_opts = '--tag yasm'
37
+ RSpec::Core::RakeTask.new(:integration) do |t|
38
+ t.pattern = %w[spec/program_spec.rb spec/shellcode_spec.rb]
39
+ t.rspec_opts = '--tag integration'
39
40
  end
40
41
  end
41
42
 
@@ -10,6 +10,7 @@ homepage: https://github.com/ronin-ruby/ronin-asm#readme
10
10
  has_yard: true
11
11
 
12
12
  requirements: yasm >= 0.6.0
13
+ required_ruby_version: ">= 1.9.1"
13
14
 
14
15
  dependencies:
15
16
  data_paths: ~> 0.3
@@ -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-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
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-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
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-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
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
  #
@@ -35,58 +35,58 @@ module Ronin
35
35
 
36
36
  # AMD64 registers
37
37
  REGISTERS = X86::REGISTERS.merge(
38
- :rax => Register.new(:rax, 8, true),
39
- :rbx => Register.new(:rbx, 8, true),
40
- :rcx => Register.new(:rcx, 8, true),
41
- :rdx => Register.new(:rdx, 8, true),
42
-
43
- :rsi => Register.new(:rsi, 8, true),
44
- :rdi => Register.new(:rdi, 8, true),
45
-
46
- :rsp => Register.new(:rsp, 8, true),
47
- :rbp => Register.new(:rbp, 8, true),
48
-
49
- :r8b => Register.new(:r8b, 1, true),
50
- :r8w => Register.new(:r8w, 2, true),
51
- :r8d => Register.new(:r8d, 4, true),
52
- :r8 => Register.new(:r8, 8, true),
53
-
54
- :r9b => Register.new(:r9b, 1, true),
55
- :r9w => Register.new(:r9w, 2, true),
56
- :r9d => Register.new(:r9d, 4, true),
57
- :r9 => Register.new(:r9, 8, true),
58
-
59
- :r10b => Register.new(:r10b, 1, true),
60
- :r10w => Register.new(:r10w, 2, true),
61
- :r10d => Register.new(:r10d, 4, true),
62
- :r10 => Register.new(:r10, 8, true),
63
-
64
- :r11b => Register.new(:r11b, 1, true),
65
- :r11w => Register.new(:r11w, 2, true),
66
- :r11d => Register.new(:r11d, 4, true),
67
- :r11 => Register.new(:r11, 8, true),
68
-
69
- :r12b => Register.new(:r12b, 1, true),
70
- :r12w => Register.new(:r12w, 2, true),
71
- :r12d => Register.new(:r12d, 4, true),
72
- :r12 => Register.new(:r12, 8, true),
73
-
74
- :r13b => Register.new(:r13b, 1, true),
75
- :r13w => Register.new(:r13w, 2, true),
76
- :r13d => Register.new(:r13d, 4, true),
77
- :r13 => Register.new(:r13, 8, true),
78
-
79
- :r14b => Register.new(:r14b, 1, true),
80
- :r14w => Register.new(:r14w, 2, true),
81
- :r14d => Register.new(:r14d, 4, true),
82
- :r14 => Register.new(:r14, 8, true),
83
-
84
- :r15b => Register.new(:r15b, 1, true),
85
- :r15w => Register.new(:r15w, 2, true),
86
- :r15d => Register.new(:r15d, 4, true),
87
- :r15 => Register.new(:r15, 8, true),
88
-
89
- :rip => Register.new(:rip, 8, true)
38
+ rax: Register.new(:rax, 8, true),
39
+ rbx: Register.new(:rbx, 8, true),
40
+ rcx: Register.new(:rcx, 8, true),
41
+ rdx: Register.new(:rdx, 8, true),
42
+
43
+ rsi: Register.new(:rsi, 8, true),
44
+ rdi: Register.new(:rdi, 8, true),
45
+
46
+ rsp: Register.new(:rsp, 8, true),
47
+ rbp: Register.new(:rbp, 8, true),
48
+
49
+ r8b: Register.new(:r8b, 1, true),
50
+ r8w: Register.new(:r8w, 2, true),
51
+ r8d: Register.new(:r8d, 4, true),
52
+ r8: Register.new(:r8, 8, true),
53
+
54
+ r9b: Register.new(:r9b, 1, true),
55
+ r9w: Register.new(:r9w, 2, true),
56
+ r9d: Register.new(:r9d, 4, true),
57
+ r9: Register.new(:r9, 8, true),
58
+
59
+ r10b: Register.new(:r10b, 1, true),
60
+ r10w: Register.new(:r10w, 2, true),
61
+ r10d: Register.new(:r10d, 4, true),
62
+ r10: Register.new(:r10, 8, true),
63
+
64
+ r11b: Register.new(:r11b, 1, true),
65
+ r11w: Register.new(:r11w, 2, true),
66
+ r11d: Register.new(:r11d, 4, true),
67
+ r11: Register.new(:r11, 8, true),
68
+
69
+ r12b: Register.new(:r12b, 1, true),
70
+ r12w: Register.new(:r12w, 2, true),
71
+ r12d: Register.new(:r12d, 4, true),
72
+ r12: Register.new(:r12, 8, true),
73
+
74
+ r13b: Register.new(:r13b, 1, true),
75
+ r13w: Register.new(:r13w, 2, true),
76
+ r13d: Register.new(:r13d, 4, true),
77
+ r13: Register.new(:r13, 8, true),
78
+
79
+ r14b: Register.new(:r14b, 1, true),
80
+ r14w: Register.new(:r14w, 2, true),
81
+ r14d: Register.new(:r14d, 4, true),
82
+ r14: Register.new(:r14, 8, true),
83
+
84
+ r15b: Register.new(:r15b, 1, true),
85
+ r15w: Register.new(:r15w, 2, true),
86
+ r15d: Register.new(:r15d, 4, true),
87
+ r15: Register.new(:r15, 8, true),
88
+
89
+ rip: Register.new(:rip, 8, true)
90
90
  )
91
91
 
92
92
  #
@@ -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-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
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
  #
@@ -33,49 +33,49 @@ module Ronin
33
33
 
34
34
  # X86 registers
35
35
  REGISTERS = {
36
- :al => Register.new(:al, 1),
37
- :ah => Register.new(:ah, 1),
38
- :ax => Register.new(:ax, 2),
39
- :eax => Register.new(:eax, 4, true),
40
-
41
- :bl => Register.new(:bl, 1),
42
- :bh => Register.new(:bh, 1),
43
- :bx => Register.new(:bx, 2),
44
- :ebx => Register.new(:ebx, 4, true),
45
-
46
- :cl => Register.new(:cl, 1),
47
- :ch => Register.new(:ch, 1),
48
- :cx => Register.new(:cx, 2),
49
- :ecx => Register.new(:ecx, 4, true),
50
-
51
- :dl => Register.new(:dl, 1),
52
- :dh => Register.new(:dh, 1),
53
- :dx => Register.new(:dx, 2),
54
- :edx => Register.new(:edx, 4, true),
55
-
56
- :bp => Register.new(:bp, 2),
57
- :ebp => Register.new(:ebp, 4),
58
-
59
- :sp => Register.new(:sp, 2),
60
- :esp => Register.new(:esp, 4),
61
-
62
- :ip => Register.new(:ip, 2),
63
- :eip => Register.new(:eip, 4),
64
-
65
- :sil => Register.new(:sil, 1),
66
- :si => Register.new(:si, 2),
67
- :esi => Register.new(:esi, 4, true),
68
-
69
- :dil => Register.new(:dil, 1),
70
- :di => Register.new(:di, 2),
71
- :edi => Register.new(:edi, 4, true),
72
-
73
- :cs => Register.new(:cs, 2),
74
- :ds => Register.new(:ds, 2),
75
- :es => Register.new(:es, 2),
76
- :fs => Register.new(:fs, 2),
77
- :gs => Register.new(:gs, 2),
78
- :ss => Register.new(:ss, 2)
36
+ al: Register.new(:al, 1),
37
+ ah: Register.new(:ah, 1),
38
+ ax: Register.new(:ax, 2),
39
+ eax: Register.new(:eax, 4, true),
40
+
41
+ bl: Register.new(:bl, 1),
42
+ bh: Register.new(:bh, 1),
43
+ bx: Register.new(:bx, 2),
44
+ ebx: Register.new(:ebx, 4, true),
45
+
46
+ cl: Register.new(:cl, 1),
47
+ ch: Register.new(:ch, 1),
48
+ cx: Register.new(:cx, 2),
49
+ ecx: Register.new(:ecx, 4, true),
50
+
51
+ dl: Register.new(:dl, 1),
52
+ dh: Register.new(:dh, 1),
53
+ dx: Register.new(:dx, 2),
54
+ edx: Register.new(:edx, 4, true),
55
+
56
+ bp: Register.new(:bp, 2),
57
+ ebp: Register.new(:ebp, 4),
58
+
59
+ sp: Register.new(:sp, 2),
60
+ esp: Register.new(:esp, 4),
61
+
62
+ ip: Register.new(:ip, 2),
63
+ eip: Register.new(:eip, 4),
64
+
65
+ sil: Register.new(:sil, 1),
66
+ si: Register.new(:si, 2),
67
+ esi: Register.new(:esi, 4, true),
68
+
69
+ dil: Register.new(:dil, 1),
70
+ di: Register.new(:di, 2),
71
+ edi: Register.new(:edi, 4, true),
72
+
73
+ cs: Register.new(:cs, 2),
74
+ ds: Register.new(:ds, 2),
75
+ es: Register.new(:es, 2),
76
+ fs: Register.new(:fs, 2),
77
+ gs: Register.new(:gs, 2),
78
+ ss: Register.new(:ss, 2)
79
79
  }
80
80
 
81
81
  #
@@ -131,13 +131,13 @@ module Ronin
131
131
  #
132
132
  # Generates the instruction to set a register.
133
133
  #
134
- # @param [ImmediateOperand, MemoryOperate, Register, Integer, Symbol] value
135
- # The value to set.
136
- #
137
134
  # @param [Symbol] name
138
135
  # The name of the register.
139
136
  #
140
- def register_set(value,name)
137
+ # @param [ImmediateOperand, MemoryOperate, Register, Integer, Symbol] value
138
+ # The value to set.
139
+ #
140
+ def register_set(name,value)
141
141
  instruction(:mov,value,register(name))
142
142
  end
143
143