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.
- 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
|
+
[![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
|
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
|
|