pwntools 0.1.0 → 1.0.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.
- checksums.yaml +4 -4
- data/README.md +88 -11
- data/Rakefile +5 -1
- data/lib/pwn.rb +9 -7
- data/lib/pwnlib/abi.rb +60 -0
- data/lib/pwnlib/asm.rb +146 -0
- data/lib/pwnlib/constants/constant.rb +16 -2
- data/lib/pwnlib/constants/constants.rb +35 -19
- data/lib/pwnlib/constants/linux/amd64.rb +30 -1
- data/lib/pwnlib/context.rb +25 -17
- data/lib/pwnlib/dynelf.rb +117 -54
- data/lib/pwnlib/elf/elf.rb +267 -0
- data/lib/pwnlib/ext/helper.rb +4 -4
- data/lib/pwnlib/logger.rb +87 -0
- data/lib/pwnlib/memleak.rb +58 -29
- data/lib/pwnlib/pwn.rb +19 -8
- data/lib/pwnlib/reg_sort.rb +102 -108
- data/lib/pwnlib/shellcraft/generators/amd64/common/common.rb +14 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/infloop.rb +17 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/memcpy.rb +31 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/mov.rb +127 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/nop.rb +16 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/popad.rb +27 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/pushstr.rb +64 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/pushstr_array.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/ret.rb +32 -0
- data/lib/pwnlib/shellcraft/generators/amd64/common/setregs.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/amd64/linux/execve.rb +21 -0
- data/lib/pwnlib/shellcraft/generators/amd64/linux/linux.rb +14 -0
- data/lib/pwnlib/shellcraft/generators/amd64/linux/ls.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/amd64/linux/sh.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/amd64/linux/syscall.rb +21 -0
- data/lib/pwnlib/shellcraft/generators/helper.rb +106 -0
- data/lib/pwnlib/shellcraft/generators/i386/common/common.rb +14 -0
- data/lib/pwnlib/shellcraft/generators/i386/common/infloop.rb +17 -0
- data/lib/pwnlib/shellcraft/generators/i386/common/mov.rb +90 -0
- data/lib/pwnlib/shellcraft/generators/i386/common/nop.rb +16 -0
- data/lib/pwnlib/shellcraft/generators/i386/common/pushstr.rb +39 -0
- data/lib/pwnlib/shellcraft/generators/i386/common/pushstr_array.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/i386/common/setregs.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/i386/linux/execve.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/i386/linux/linux.rb +14 -0
- data/lib/pwnlib/shellcraft/generators/i386/linux/ls.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/i386/linux/sh.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/i386/linux/syscall.rb +19 -0
- data/lib/pwnlib/shellcraft/generators/x86/common/common.rb +26 -0
- data/lib/pwnlib/shellcraft/generators/x86/common/infloop.rb +22 -0
- data/lib/pwnlib/shellcraft/generators/x86/common/mov.rb +15 -0
- data/lib/pwnlib/shellcraft/generators/x86/common/pushstr.rb +15 -0
- data/lib/pwnlib/shellcraft/generators/x86/common/pushstr_array.rb +85 -0
- data/lib/pwnlib/shellcraft/generators/x86/common/setregs.rb +82 -0
- data/lib/pwnlib/shellcraft/generators/x86/linux/execve.rb +69 -0
- data/lib/pwnlib/shellcraft/generators/x86/linux/linux.rb +14 -0
- data/lib/pwnlib/shellcraft/generators/x86/linux/ls.rb +66 -0
- data/lib/pwnlib/shellcraft/generators/x86/linux/sh.rb +52 -0
- data/lib/pwnlib/shellcraft/generators/x86/linux/syscall.rb +52 -0
- data/lib/pwnlib/shellcraft/registers.rb +145 -0
- data/lib/pwnlib/shellcraft/shellcraft.rb +67 -0
- data/lib/pwnlib/timer.rb +60 -0
- data/lib/pwnlib/tubes/buffer.rb +96 -0
- data/lib/pwnlib/tubes/sock.rb +95 -0
- data/lib/pwnlib/tubes/tube.rb +270 -0
- data/lib/pwnlib/util/cyclic.rb +95 -94
- data/lib/pwnlib/util/fiddling.rb +256 -220
- data/lib/pwnlib/util/getdents.rb +83 -0
- data/lib/pwnlib/util/hexdump.rb +109 -108
- data/lib/pwnlib/util/lists.rb +55 -0
- data/lib/pwnlib/util/packing.rb +226 -228
- data/lib/pwnlib/util/ruby.rb +18 -0
- data/lib/pwnlib/version.rb +2 -1
- data/test/abi_test.rb +21 -0
- data/test/asm_test.rb +104 -0
- data/test/constants/constant_test.rb +1 -0
- data/test/constants/constants_test.rb +4 -2
- data/test/context_test.rb +1 -0
- data/test/data/echo.rb +20 -0
- data/test/data/elfs/Makefile +22 -0
- data/test/data/elfs/amd64.frelro.elf +0 -0
- data/test/data/elfs/amd64.frelro.pie.elf +0 -0
- data/test/data/elfs/amd64.nrelro.elf +0 -0
- data/test/data/elfs/amd64.prelro.elf +0 -0
- data/test/data/elfs/i386.frelro.pie.elf +0 -0
- data/test/data/elfs/i386.prelro.elf +0 -0
- data/test/data/elfs/source.cpp +19 -0
- data/test/data/flag +1 -0
- data/test/data/lib32/ld.so.2 +0 -0
- data/test/data/lib32/libc.so.6 +0 -0
- data/test/data/lib64/ld.so.2 +0 -0
- data/test/data/lib64/libc.so.6 +0 -0
- data/test/dynelf_test.rb +59 -24
- data/test/elf/elf_test.rb +120 -0
- data/test/ext_test.rb +3 -2
- data/test/files/use_pwnlib.rb +1 -1
- data/test/logger_test.rb +61 -0
- data/test/memleak_test.rb +4 -33
- data/test/reg_sort_test.rb +3 -1
- data/test/shellcraft/infloop_test.rb +26 -0
- data/test/shellcraft/linux/ls_test.rb +108 -0
- data/test/shellcraft/linux/sh_test.rb +119 -0
- data/test/shellcraft/linux/syscalls/execve_test.rb +136 -0
- data/test/shellcraft/linux/syscalls/syscall_test.rb +83 -0
- data/test/shellcraft/memcpy_test.rb +35 -0
- data/test/shellcraft/mov_test.rb +98 -0
- data/test/shellcraft/nop_test.rb +26 -0
- data/test/shellcraft/popad_test.rb +29 -0
- data/test/shellcraft/pushstr_array_test.rb +91 -0
- data/test/shellcraft/pushstr_test.rb +108 -0
- data/test/shellcraft/registers_test.rb +32 -0
- data/test/shellcraft/ret_test.rb +30 -0
- data/test/shellcraft/setregs_test.rb +62 -0
- data/test/shellcraft/shellcraft_test.rb +28 -0
- data/test/test_helper.rb +12 -1
- data/test/timer_test.rb +23 -0
- data/test/tubes/buffer_test.rb +45 -0
- data/test/tubes/sock_test.rb +68 -0
- data/test/tubes/tube_test.rb +241 -0
- data/test/util/cyclic_test.rb +2 -1
- data/test/util/fiddling_test.rb +2 -1
- data/test/util/getdents_test.rb +32 -0
- data/test/util/hexdump_test.rb +7 -9
- data/test/util/lists_test.rb +21 -0
- data/test/util/packing_test.rb +4 -3
- metadata +215 -25
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: ASCII-8BIT
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
require 'pwnlib/context'
|
6
|
+
require 'pwnlib/shellcraft/shellcraft'
|
7
|
+
|
8
|
+
class SyscallTest < MiniTest::Test
|
9
|
+
include ::Pwnlib::Context
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@shellcraft = ::Pwnlib::Shellcraft::Shellcraft.instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_amd64
|
16
|
+
context.local(arch: 'amd64') do
|
17
|
+
assert_equal(<<-'EOS', @shellcraft.syscall('SYS_execve', 1, 'rsp', 2, 0))
|
18
|
+
/* call execve(1, "rsp", 2, 0) */
|
19
|
+
push 0x3b /* (SYS_execve) */
|
20
|
+
pop rax
|
21
|
+
push 1
|
22
|
+
pop rdi
|
23
|
+
mov rsi, rsp
|
24
|
+
push 2
|
25
|
+
pop rdx
|
26
|
+
xor r10d, r10d /* 0 */
|
27
|
+
syscall
|
28
|
+
EOS
|
29
|
+
assert_equal(<<-'EOS', @shellcraft.syscall)
|
30
|
+
/* call syscall() */
|
31
|
+
syscall
|
32
|
+
EOS
|
33
|
+
assert_equal(<<-'EOS', @shellcraft.syscall('rax', 'rdi', 'rsi'))
|
34
|
+
/* call syscall("rax", "rdi", "rsi") */
|
35
|
+
/* setregs noop */
|
36
|
+
syscall
|
37
|
+
EOS
|
38
|
+
assert_equal(<<-'EOS', @shellcraft.syscall('rbp', nil, nil, 1))
|
39
|
+
/* call syscall("rbp", ?, ?, 1) */
|
40
|
+
mov rax, rbp
|
41
|
+
push 1
|
42
|
+
pop rdx
|
43
|
+
syscall
|
44
|
+
EOS
|
45
|
+
mmap = @shellcraft.syscall('SYS_mmap', 0, 4096,
|
46
|
+
'PROT_READ | PROT_WRITE | PROT_EXEC',
|
47
|
+
'MAP_PRIVATE | MAP_ANONYMOUS', -1, 0)
|
48
|
+
assert_equal(<<-'EOS', mmap)
|
49
|
+
/* call mmap(0, 4096, "PROT_READ | PROT_WRITE | PROT_EXEC", "MAP_PRIVATE | MAP_ANONYMOUS", -1, 0) */
|
50
|
+
push 9 /* (SYS_mmap) */
|
51
|
+
pop rax
|
52
|
+
xor edi, edi /* 0 */
|
53
|
+
mov esi, 0x1010101
|
54
|
+
xor esi, 0x1011101 /* 0x1000 == 0x1010101 ^ 0x1011101 */
|
55
|
+
push 7 /* (PROT_READ | PROT_WRITE | PROT_EXEC) */
|
56
|
+
pop rdx
|
57
|
+
push 0x22 /* (MAP_PRIVATE | MAP_ANONYMOUS) */
|
58
|
+
pop r10
|
59
|
+
push -1
|
60
|
+
pop r8
|
61
|
+
xor r9d, r9d /* 0 */
|
62
|
+
syscall
|
63
|
+
EOS
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_i386
|
68
|
+
context.local(arch: 'i386') do
|
69
|
+
assert_equal(<<-'EOS', @shellcraft.syscall('ebp', nil, nil, 1))
|
70
|
+
/* call syscall("ebp", ?, ?, 1) */
|
71
|
+
mov eax, ebp
|
72
|
+
push 1
|
73
|
+
pop edx
|
74
|
+
int 0x80
|
75
|
+
EOS
|
76
|
+
assert_equal(<<-'EOS', @shellcraft.syscall('eax', 'ebx', 'ecx'))
|
77
|
+
/* call syscall("eax", "ebx", "ecx") */
|
78
|
+
/* setregs noop */
|
79
|
+
int 0x80
|
80
|
+
EOS
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: ASCII-8BIT
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
require 'pwnlib/context'
|
6
|
+
require 'pwnlib/shellcraft/shellcraft'
|
7
|
+
|
8
|
+
class MemcpyTest < MiniTest::Test
|
9
|
+
include ::Pwnlib::Context
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@shellcraft = ::Pwnlib::Shellcraft::Shellcraft.instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_amd64
|
16
|
+
context.local(arch: 'amd64') do
|
17
|
+
assert_equal(<<-'EOS', @shellcraft.memcpy('rdi', 'rbx', 255))
|
18
|
+
/* memcpy("rdi", "rbx", 0xff) */
|
19
|
+
cld
|
20
|
+
mov rsi, rbx
|
21
|
+
xor ecx, ecx
|
22
|
+
mov cl, 0xff
|
23
|
+
rep movsb
|
24
|
+
EOS
|
25
|
+
assert_equal(<<-'EOS', @shellcraft.memcpy('rdi', 'rbx', 255))
|
26
|
+
/* memcpy("rdi", "rbx", 0xff) */
|
27
|
+
cld
|
28
|
+
mov rsi, rbx
|
29
|
+
xor ecx, ecx
|
30
|
+
mov cl, 0xff
|
31
|
+
rep movsb
|
32
|
+
EOS
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# encoding: ASCII-8BIT
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
require 'pwnlib/context'
|
6
|
+
require 'pwnlib/shellcraft/shellcraft'
|
7
|
+
|
8
|
+
class MovTest < MiniTest::Test
|
9
|
+
include ::Pwnlib::Context
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@shellcraft = ::Pwnlib::Shellcraft::Shellcraft.instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_amd64
|
16
|
+
context.local(arch: 'amd64') do
|
17
|
+
assert_equal(" xor eax, eax /* 0 */\n", @shellcraft.mov('rax', 0))
|
18
|
+
assert_equal(" /* moving rax into rax, but this is a no-op */\n", @shellcraft.mov('rax', 'rax'))
|
19
|
+
assert_equal(" push 9 /* mov eax, '\\n' */\n pop rax\n inc eax\n", @shellcraft.mov('rax', 10))
|
20
|
+
assert_equal(" xor eax, eax\n mov al, 0xc0\n", @shellcraft.mov('rax', 0xc0))
|
21
|
+
assert_equal(" xor eax, eax\n mov ax, 0xc0c0\n", @shellcraft.mov('rax', 0xc0c0))
|
22
|
+
assert_equal(" xor ebx, ebx\n mov bh, 0x100 >> 8\n", @shellcraft.mov('ebx', 0x100))
|
23
|
+
assert_equal(<<-'EOS', @shellcraft.mov('rdi', 0x100))
|
24
|
+
mov edi, 0x1010201
|
25
|
+
xor edi, 0x1010301 /* 0x100 == 0x1010201 ^ 0x1010301 */
|
26
|
+
EOS
|
27
|
+
assert_equal(" mov r15d, 0xffffffff\n", @shellcraft.mov('r15', 0xffffffff))
|
28
|
+
assert_equal(" push -1\n pop rsi\n", @shellcraft.mov('rsi', -1))
|
29
|
+
assert_equal(" mov esi, -1\n", @shellcraft.mov('rsi', -1, stack_allowed: false))
|
30
|
+
assert_equal(" movzx edi, ax\n", @shellcraft.mov('rdi', 'ax'))
|
31
|
+
assert_equal(" mov rdx, rbx\n", @shellcraft.mov('rdx', 'rbx'))
|
32
|
+
assert_equal(" xor eax, eax /* (SYS_read) */\n", @shellcraft.mov('rax', 'SYS_read'))
|
33
|
+
assert_equal(" push 1 /* (SYS_write) */\n pop rax\n", @shellcraft.mov('eax', 'SYS_write'))
|
34
|
+
assert_equal(" xor ax, ax\n mov al, 1 /* (SYS_write) */\n", @shellcraft.mov('ax', 'SYS_write'))
|
35
|
+
assert_equal(" /* moving ax into al, but this is a no-op */\n", @shellcraft.mov('al', 'ax'))
|
36
|
+
assert_equal(<<-'EOS', @shellcraft.mov('rax', 0x11dead00ff))
|
37
|
+
mov rax, 0x101010101010101
|
38
|
+
push rax
|
39
|
+
mov rax, 0x1010110dfac01fe
|
40
|
+
xor [rsp], rax /* 0x11dead00ff == 0x101010101010101 ^ 0x1010110dfac01fe */
|
41
|
+
pop rax
|
42
|
+
EOS
|
43
|
+
# raises
|
44
|
+
err = assert_raises(ArgumentError) { @shellcraft.mov('eax', 'rdx') }
|
45
|
+
assert_equal('cannot mov eax, rdx: dst is smaller than src', err.message)
|
46
|
+
err = assert_raises(ArgumentError) { @shellcraft.mov('rcx', 0x7f00000000, stack_allowed: false) }
|
47
|
+
assert_equal('Cannot put 0x7f00000000 into \'rcx\' without using stack.', err.message)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_i386
|
52
|
+
context.local(arch: 'i386') do
|
53
|
+
assert_equal(" mov eax, ebx\n", @shellcraft.mov('eax', 'ebx'))
|
54
|
+
assert_equal(" xor eax, eax /* 0 */\n", @shellcraft.mov('eax', 0))
|
55
|
+
assert_equal(" xor ax, ax /* 0 */\n", @shellcraft.mov('ax', 0))
|
56
|
+
assert_equal(" xor ax, ax\n mov al, 0x11\n", @shellcraft.mov('ax', 17))
|
57
|
+
assert_equal(<<-EOS, @shellcraft.mov('edi', 10))
|
58
|
+
push 9 /* mov edi, '\\n' */
|
59
|
+
pop edi
|
60
|
+
inc edi
|
61
|
+
EOS
|
62
|
+
assert_equal(" /* moving ax into al, but this is a no-op */\n", @shellcraft.mov('al', 'ax'))
|
63
|
+
assert_equal(" /* moving esp into esp, but this is a no-op */\n", @shellcraft.mov('esp', 'esp'))
|
64
|
+
assert_equal(" movzx ax, bl\n", @shellcraft.mov('ax', 'bl'))
|
65
|
+
assert_equal(" push 1\n pop eax\n", @shellcraft.mov('eax', 1))
|
66
|
+
assert_equal(" xor eax, eax\n mov al, 1\n", @shellcraft.mov('eax', 1, stack_allowed: false))
|
67
|
+
assert_equal(" mov eax, 0xdeadbeaf\n", @shellcraft.mov('eax', 0xdeadbeaf))
|
68
|
+
assert_equal(" mov eax, -0xdead00ff\n neg eax\n", @shellcraft.mov('eax', 0xdead00ff))
|
69
|
+
assert_equal(" xor eax, eax\n mov al, 0xc0\n", @shellcraft.mov('eax', 0xc0))
|
70
|
+
assert_equal(" mov edi, -0xc0\n neg edi\n", @shellcraft.mov('edi', 0xc0))
|
71
|
+
assert_equal(" xor eax, eax\n mov ah, 0xc000 >> 8\n", @shellcraft.mov('eax', 0xc000))
|
72
|
+
assert_equal(<<-EOS, @shellcraft.mov('eax', 0xffc000))
|
73
|
+
mov eax, 0x1010101
|
74
|
+
xor eax, 0x1fec101 /* 0xffc000 == 0x1010101 ^ 0x1fec101 */
|
75
|
+
EOS
|
76
|
+
assert_equal(<<-EOS, @shellcraft.mov('edi', 0xc000))
|
77
|
+
mov edi, (-1) ^ 0xc000
|
78
|
+
not edi
|
79
|
+
EOS
|
80
|
+
assert_equal(<<-EOS, @shellcraft.mov('edi', 0xf500))
|
81
|
+
mov edi, 0x1010101
|
82
|
+
xor edi, 0x101f401 /* 0xf500 == 0x1010101 ^ 0x101f401 */
|
83
|
+
EOS
|
84
|
+
assert_equal(" xor eax, eax\n mov ax, 0xc0c0\n", @shellcraft.mov('eax', 0xc0c0))
|
85
|
+
assert_equal(<<-EOS, @shellcraft.mov('eax', 'SYS_execve'))
|
86
|
+
push 0xb /* (SYS_execve) */
|
87
|
+
pop eax
|
88
|
+
EOS
|
89
|
+
assert_equal(<<-EOS, @shellcraft.mov('eax', 'PROT_READ | PROT_WRITE | PROT_EXEC'))
|
90
|
+
push 7 /* (PROT_READ | PROT_WRITE | PROT_EXEC) */
|
91
|
+
pop eax
|
92
|
+
EOS
|
93
|
+
# raises
|
94
|
+
err = assert_raises(ArgumentError) { @shellcraft.mov('ax', 'ebx') }
|
95
|
+
assert_equal('cannot mov ax, ebx: dst is smaller than src', err.message)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: ASCII-8BIT
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
require 'pwnlib/context'
|
6
|
+
require 'pwnlib/shellcraft/shellcraft'
|
7
|
+
|
8
|
+
class NopTest < MiniTest::Test
|
9
|
+
include ::Pwnlib::Context
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@shellcraft = ::Pwnlib::Shellcraft::Shellcraft.instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_amd64
|
16
|
+
context.local(arch: 'amd64') do
|
17
|
+
assert_equal(" nop\n", @shellcraft.nop)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_i386
|
22
|
+
context.local(arch: 'i386') do
|
23
|
+
assert_equal(" nop\n", @shellcraft.nop)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: ASCII-8BIT
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
require 'pwnlib/context'
|
6
|
+
require 'pwnlib/shellcraft/shellcraft'
|
7
|
+
|
8
|
+
class PopadTest < MiniTest::Test
|
9
|
+
include ::Pwnlib::Context
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@shellcraft = ::Pwnlib::Shellcraft::Shellcraft.instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_amd64
|
16
|
+
context.local(arch: 'amd64') do
|
17
|
+
assert_equal(<<-'EOS', @shellcraft.popad)
|
18
|
+
pop rdi
|
19
|
+
pop rsi
|
20
|
+
pop rbp
|
21
|
+
pop rbx /* add rsp, 8 */
|
22
|
+
pop rbx
|
23
|
+
pop rdx
|
24
|
+
pop rcx
|
25
|
+
pop rax
|
26
|
+
EOS
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# encoding: ASCII-8BIT
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
require 'pwnlib/context'
|
6
|
+
require 'pwnlib/shellcraft/shellcraft'
|
7
|
+
|
8
|
+
class PushstrArrayTest < MiniTest::Test
|
9
|
+
include ::Pwnlib::Context
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@shellcraft = ::Pwnlib::Shellcraft::Shellcraft.instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_amd64
|
16
|
+
context.local(arch: 'amd64') do
|
17
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr_array('rcx', ['A']))
|
18
|
+
/* push argument array ["A\x00"] */
|
19
|
+
/* push "A\x00" */
|
20
|
+
push 0x41
|
21
|
+
xor ecx, ecx /* 0 */
|
22
|
+
push rcx /* null terminate */
|
23
|
+
push 8
|
24
|
+
pop rcx
|
25
|
+
add rcx, rsp
|
26
|
+
push rcx /* "A\x00" */
|
27
|
+
mov rcx, rsp
|
28
|
+
EOS
|
29
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr_array('rsp', ['sh', '-c', 'echo pusheen']))
|
30
|
+
/* push argument array ["sh\x00", "-c\x00", "echo pusheen\x00"] */
|
31
|
+
/* push "sh\x00-c\x00echo pusheen\x00" */
|
32
|
+
push 0x1010101 ^ 0x6e65
|
33
|
+
xor dword ptr [rsp], 0x1010101
|
34
|
+
mov rax, 0x6568737570206f68
|
35
|
+
push rax
|
36
|
+
mov rax, 0x101010101010101
|
37
|
+
push rax
|
38
|
+
mov rax, 0x626401622c016972 /* 0x101010101010101 ^ 0x636500632d006873 */
|
39
|
+
xor [rsp], rax
|
40
|
+
xor esp, esp /* 0 */
|
41
|
+
push rsp /* null terminate */
|
42
|
+
push 0xe
|
43
|
+
pop rsp
|
44
|
+
add rsp, rsp
|
45
|
+
push rsp /* "echo pusheen\x00" */
|
46
|
+
push 0x13
|
47
|
+
pop rsp
|
48
|
+
add rsp, rsp
|
49
|
+
push rsp /* "-c\x00" */
|
50
|
+
push 0x18
|
51
|
+
pop rsp
|
52
|
+
add rsp, rsp
|
53
|
+
push rsp /* "sh\x00" */
|
54
|
+
/* moving rsp into rsp, but this is a no-op */
|
55
|
+
EOS
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_i386
|
60
|
+
context.local(arch: 'i386') do
|
61
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr_array('esp', ['sh', '-c', 'echo pusheen']))
|
62
|
+
/* push argument array ["sh\x00", "-c\x00", "echo pusheen\x00"] */
|
63
|
+
/* push "sh\x00-c\x00echo pusheen\x00" */
|
64
|
+
push 0x1010101
|
65
|
+
xor dword ptr [esp], 0x1016f64 /* 0x1010101 ^ 0x6e65 */
|
66
|
+
push 0x65687375
|
67
|
+
push 0x70206f68
|
68
|
+
push 0x1010101
|
69
|
+
xor dword ptr [esp], 0x62640162 /* 0x1010101 ^ 0x63650063 */
|
70
|
+
push 0x1010101
|
71
|
+
xor dword ptr [esp], 0x2c016972 /* 0x1010101 ^ 0x2d006873 */
|
72
|
+
xor esp, esp /* 0 */
|
73
|
+
push esp /* null terminate */
|
74
|
+
push 9 /* mov esp, '\n' */
|
75
|
+
pop esp
|
76
|
+
inc esp
|
77
|
+
add esp, esp
|
78
|
+
push esp /* "echo pusheen\x00" */
|
79
|
+
push 0xb
|
80
|
+
pop esp
|
81
|
+
add esp, esp
|
82
|
+
push esp /* "-c\x00" */
|
83
|
+
push 0xc
|
84
|
+
pop esp
|
85
|
+
add esp, esp
|
86
|
+
push esp /* "sh\x00" */
|
87
|
+
/* moving esp into esp, but this is a no-op */
|
88
|
+
EOS
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# encoding: ASCII-8BIT
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
require 'pwnlib/context'
|
6
|
+
require 'pwnlib/shellcraft/shellcraft'
|
7
|
+
|
8
|
+
class PushstrTest < MiniTest::Test
|
9
|
+
include ::Pwnlib::Context
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@shellcraft = ::Pwnlib::Shellcraft::Shellcraft.instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_amd64
|
16
|
+
context.local(arch: 'amd64') do
|
17
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('A'))
|
18
|
+
/* push "A\x00" */
|
19
|
+
push 0x41
|
20
|
+
EOS
|
21
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr("\n"))
|
22
|
+
/* push "\n\x00" */
|
23
|
+
push 0xb
|
24
|
+
dec byte ptr [rsp]
|
25
|
+
EOS
|
26
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('A' * 4))
|
27
|
+
/* push "AAAA\x00" */
|
28
|
+
push 0x41414141
|
29
|
+
EOS
|
30
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('A' * 8))
|
31
|
+
/* push "AAAAAAAA\x00" */
|
32
|
+
push 1
|
33
|
+
dec byte ptr [rsp]
|
34
|
+
mov rax, 0x4141414141414141
|
35
|
+
push rax
|
36
|
+
EOS
|
37
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('A' * 8, append_null: false))
|
38
|
+
/* push "AAAAAAAA" */
|
39
|
+
mov rax, 0x4141414141414141
|
40
|
+
push rax
|
41
|
+
EOS
|
42
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr("\n" * 4))
|
43
|
+
/* push "\n\n\n\n\x00" */
|
44
|
+
push 0x1010101 ^ 0xa0a0a0a
|
45
|
+
xor dword ptr [rsp], 0x1010101
|
46
|
+
EOS
|
47
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('/bin/sh'))
|
48
|
+
/* push "/bin/sh\x00" */
|
49
|
+
mov rax, 0x101010101010101
|
50
|
+
push rax
|
51
|
+
mov rax, 0x169722e6f68632e /* 0x101010101010101 ^ 0x68732f6e69622f */
|
52
|
+
xor [rsp], rax
|
53
|
+
EOS
|
54
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr("\x00\xff\xff\xff\xff\xff\xff\xff", append_null: false))
|
55
|
+
/* push "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF" */
|
56
|
+
mov rax, 0x101010101010101
|
57
|
+
push rax
|
58
|
+
mov rax, -0x1010101010101ff /* 0x101010101010101 ^ -0x100 */
|
59
|
+
xor [rsp], rax
|
60
|
+
EOS
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_i386
|
65
|
+
context.local(arch: 'i386') do
|
66
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('A'))
|
67
|
+
/* push "A\x00" */
|
68
|
+
push 0x41
|
69
|
+
EOS
|
70
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr("\n"))
|
71
|
+
/* push "\n\x00" */
|
72
|
+
push 0xb
|
73
|
+
dec byte ptr [esp]
|
74
|
+
EOS
|
75
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('A' * 4))
|
76
|
+
/* push "AAAA\x00" */
|
77
|
+
push 1
|
78
|
+
dec byte ptr [esp]
|
79
|
+
push 0x41414141
|
80
|
+
EOS
|
81
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('A' * 8))
|
82
|
+
/* push "AAAAAAAA\x00" */
|
83
|
+
push 1
|
84
|
+
dec byte ptr [esp]
|
85
|
+
push 0x41414141
|
86
|
+
push 0x41414141
|
87
|
+
EOS
|
88
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('A' * 8, append_null: false))
|
89
|
+
/* push "AAAAAAAA" */
|
90
|
+
push 0x41414141
|
91
|
+
push 0x41414141
|
92
|
+
EOS
|
93
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr("\n" * 4))
|
94
|
+
/* push "\n\n\n\n\x00" */
|
95
|
+
push 1
|
96
|
+
dec byte ptr [esp]
|
97
|
+
push 0x1010101
|
98
|
+
xor dword ptr [esp], 0xb0b0b0b /* 0x1010101 ^ 0xa0a0a0a */
|
99
|
+
EOS
|
100
|
+
assert_equal(<<-'EOS', @shellcraft.pushstr('/bin/sh'))
|
101
|
+
/* push "/bin/sh\x00" */
|
102
|
+
push 0x1010101
|
103
|
+
xor dword ptr [esp], 0x169722e /* 0x1010101 ^ 0x68732f */
|
104
|
+
push 0x6e69622f
|
105
|
+
EOS
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|