ronin-asm 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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