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/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3
|
data/.travis.yml
ADDED
data/ChangeLog.md
CHANGED
@@ -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
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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', :
|
5
|
+
gem 'jruby-openssl', '~> 0.7', platforms: :jruby
|
6
6
|
|
7
7
|
group :development do
|
8
|
-
gem 'rake', '~> 0
|
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
|
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
|
+
[](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
|
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
|
-
#
|
35
|
-
#
|
36
|
-
#
|
38
|
+
# push ebx
|
39
|
+
# mov eax, WORD 0xc0ffee
|
40
|
+
# pop ebx
|
37
41
|
# hlt
|
38
42
|
|
39
|
-
puts asm.to_asm(:
|
43
|
+
puts asm.to_asm(:att)
|
44
|
+
# .code32
|
45
|
+
# .text
|
40
46
|
# _start:
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
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(:
|
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
|
64
|
+
mov al, 0xb
|
59
65
|
int 0x80
|
60
66
|
end
|
61
67
|
|
62
68
|
shellcode.assemble
|
63
|
-
# => "
|
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
|
70
|
-
mov
|
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
|
84
|
-
mov eax-8
|
85
|
-
mov eax+esi
|
86
|
-
mov eax+(esi*4)
|
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(:
|
109
|
+
ASM.new(os: 'Linux') do
|
104
110
|
# ...
|
105
|
-
mov syscalls[:execve]
|
111
|
+
mov al, syscalls[:execve]
|
106
112
|
int 0x80
|
107
113
|
end
|
108
114
|
|
109
115
|
## Requirements
|
110
116
|
|
111
|
-
* [
|
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-
|
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(:
|
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(:
|
37
|
-
t.pattern =
|
38
|
-
t.rspec_opts = '--tag
|
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
|
|
data/gemspec.yml
CHANGED
data/lib/ronin/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/archs.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
|
#
|
@@ -35,58 +35,58 @@ module Ronin
|
|
35
35
|
|
36
36
|
# AMD64 registers
|
37
37
|
REGISTERS = X86::REGISTERS.merge(
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
|
43
|
-
:
|
44
|
-
:
|
45
|
-
|
46
|
-
:
|
47
|
-
:
|
48
|
-
|
49
|
-
:
|
50
|
-
:
|
51
|
-
:
|
52
|
-
:
|
53
|
-
|
54
|
-
:
|
55
|
-
:
|
56
|
-
:
|
57
|
-
:
|
58
|
-
|
59
|
-
:
|
60
|
-
:
|
61
|
-
:
|
62
|
-
:
|
63
|
-
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
68
|
-
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
73
|
-
|
74
|
-
:
|
75
|
-
:
|
76
|
-
:
|
77
|
-
:
|
78
|
-
|
79
|
-
:
|
80
|
-
:
|
81
|
-
:
|
82
|
-
:
|
83
|
-
|
84
|
-
:
|
85
|
-
:
|
86
|
-
:
|
87
|
-
:
|
88
|
-
|
89
|
-
:
|
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
|
#
|
data/lib/ronin/asm/archs/x86.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
|
#
|
@@ -33,49 +33,49 @@ module Ronin
|
|
33
33
|
|
34
34
|
# X86 registers
|
35
35
|
REGISTERS = {
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
44
|
-
:
|
45
|
-
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:
|
49
|
-
:
|
50
|
-
|
51
|
-
:
|
52
|
-
:
|
53
|
-
:
|
54
|
-
:
|
55
|
-
|
56
|
-
:
|
57
|
-
:
|
58
|
-
|
59
|
-
:
|
60
|
-
:
|
61
|
-
|
62
|
-
:
|
63
|
-
:
|
64
|
-
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
68
|
-
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
|
73
|
-
:
|
74
|
-
:
|
75
|
-
:
|
76
|
-
:
|
77
|
-
:
|
78
|
-
:
|
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
|
-
|
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
|
|