pwntools 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +88 -11
  3. data/Rakefile +5 -1
  4. data/lib/pwn.rb +9 -7
  5. data/lib/pwnlib/abi.rb +60 -0
  6. data/lib/pwnlib/asm.rb +146 -0
  7. data/lib/pwnlib/constants/constant.rb +16 -2
  8. data/lib/pwnlib/constants/constants.rb +35 -19
  9. data/lib/pwnlib/constants/linux/amd64.rb +30 -1
  10. data/lib/pwnlib/context.rb +25 -17
  11. data/lib/pwnlib/dynelf.rb +117 -54
  12. data/lib/pwnlib/elf/elf.rb +267 -0
  13. data/lib/pwnlib/ext/helper.rb +4 -4
  14. data/lib/pwnlib/logger.rb +87 -0
  15. data/lib/pwnlib/memleak.rb +58 -29
  16. data/lib/pwnlib/pwn.rb +19 -8
  17. data/lib/pwnlib/reg_sort.rb +102 -108
  18. data/lib/pwnlib/shellcraft/generators/amd64/common/common.rb +14 -0
  19. data/lib/pwnlib/shellcraft/generators/amd64/common/infloop.rb +17 -0
  20. data/lib/pwnlib/shellcraft/generators/amd64/common/memcpy.rb +31 -0
  21. data/lib/pwnlib/shellcraft/generators/amd64/common/mov.rb +127 -0
  22. data/lib/pwnlib/shellcraft/generators/amd64/common/nop.rb +16 -0
  23. data/lib/pwnlib/shellcraft/generators/amd64/common/popad.rb +27 -0
  24. data/lib/pwnlib/shellcraft/generators/amd64/common/pushstr.rb +64 -0
  25. data/lib/pwnlib/shellcraft/generators/amd64/common/pushstr_array.rb +19 -0
  26. data/lib/pwnlib/shellcraft/generators/amd64/common/ret.rb +32 -0
  27. data/lib/pwnlib/shellcraft/generators/amd64/common/setregs.rb +19 -0
  28. data/lib/pwnlib/shellcraft/generators/amd64/linux/execve.rb +21 -0
  29. data/lib/pwnlib/shellcraft/generators/amd64/linux/linux.rb +14 -0
  30. data/lib/pwnlib/shellcraft/generators/amd64/linux/ls.rb +19 -0
  31. data/lib/pwnlib/shellcraft/generators/amd64/linux/sh.rb +19 -0
  32. data/lib/pwnlib/shellcraft/generators/amd64/linux/syscall.rb +21 -0
  33. data/lib/pwnlib/shellcraft/generators/helper.rb +106 -0
  34. data/lib/pwnlib/shellcraft/generators/i386/common/common.rb +14 -0
  35. data/lib/pwnlib/shellcraft/generators/i386/common/infloop.rb +17 -0
  36. data/lib/pwnlib/shellcraft/generators/i386/common/mov.rb +90 -0
  37. data/lib/pwnlib/shellcraft/generators/i386/common/nop.rb +16 -0
  38. data/lib/pwnlib/shellcraft/generators/i386/common/pushstr.rb +39 -0
  39. data/lib/pwnlib/shellcraft/generators/i386/common/pushstr_array.rb +19 -0
  40. data/lib/pwnlib/shellcraft/generators/i386/common/setregs.rb +19 -0
  41. data/lib/pwnlib/shellcraft/generators/i386/linux/execve.rb +19 -0
  42. data/lib/pwnlib/shellcraft/generators/i386/linux/linux.rb +14 -0
  43. data/lib/pwnlib/shellcraft/generators/i386/linux/ls.rb +19 -0
  44. data/lib/pwnlib/shellcraft/generators/i386/linux/sh.rb +19 -0
  45. data/lib/pwnlib/shellcraft/generators/i386/linux/syscall.rb +19 -0
  46. data/lib/pwnlib/shellcraft/generators/x86/common/common.rb +26 -0
  47. data/lib/pwnlib/shellcraft/generators/x86/common/infloop.rb +22 -0
  48. data/lib/pwnlib/shellcraft/generators/x86/common/mov.rb +15 -0
  49. data/lib/pwnlib/shellcraft/generators/x86/common/pushstr.rb +15 -0
  50. data/lib/pwnlib/shellcraft/generators/x86/common/pushstr_array.rb +85 -0
  51. data/lib/pwnlib/shellcraft/generators/x86/common/setregs.rb +82 -0
  52. data/lib/pwnlib/shellcraft/generators/x86/linux/execve.rb +69 -0
  53. data/lib/pwnlib/shellcraft/generators/x86/linux/linux.rb +14 -0
  54. data/lib/pwnlib/shellcraft/generators/x86/linux/ls.rb +66 -0
  55. data/lib/pwnlib/shellcraft/generators/x86/linux/sh.rb +52 -0
  56. data/lib/pwnlib/shellcraft/generators/x86/linux/syscall.rb +52 -0
  57. data/lib/pwnlib/shellcraft/registers.rb +145 -0
  58. data/lib/pwnlib/shellcraft/shellcraft.rb +67 -0
  59. data/lib/pwnlib/timer.rb +60 -0
  60. data/lib/pwnlib/tubes/buffer.rb +96 -0
  61. data/lib/pwnlib/tubes/sock.rb +95 -0
  62. data/lib/pwnlib/tubes/tube.rb +270 -0
  63. data/lib/pwnlib/util/cyclic.rb +95 -94
  64. data/lib/pwnlib/util/fiddling.rb +256 -220
  65. data/lib/pwnlib/util/getdents.rb +83 -0
  66. data/lib/pwnlib/util/hexdump.rb +109 -108
  67. data/lib/pwnlib/util/lists.rb +55 -0
  68. data/lib/pwnlib/util/packing.rb +226 -228
  69. data/lib/pwnlib/util/ruby.rb +18 -0
  70. data/lib/pwnlib/version.rb +2 -1
  71. data/test/abi_test.rb +21 -0
  72. data/test/asm_test.rb +104 -0
  73. data/test/constants/constant_test.rb +1 -0
  74. data/test/constants/constants_test.rb +4 -2
  75. data/test/context_test.rb +1 -0
  76. data/test/data/echo.rb +20 -0
  77. data/test/data/elfs/Makefile +22 -0
  78. data/test/data/elfs/amd64.frelro.elf +0 -0
  79. data/test/data/elfs/amd64.frelro.pie.elf +0 -0
  80. data/test/data/elfs/amd64.nrelro.elf +0 -0
  81. data/test/data/elfs/amd64.prelro.elf +0 -0
  82. data/test/data/elfs/i386.frelro.pie.elf +0 -0
  83. data/test/data/elfs/i386.prelro.elf +0 -0
  84. data/test/data/elfs/source.cpp +19 -0
  85. data/test/data/flag +1 -0
  86. data/test/data/lib32/ld.so.2 +0 -0
  87. data/test/data/lib32/libc.so.6 +0 -0
  88. data/test/data/lib64/ld.so.2 +0 -0
  89. data/test/data/lib64/libc.so.6 +0 -0
  90. data/test/dynelf_test.rb +59 -24
  91. data/test/elf/elf_test.rb +120 -0
  92. data/test/ext_test.rb +3 -2
  93. data/test/files/use_pwnlib.rb +1 -1
  94. data/test/logger_test.rb +61 -0
  95. data/test/memleak_test.rb +4 -33
  96. data/test/reg_sort_test.rb +3 -1
  97. data/test/shellcraft/infloop_test.rb +26 -0
  98. data/test/shellcraft/linux/ls_test.rb +108 -0
  99. data/test/shellcraft/linux/sh_test.rb +119 -0
  100. data/test/shellcraft/linux/syscalls/execve_test.rb +136 -0
  101. data/test/shellcraft/linux/syscalls/syscall_test.rb +83 -0
  102. data/test/shellcraft/memcpy_test.rb +35 -0
  103. data/test/shellcraft/mov_test.rb +98 -0
  104. data/test/shellcraft/nop_test.rb +26 -0
  105. data/test/shellcraft/popad_test.rb +29 -0
  106. data/test/shellcraft/pushstr_array_test.rb +91 -0
  107. data/test/shellcraft/pushstr_test.rb +108 -0
  108. data/test/shellcraft/registers_test.rb +32 -0
  109. data/test/shellcraft/ret_test.rb +30 -0
  110. data/test/shellcraft/setregs_test.rb +62 -0
  111. data/test/shellcraft/shellcraft_test.rb +28 -0
  112. data/test/test_helper.rb +12 -1
  113. data/test/timer_test.rb +23 -0
  114. data/test/tubes/buffer_test.rb +45 -0
  115. data/test/tubes/sock_test.rb +68 -0
  116. data/test/tubes/tube_test.rb +241 -0
  117. data/test/util/cyclic_test.rb +2 -1
  118. data/test/util/fiddling_test.rb +2 -1
  119. data/test/util/getdents_test.rb +32 -0
  120. data/test/util/hexdump_test.rb +7 -9
  121. data/test/util/lists_test.rb +21 -0
  122. data/test/util/packing_test.rb +4 -3
  123. metadata +215 -25
@@ -0,0 +1,14 @@
1
+ require 'pwnlib/shellcraft/generators/helper'
2
+
3
+ module Pwnlib
4
+ module Shellcraft
5
+ module Generators
6
+ module Amd64
7
+ # For non os-related methods.
8
+ module Common
9
+ extend ::Pwnlib::Shellcraft::Generators::Helper
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
2
+ require 'pwnlib/shellcraft/generators/x86/common/infloop'
3
+
4
+ module Pwnlib
5
+ module Shellcraft
6
+ module Generators
7
+ module Amd64
8
+ module Common
9
+ # See {X86::Common#infloop}.
10
+ def infloop
11
+ cat Generators::X86::Common.infloop
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
4
+ require 'pwnlib/shellcraft/generators/amd64/common/setregs'
5
+
6
+ module Pwnlib
7
+ module Shellcraft
8
+ module Generators
9
+ module Amd64
10
+ module Common
11
+ # Like +memcpy+ in glibc.
12
+ #
13
+ # Copy +n+ bytes from +src+ to +dst+.
14
+ #
15
+ # @param [String, Symbol, Integer] dst
16
+ # Destination.
17
+ # @param [String, Symbol, Integer] src
18
+ # Source to be copied.
19
+ # @param [Integer] n
20
+ # The number of bytes to be copied.
21
+ def memcpy(dst, src, n)
22
+ cat "/* memcpy(#{pretty(dst)}, #{pretty(src)}, #{pretty(n)}) */"
23
+ cat 'cld'
24
+ cat Common.setregs(rdi: dst, rsi: src, rcx: n)
25
+ cat 'rep movsb'
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,127 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
4
+
5
+ module Pwnlib
6
+ module Shellcraft
7
+ module Generators
8
+ module Amd64
9
+ module Common
10
+ # Move +src+ into +dst+ without newlines and null bytes.
11
+ #
12
+ # @param [String, Symbol] dst
13
+ # Register's name.
14
+ # @param [String, Symbol, Integer] src
15
+ # Register's name or immediate value.
16
+ # @param [Boolean] stack_allowed
17
+ # If equals to +false+, generated assembly code would not use stack-related operations.
18
+ # But beware of without stack-related operations the generated code length is longer.
19
+ #
20
+ # @example
21
+ # context.arch = 'amd64'
22
+ # shellcraft.mov('rdi', 'ax')
23
+ # #=> " movzx edi, ax\n"
24
+ # @example
25
+ # context.arch = 'amd64'
26
+ # puts shellcraft.mov('rax', 10)
27
+ # # push 9 /* mov eax, '\n' */
28
+ # # pop rax
29
+ # # inc eax
30
+ # #=> nil
31
+ # @example
32
+ # context.arch = 'amd64'
33
+ # puts shellcraft.mov('rax', 10, stack_allowed: false)
34
+ # # mov eax, 0x1010101
35
+ # # xor eax, 0x101010b /* 0xa == 0x1010101 ^ 0x101010b */
36
+ # #=> nil
37
+ def mov(dst, src, stack_allowed: true)
38
+ raise ArgumentError, "#{dst} is not a register" unless register?(dst)
39
+ dst = get_register(dst)
40
+ if register?(src)
41
+ src = get_register(src)
42
+ if dst.size < src.size && !dst.bigger.include?(src.name)
43
+ raise ArgumentError, "cannot mov #{dst}, #{src}: dst is smaller than src"
44
+ end
45
+ # Downgrade our register choice if possible.
46
+ # Opcodes for operating on 32-bit registers are always (?) shorter.
47
+ dst = get_register(dst.native32) if dst.size == 64 && src.size <= 32
48
+ else
49
+ context.local(arch: 'amd64') { src = evaluate(src) }
50
+ raise ArgumentError, format('cannot mov %s, %d: dst is smaller than src', dst, src) unless dst.fits(src)
51
+ orig_dst = dst
52
+ dst = get_register(dst.native32) if dst.size == 64 && bits_required(src) <= 32
53
+
54
+ # Calculate the packed version.
55
+ srcp = pack(src & ((1 << dst.size) - 1), bits: dst.size)
56
+
57
+ # Calculate the unsigned and signed versions.
58
+ srcu = unpack(srcp, bits: dst.size, signed: false)
59
+ # N.B.: We may have downsized the register for e.g. mov('rax', 0xffffffff)
60
+ # In this case, srcp is now a 4-byte packed value, which will expand to "-1", which isn't correct.
61
+ srcs = orig_dst.size == dst.size ? unpack(srcp, bits: dst.size, signed: true) : src
62
+ end
63
+ if register?(src)
64
+ if src == dst || dst.bigger.include?(src.name)
65
+ cat "/* moving #{src} into #{dst}, but this is a no-op */"
66
+ elsif dst.size > src.size
67
+ cat "movzx #{dst}, #{src}"
68
+ else
69
+ cat "mov #{dst}, #{src}"
70
+ end
71
+ elsif src.is_a?(Numeric) # Constant or immi
72
+ xor = ->(reg) { "xor #{reg.xor}, #{reg.xor}" }
73
+ if src.zero?
74
+ # Special case for zeroes.
75
+ # XORing the 32-bit register clears the high 32 bits as well.
76
+ cat "xor #{dst}, #{dst} /* #{src} */"
77
+ elsif stack_allowed && [32, 64].include?(dst.size) && src == 10
78
+ cat "push 9 /* mov #{dst}, '\\n' */"
79
+ cat "pop #{dst.native64}"
80
+ cat "inc #{dst}"
81
+ elsif stack_allowed && [32, 64].include?(dst.size) && (-2**7 <= srcs && srcs < 2**7) && okay(srcp[0])
82
+ # It's smaller to PUSH and POP small sign-extended values than to directly move them into various
83
+ # registers.
84
+ #
85
+ # 6aff58 push -1; pop rax
86
+ # 48c7c0ffffffff mov rax, -1
87
+ cat "push #{pretty(src)}"
88
+ cat "pop #{dst.native64}"
89
+ elsif okay(srcp)
90
+ # Easy case. This implies that the register size and value are the same.
91
+ cat "mov #{dst}, #{pretty(src)}"
92
+ elsif srcu < 2**8 && okay(srcp[0]) && dst.sizes.include?(8) # Move 8-bit value into register.
93
+ cat xor[dst]
94
+ cat "mov #{dst.sizes[8]}, #{pretty(src)}"
95
+ elsif srcu == srcu & 0xff00 && okay(srcp[1]) && dst.ff00
96
+ # Target value is a 16-bit value with no data in the low 8 bits, we can use the 'AH' style register.
97
+ cat xor[dst]
98
+ cat "mov #{dst.ff00}, #{pretty(src)} >> 8"
99
+ elsif srcu < 2**16 && okay(srcp[0, 2]) # Target value is a 16-bit value, use a 16-bit mov.
100
+ cat xor[dst]
101
+ cat "mov #{dst.sizes[16]}, #{pretty(src)}"
102
+ else # All else has failed. Use some XOR magic to move things around.
103
+ a, b = xor_pair(srcp, avoid: "\x00\n")
104
+ a = hex(unpack(a, bits: dst.size))
105
+ b = hex(unpack(b, bits: dst.size))
106
+ if dst.size != 64
107
+ # There's no XOR REG, IMM64 but we can take the easy route for smaller registers.
108
+ cat "mov #{dst}, #{a}"
109
+ cat "xor #{dst}, #{b} /* #{hex(src)} == #{a} ^ #{b} */"
110
+ elsif stack_allowed
111
+ # However, we can PUSH IMM64 and then perform the XOR that way at the top of the stack.
112
+ cat "mov #{dst}, #{a}"
113
+ cat "push #{dst}"
114
+ cat "mov #{dst}, #{b}"
115
+ cat "xor [rsp], #{dst} /* #{hex(src)} == #{a} ^ #{b} */"
116
+ cat "pop #{dst}"
117
+ else
118
+ raise ArgumentError, "Cannot put #{pretty(src)} into '#{dst}' without using stack."
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,16 @@
1
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
2
+
3
+ module Pwnlib
4
+ module Shellcraft
5
+ module Generators
6
+ module Amd64
7
+ module Common
8
+ # A no-op instruction.
9
+ def nop
10
+ cat 'nop'
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
4
+
5
+ module Pwnlib
6
+ module Shellcraft
7
+ module Generators
8
+ module Amd64
9
+ module Common
10
+ # Pop all of the registers onto the stack which i386 +popad+ does.
11
+ def popad
12
+ cat <<-EOS
13
+ pop rdi
14
+ pop rsi
15
+ pop rbp
16
+ pop rbx /* add rsp, 8 */
17
+ pop rbx
18
+ pop rdx
19
+ pop rcx
20
+ pop rax
21
+ EOS
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,64 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
4
+
5
+ module Pwnlib
6
+ module Shellcraft
7
+ module Generators
8
+ module Amd64
9
+ module Common
10
+ # Push a string to stack.
11
+ #
12
+ # @param [String] str
13
+ # String to be pushed.
14
+ # @param [Boolean] append_null
15
+ # If need to append a null byte in the end of +str+.
16
+ #
17
+ # @example
18
+ # context.arch = 'amd64'
19
+ # puts shellcraft.pushstr('pusheen')
20
+ # # /* push "pusheen\x00" */
21
+ # # mov rax, 0x101010101010101
22
+ # # push rax
23
+ # # mov rax, 0x101010101010101 ^ 0x6e656568737570
24
+ # # xor [rsp], rax
25
+ # #=> nil
26
+ def pushstr(str, append_null: true)
27
+ # This will not affect callee's +str+.
28
+ str += "\x00" if append_null && !str.end_with?("\x00")
29
+ return if str.empty?
30
+ padding = str[-1].ord >= 128 ? "\xff" : "\x00"
31
+ cat "/* push #{str.inspect} */"
32
+ group(8, str, underfull_action: :fill, fill_value: padding).reverse_each do |word|
33
+ sign = u64(word, endian: 'little', signed: true)
34
+ sign32 = u32(word[0, 4], bits: 32, endian: 'little', signed: true)
35
+ if [0, 0xa].include?(sign) # simple forbidden byte case
36
+ cat "push #{pretty(sign + 1)}"
37
+ cat 'dec byte ptr [rsp]'
38
+ elsif sign >= -0x80 && sign <= 0x7f && okay(word[0]) # simple byte case
39
+ cat "push #{pretty(sign)}"
40
+ elsif sign >= -0x80000000 && sign <= 0x7fffffff && okay(word[0, 4])
41
+ # simple 32bit without forbidden byte
42
+ cat "push #{pretty(sign)}"
43
+ elsif okay(word)
44
+ cat "mov rax, #{pretty(sign)}"
45
+ cat 'push rax'
46
+ elsif sign32 > 0 && word[4, 4] == "\x00" * 4
47
+ # The high 4 byte of word are all zeros, so we can use +xor dword ptr [rsp]+.
48
+ a = u32(xor_pair(word[0, 4]).first, endian: 'little', signed: true)
49
+ cat "push #{pretty(a)} ^ #{pretty(sign)}"
50
+ cat "xor dword ptr [rsp], #{pretty(a)}"
51
+ else
52
+ a = u64(xor_pair(word).first, endian: 'little', signed: false)
53
+ cat "mov rax, #{pretty(a)}"
54
+ cat 'push rax'
55
+ cat "mov rax, #{pretty(a ^ sign)} /* #{pretty(a)} ^ #{pretty(sign)} */"
56
+ cat 'xor [rsp], rax'
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,19 @@
1
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
2
+ require 'pwnlib/shellcraft/generators/x86/common/pushstr_array'
3
+
4
+ module Pwnlib
5
+ module Shellcraft
6
+ module Generators
7
+ module Amd64
8
+ module Common
9
+ # See {Pwnlib::Shellcraft::Generators::X86::Common#pushstr_array}.
10
+ def pushstr_array(*args)
11
+ context.local(arch: 'amd64') do
12
+ cat X86::Common.pushstr_array(*args)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
4
+ require 'pwnlib/shellcraft/generators/amd64/common/mov'
5
+
6
+ module Pwnlib
7
+ module Shellcraft
8
+ module Generators
9
+ module Amd64
10
+ module Common
11
+ # Instruction return.
12
+ #
13
+ # @param [String, Symbol, Integer] return_value
14
+ # Set the return value.
15
+ # Can be name of a register or an immediate value.
16
+ # +nil+ for not set return value.
17
+ #
18
+ # @example
19
+ # context.arch = 'amd64'
20
+ # shellcraft.ret
21
+ # #=> " ret"
22
+ # shellcraft.ret(:rdi)
23
+ # #=> " mov rax, rdi\n ret\n"
24
+ def ret(return_value = nil)
25
+ cat Common.mov('rax', return_value) if return_value
26
+ cat 'ret'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ require 'pwnlib/shellcraft/generators/amd64/common/common'
2
+ require 'pwnlib/shellcraft/generators/x86/common/setregs'
3
+
4
+ module Pwnlib
5
+ module Shellcraft
6
+ module Generators
7
+ module Amd64
8
+ module Common
9
+ # See {Generators::X86::Common#setregs}.
10
+ def setregs(*args)
11
+ context.local(arch: 'amd64') do
12
+ cat X86::Common.setregs(*args)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'pwnlib/shellcraft/generators/amd64/linux/linux'
4
+ require 'pwnlib/shellcraft/generators/x86/linux/execve'
5
+
6
+ module Pwnlib
7
+ module Shellcraft
8
+ module Generators
9
+ module Amd64
10
+ module Linux
11
+ # See {Generators::X86::Linux#execve}.
12
+ def execve(*arguments)
13
+ context.local(arch: 'amd64') do
14
+ cat X86::Linux.execve(*arguments)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ require 'pwnlib/shellcraft/generators/helper'
2
+
3
+ module Pwnlib
4
+ module Shellcraft
5
+ module Generators
6
+ module Amd64
7
+ # For os-related methods.
8
+ module Linux
9
+ extend ::Pwnlib::Shellcraft::Generators::Helper
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ require 'pwnlib/shellcraft/generators/amd64/linux/linux'
2
+ require 'pwnlib/shellcraft/generators/x86/linux/ls'
3
+
4
+ module Pwnlib
5
+ module Shellcraft
6
+ module Generators
7
+ module Amd64
8
+ module Linux
9
+ # See #{Generators::X86::Linux#ls}.
10
+ def ls(*args)
11
+ context.local(arch: 'amd64') do
12
+ cat X86::Linux.ls(*args)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'pwnlib/shellcraft/generators/amd64/linux/linux'
2
+ require 'pwnlib/shellcraft/generators/x86/linux/sh'
3
+
4
+ module Pwnlib
5
+ module Shellcraft
6
+ module Generators
7
+ module Amd64
8
+ module Linux
9
+ # See #{Generators::X86::Linux#sh}.
10
+ def sh(*args)
11
+ context.local(arch: 'amd64') do
12
+ cat X86::Linux.sh(*args)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end