pwntools 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -3
  3. data/lib/pwn.rb +1 -0
  4. data/lib/pwnlib/abi.rb +1 -0
  5. data/lib/pwnlib/asm.rb +83 -42
  6. data/lib/pwnlib/constants/constant.rb +4 -1
  7. data/lib/pwnlib/constants/constants.rb +3 -0
  8. data/lib/pwnlib/constants/linux/amd64.rb +2 -0
  9. data/lib/pwnlib/constants/linux/i386.rb +2 -0
  10. data/lib/pwnlib/context.rb +10 -1
  11. data/lib/pwnlib/dynelf.rb +7 -2
  12. data/lib/pwnlib/elf/elf.rb +79 -6
  13. data/lib/pwnlib/errors.rb +3 -2
  14. data/lib/pwnlib/ext/array.rb +2 -1
  15. data/lib/pwnlib/ext/helper.rb +3 -2
  16. data/lib/pwnlib/ext/integer.rb +2 -1
  17. data/lib/pwnlib/ext/string.rb +3 -2
  18. data/lib/pwnlib/logger.rb +21 -1
  19. data/lib/pwnlib/memleak.rb +1 -0
  20. data/lib/pwnlib/pwn.rb +5 -1
  21. data/lib/pwnlib/reg_sort.rb +5 -0
  22. data/lib/pwnlib/runner.rb +53 -0
  23. data/lib/pwnlib/shellcraft/generators/amd64/common/common.rb +2 -0
  24. data/lib/pwnlib/shellcraft/generators/amd64/common/infloop.rb +1 -0
  25. data/lib/pwnlib/shellcraft/generators/amd64/common/memcpy.rb +5 -1
  26. data/lib/pwnlib/shellcraft/generators/amd64/common/mov.rb +4 -0
  27. data/lib/pwnlib/shellcraft/generators/amd64/common/nop.rb +2 -0
  28. data/lib/pwnlib/shellcraft/generators/amd64/common/popad.rb +1 -0
  29. data/lib/pwnlib/shellcraft/generators/amd64/common/pushstr.rb +3 -1
  30. data/lib/pwnlib/shellcraft/generators/amd64/common/pushstr_array.rb +1 -0
  31. data/lib/pwnlib/shellcraft/generators/amd64/common/ret.rb +1 -0
  32. data/lib/pwnlib/shellcraft/generators/amd64/common/setregs.rb +3 -2
  33. data/lib/pwnlib/shellcraft/generators/amd64/linux/cat.rb +3 -2
  34. data/lib/pwnlib/shellcraft/generators/amd64/linux/execve.rb +1 -0
  35. data/lib/pwnlib/shellcraft/generators/amd64/linux/exit.rb +1 -0
  36. data/lib/pwnlib/shellcraft/generators/amd64/linux/linux.rb +2 -0
  37. data/lib/pwnlib/shellcraft/generators/amd64/linux/ls.rb +1 -0
  38. data/lib/pwnlib/shellcraft/generators/amd64/linux/open.rb +1 -0
  39. data/lib/pwnlib/shellcraft/generators/amd64/linux/sh.rb +3 -2
  40. data/lib/pwnlib/shellcraft/generators/amd64/linux/sleep.rb +24 -0
  41. data/lib/pwnlib/shellcraft/generators/amd64/linux/syscall.rb +1 -0
  42. data/lib/pwnlib/shellcraft/generators/helper.rb +11 -2
  43. data/lib/pwnlib/shellcraft/generators/i386/common/common.rb +2 -0
  44. data/lib/pwnlib/shellcraft/generators/i386/common/infloop.rb +1 -0
  45. data/lib/pwnlib/shellcraft/generators/i386/common/memcpy.rb +34 -0
  46. data/lib/pwnlib/shellcraft/generators/i386/common/mov.rb +3 -0
  47. data/lib/pwnlib/shellcraft/generators/i386/common/nop.rb +2 -0
  48. data/lib/pwnlib/shellcraft/generators/i386/common/pushstr.rb +2 -0
  49. data/lib/pwnlib/shellcraft/generators/i386/common/pushstr_array.rb +1 -0
  50. data/lib/pwnlib/shellcraft/generators/i386/common/setregs.rb +3 -2
  51. data/lib/pwnlib/shellcraft/generators/i386/linux/cat.rb +3 -2
  52. data/lib/pwnlib/shellcraft/generators/i386/linux/execve.rb +1 -0
  53. data/lib/pwnlib/shellcraft/generators/i386/linux/exit.rb +1 -0
  54. data/lib/pwnlib/shellcraft/generators/i386/linux/linux.rb +2 -0
  55. data/lib/pwnlib/shellcraft/generators/i386/linux/ls.rb +1 -0
  56. data/lib/pwnlib/shellcraft/generators/i386/linux/open.rb +1 -0
  57. data/lib/pwnlib/shellcraft/generators/i386/linux/sh.rb +3 -2
  58. data/lib/pwnlib/shellcraft/generators/i386/linux/sleep.rb +24 -0
  59. data/lib/pwnlib/shellcraft/generators/i386/linux/syscall.rb +1 -0
  60. data/lib/pwnlib/shellcraft/generators/x86/common/common.rb +5 -3
  61. data/lib/pwnlib/shellcraft/generators/x86/common/infloop.rb +2 -0
  62. data/lib/pwnlib/shellcraft/generators/x86/common/memcpy.rb +17 -0
  63. data/lib/pwnlib/shellcraft/generators/x86/common/mov.rb +2 -0
  64. data/lib/pwnlib/shellcraft/generators/x86/common/pushstr.rb +2 -0
  65. data/lib/pwnlib/shellcraft/generators/x86/common/pushstr_array.rb +1 -0
  66. data/lib/pwnlib/shellcraft/generators/x86/common/setregs.rb +8 -6
  67. data/lib/pwnlib/shellcraft/generators/x86/linux/cat.rb +1 -0
  68. data/lib/pwnlib/shellcraft/generators/x86/linux/execve.rb +3 -0
  69. data/lib/pwnlib/shellcraft/generators/x86/linux/exit.rb +1 -0
  70. data/lib/pwnlib/shellcraft/generators/x86/linux/linux.rb +2 -0
  71. data/lib/pwnlib/shellcraft/generators/x86/linux/ls.rb +1 -0
  72. data/lib/pwnlib/shellcraft/generators/x86/linux/open.rb +1 -0
  73. data/lib/pwnlib/shellcraft/generators/x86/linux/sh.rb +1 -0
  74. data/lib/pwnlib/shellcraft/generators/x86/linux/sleep.rb +52 -0
  75. data/lib/pwnlib/shellcraft/generators/x86/linux/syscall.rb +10 -10
  76. data/lib/pwnlib/shellcraft/registers.rb +5 -1
  77. data/lib/pwnlib/shellcraft/shellcraft.rb +8 -3
  78. data/lib/pwnlib/timer.rb +6 -2
  79. data/lib/pwnlib/tubes/buffer.rb +4 -1
  80. data/lib/pwnlib/tubes/process.rb +2 -0
  81. data/lib/pwnlib/tubes/serialtube.rb +3 -1
  82. data/lib/pwnlib/tubes/sock.rb +7 -1
  83. data/lib/pwnlib/tubes/tube.rb +23 -3
  84. data/lib/pwnlib/ui.rb +21 -0
  85. data/lib/pwnlib/util/cyclic.rb +2 -0
  86. data/lib/pwnlib/util/fiddling.rb +37 -5
  87. data/lib/pwnlib/util/getdents.rb +1 -0
  88. data/lib/pwnlib/util/hexdump.rb +8 -5
  89. data/lib/pwnlib/util/lists.rb +3 -0
  90. data/lib/pwnlib/util/packing.rb +5 -2
  91. data/lib/pwnlib/util/ruby.rb +1 -0
  92. data/lib/pwnlib/version.rb +2 -1
  93. data/test/abi_test.rb +1 -0
  94. data/test/asm_test.rb +75 -85
  95. data/test/constants/constant_test.rb +1 -0
  96. data/test/constants/constants_test.rb +1 -0
  97. data/test/context_test.rb +1 -0
  98. data/test/data/assembly/aarch64.s +19 -0
  99. data/test/data/assembly/amd64.s +21 -0
  100. data/test/data/assembly/arm.s +9 -0
  101. data/test/data/assembly/i386.s +21 -0
  102. data/test/data/assembly/mips.s +16 -0
  103. data/test/data/assembly/mips64.s +6 -0
  104. data/test/data/assembly/powerpc.s +18 -0
  105. data/test/data/assembly/powerpc64.s +36 -0
  106. data/test/data/assembly/sparc.s +33 -0
  107. data/test/data/assembly/sparc64.s +5 -0
  108. data/test/data/assembly/thumb.s +37 -0
  109. data/test/data/echo.rb +1 -0
  110. data/test/dynelf_test.rb +3 -1
  111. data/test/elf/elf_test.rb +18 -0
  112. data/test/ext_test.rb +1 -0
  113. data/test/files/use_pwn.rb +1 -0
  114. data/test/files/use_pwnlib.rb +1 -0
  115. data/test/full_file_test.rb +6 -0
  116. data/test/logger_test.rb +24 -3
  117. data/test/memleak_test.rb +1 -0
  118. data/test/reg_sort_test.rb +1 -0
  119. data/test/runner_test.rb +32 -0
  120. data/test/shellcraft/infloop_test.rb +1 -0
  121. data/test/shellcraft/linux/cat_test.rb +1 -0
  122. data/test/shellcraft/linux/ls_test.rb +1 -0
  123. data/test/shellcraft/linux/sh_test.rb +1 -0
  124. data/test/shellcraft/linux/sleep_test.rb +68 -0
  125. data/test/shellcraft/linux/syscalls/execve_test.rb +1 -0
  126. data/test/shellcraft/linux/syscalls/exit_test.rb +1 -0
  127. data/test/shellcraft/linux/syscalls/open_test.rb +1 -0
  128. data/test/shellcraft/linux/syscalls/syscall_test.rb +1 -0
  129. data/test/shellcraft/memcpy_test.rb +20 -5
  130. data/test/shellcraft/mov_test.rb +1 -0
  131. data/test/shellcraft/nop_test.rb +1 -0
  132. data/test/shellcraft/popad_test.rb +1 -0
  133. data/test/shellcraft/pushstr_array_test.rb +1 -0
  134. data/test/shellcraft/pushstr_test.rb +1 -0
  135. data/test/shellcraft/registers_test.rb +1 -0
  136. data/test/shellcraft/ret_test.rb +1 -0
  137. data/test/shellcraft/setregs_test.rb +9 -8
  138. data/test/shellcraft/shellcraft_test.rb +1 -0
  139. data/test/test_helper.rb +28 -0
  140. data/test/timer_test.rb +2 -1
  141. data/test/tubes/buffer_test.rb +1 -0
  142. data/test/tubes/process_test.rb +8 -2
  143. data/test/tubes/serialtube_test.rb +1 -4
  144. data/test/tubes/sock_test.rb +1 -0
  145. data/test/tubes/tube_test.rb +10 -1
  146. data/test/ui_test.rb +18 -0
  147. data/test/util/cyclic_test.rb +1 -0
  148. data/test/util/fiddling_test.rb +8 -0
  149. data/test/util/getdents_test.rb +1 -0
  150. data/test/util/hexdump_test.rb +2 -1
  151. data/test/util/lists_test.rb +1 -0
  152. data/test/util/packing_test.rb +3 -2
  153. metadata +119 -59
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -0,0 +1,68 @@
1
+ # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark'
5
+
6
+ require 'test_helper'
7
+
8
+ require 'pwnlib/context'
9
+ require 'pwnlib/runner'
10
+ require 'pwnlib/shellcraft/shellcraft'
11
+
12
+ class SleepTest < MiniTest::Test
13
+ include ::Pwnlib::Context
14
+
15
+ def setup
16
+ @shellcraft = ::Pwnlib::Shellcraft::Shellcraft.instance
17
+ end
18
+
19
+ def test_amd64
20
+ context.local(arch: :amd64) do
21
+ assert_equal(<<-'EOS', @shellcraft.sleep(10))
22
+ /* push "\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" */
23
+ push 1
24
+ dec byte ptr [rsp]
25
+ push 0xb
26
+ dec byte ptr [rsp]
27
+ /* call nanosleep("rsp", 0) */
28
+ push 0x23 /* (SYS_nanosleep) */
29
+ pop rax
30
+ mov rdi, rsp
31
+ xor esi, esi /* 0 */
32
+ syscall
33
+ add rsp, 16 /* recover rsp */
34
+ EOS
35
+ end
36
+ end
37
+
38
+ def test_i386
39
+ context.local(arch: :i386) do
40
+ assert_equal(<<-'EOS', @shellcraft.sleep(1 + 3e-9))
41
+ /* push "\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00" */
42
+ push 1
43
+ dec byte ptr [esp]
44
+ push 3
45
+ push 1
46
+ dec byte ptr [esp]
47
+ push 1
48
+ /* call nanosleep("esp", 0) */
49
+ xor eax, eax
50
+ mov al, 0xa2 /* (SYS_nanosleep) */
51
+ mov ebx, esp
52
+ xor ecx, ecx /* 0 */
53
+ int 0x80
54
+ add esp, 16 /* recover esp */
55
+ EOS
56
+ end
57
+ end
58
+
59
+ def test_run
60
+ linux_only
61
+
62
+ context.local(arch: :amd64) do
63
+ asm = @shellcraft.sleep(0.3) + @shellcraft.exit(0)
64
+ t = Benchmark.realtime { ::Pwnlib::Runner.run_assembly(asm).recvall }
65
+ assert_operator t, :>=, 0.3
66
+ end
67
+ end
68
+ end
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -22,12 +23,26 @@ class MemcpyTest < MiniTest::Test
22
23
  mov cl, 0xff
23
24
  rep movsb
24
25
  EOS
25
- assert_equal(<<-'EOS', @shellcraft.memcpy('rdi', 'rbx', 255))
26
- /* memcpy("rdi", "rbx", 0xff) */
26
+ assert_equal(<<-'EOS', @shellcraft.memcpy('rdi', 0x602020, 10))
27
+ /* memcpy("rdi", 0x602020, 0xa) */
27
28
  cld
28
- mov rsi, rbx
29
- xor ecx, ecx
30
- mov cl, 0xff
29
+ mov esi, 0x1010101
30
+ xor esi, 0x1612121 /* 0x602020 == 0x1010101 ^ 0x1612121 */
31
+ push 9 /* mov ecx, '\n' */
32
+ pop rcx
33
+ inc ecx
34
+ rep movsb
35
+ EOS
36
+ end
37
+ end
38
+
39
+ def test_i386
40
+ context.local(arch: :i386) do
41
+ assert_equal(<<-'EOS', @shellcraft.memcpy('eax', 'ebx', 'ecx'))
42
+ /* memcpy("eax", "ebx", "ecx") */
43
+ cld
44
+ mov edi, eax
45
+ mov esi, ebx
31
46
  rep movsb
32
47
  EOS
33
48
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -14,27 +15,27 @@ class SetregsTest < MiniTest::Test
14
15
 
15
16
  def test_amd64
16
17
  context.local(arch: 'amd64') do
17
- assert_equal(<<-'EOS', @shellcraft.setregs(rax: 1, rbx: 'rax'))
18
+ assert_equal(<<-'EOS', @shellcraft.setregs({ rax: 1, rbx: 'rax' }))
18
19
  mov rbx, rax
19
20
  push 1
20
21
  pop rax
21
22
  EOS
22
- assert_equal(<<-'EOS', @shellcraft.setregs(rax: 'SYS_write', rbx: 'rax'))
23
+ assert_equal(<<-'EOS', @shellcraft.setregs({ rax: 'SYS_write', rbx: 'rax' }))
23
24
  mov rbx, rax
24
25
  push 1 /* (SYS_write) */
25
26
  pop rax
26
27
  EOS
27
- assert_equal(<<-'EOS', @shellcraft.setregs(rax: 'rbx', rbx: 'rax', rcx: 'rbx'))
28
+ assert_equal(<<-'EOS', @shellcraft.setregs({ rax: 'rbx', rbx: 'rax', rcx: 'rbx' }))
28
29
  mov rcx, rbx
29
30
  xchg rax, rbx
30
31
  EOS
31
- assert_equal(<<-'EOS', @shellcraft.setregs(rax: 1, rdx: 0))
32
+ assert_equal(<<-'EOS', @shellcraft.setregs({ rax: 1, rdx: 0 }))
32
33
  push 1
33
34
  pop rax
34
35
  cdq /* rdx=0 */
35
36
  EOS
36
37
  # issue #50
37
- assert_equal(<<-'EOS', @shellcraft.setregs(rdi: :rax, rsi: :rdi))
38
+ assert_equal(<<-'EOS', @shellcraft.setregs({ rdi: :rax, rsi: :rdi }))
38
39
  mov rsi, rdi
39
40
  mov rdi, rax
40
41
  EOS
@@ -43,16 +44,16 @@ class SetregsTest < MiniTest::Test
43
44
 
44
45
  def test_i386
45
46
  context.local(arch: 'i386') do
46
- assert_equal(<<-EOS, @shellcraft.setregs(eax: 1, ebx: 'eax'))
47
+ assert_equal(<<-EOS, @shellcraft.setregs({ eax: 1, ebx: 'eax' }))
47
48
  mov ebx, eax
48
49
  push 1
49
50
  pop eax
50
51
  EOS
51
- assert_equal(<<-EOS, @shellcraft.setregs(eax: 'ebx', ebx: 'eax', ecx: 'ebx'))
52
+ assert_equal(<<-EOS, @shellcraft.setregs({ eax: 'ebx', ebx: 'eax', ecx: 'ebx' }))
52
53
  mov ecx, ebx
53
54
  xchg eax, ebx
54
55
  EOS
55
- assert_equal(<<-'EOS', @shellcraft.setregs(eax: 1, edx: 0))
56
+ assert_equal(<<-'EOS', @shellcraft.setregs({ eax: 1, edx: 0 }))
56
57
  push 1
57
58
  pop eax
58
59
  cdq /* edx=0 */
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rainbow'
2
4
  require 'simplecov'
5
+ require 'tty/platform'
3
6
 
4
7
  SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
5
8
  [SimpleCov::Formatter::HTMLFormatter]
@@ -20,6 +23,14 @@ module MiniTest
20
23
  Rainbow.enabled = false
21
24
  end
22
25
 
26
+ def linux_only(msg = 'Only tested on Linux')
27
+ skip msg unless TTY::Platform.new.linux?
28
+ end
29
+
30
+ def skip_windows(msg = 'Skip on Windows')
31
+ skip msg if TTY::Platform.new.windows?
32
+ end
33
+
23
34
  # Methods for hooking logger,
24
35
  # require 'pwnlib/logger' before using these methods.
25
36
 
@@ -40,5 +51,22 @@ module MiniTest
40
51
  ::Pwnlib::Logger.log.instance_variable_set(:@logdev, old)
41
52
  end
42
53
  end
54
+
55
+ # Hooks +$stdin+.
56
+ #
57
+ # @param [IO] io
58
+ # IO object to be used as +$stdin+.
59
+ #
60
+ # @return [Object]
61
+ # Returns what the block returned.
62
+ def hook_stdin(io)
63
+ org_stdin = $stdin
64
+ $stdin = io
65
+ begin
66
+ yield
67
+ ensure
68
+ $stdin = org_stdin
69
+ end
70
+ end
43
71
  end
44
72
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -34,7 +35,7 @@ class TimerTest < MiniTest::Test
34
35
  def test_nested_countdown_false_positve_115
35
36
  t = Timer.new
36
37
  assert_raises(::Pwnlib::Errors::TimeoutError) do
37
- t.countdown(0.01) { sleep(0.02) }
38
+ t.countdown(0.01) { sleep(1) }
38
39
  end
39
40
  t.countdown(0.01) {}
40
41
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'socket'
4
5
  require 'tty-platform'
@@ -13,7 +14,7 @@ class ProcessTest < MiniTest::Test
13
14
  include ::Pwnlib::Context
14
15
 
15
16
  def setup
16
- skip 'Skip on Windows' if TTY::Platform.new.windows?
17
+ skip_windows
17
18
  end
18
19
 
19
20
  def test_io
@@ -33,7 +34,8 @@ class ProcessTest < MiniTest::Test
33
34
  end
34
35
 
35
36
  def test_aslr
36
- skip 'Only tested on linux' unless TTY::Platform.new.linux?
37
+ linux_only
38
+
37
39
  map1 = ::Pwnlib::Tubes::Process.new('cat /proc/self/maps', aslr: false).read
38
40
  map2 = ::Pwnlib::Tubes::Process.new(['cat', '/proc/self/maps'], aslr: false).read
39
41
  assert_match('/bin/cat', map1) # make sure it read something
@@ -84,6 +86,10 @@ class ProcessTest < MiniTest::Test
84
86
  # In cooked mode, tty should echo the input, so we can gets twice.
85
87
  assert_equal("Hi\r\n", cat.gets)
86
88
  assert_equal("Hi\r\n", cat.gets)
89
+ class << cat
90
+ # hook shutdown to silence the +cat: -: Input/output error+ message.
91
+ def shutdown; end
92
+ end
87
93
  cat.close
88
94
  end
89
95
 
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'open3'
4
5
 
@@ -19,10 +20,6 @@ end
19
20
  class SerialTest < MiniTest::Test
20
21
  include ::Pwnlib::Tubes
21
22
 
22
- def skip_windows
23
- skip 'Not test tube/serialtube on Windows' if TTY::Platform.new.windows?
24
- end
25
-
26
23
  def open_pair
27
24
  Open3.popen3('socat -d -d pty,raw,echo=0 pty,raw,echo=0') do |_i, _o, stderr, thread|
28
25
  devs = []
@@ -1,4 +1,5 @@
1
1
  # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'open3'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  # This test use UTF-8 encoding for strings since the output for hexdump contains lots of UTF-8 characters.
4
5
 
@@ -34,7 +35,7 @@ class TubeTest < MiniTest::Test
34
35
 
35
36
  class << t
36
37
  def buf
37
- @buf ||= ''
38
+ @buf ||= +''
38
39
  end
39
40
 
40
41
  private
@@ -61,6 +62,7 @@ class TubeTest < MiniTest::Test
61
62
  class << t
62
63
  def recv_raw(_n)
63
64
  raise ::Pwnlib::Errors::EndOfTubeError if io.eof?
65
+
64
66
  io.read
65
67
  end
66
68
 
@@ -195,6 +197,13 @@ class TubeTest < MiniTest::Test
195
197
  5.times { assert_match(r, t.recvregex(r)) }
196
198
  end
197
199
 
200
+ def test_recvall
201
+ t = basic_tube
202
+ t.unrecv('meow')
203
+ assert_equal('meow', t.recvall)
204
+ assert_equal('', t.recvall)
205
+ end
206
+
198
207
  def test_send
199
208
  t = hello_tube
200
209
  assert_equal(6, t.write('DARKHH'))
@@ -0,0 +1,18 @@
1
+ # encoding: ASCII-8BIT
2
+ # frozen_string_literal: true
3
+
4
+ require 'stringio'
5
+
6
+ require 'test_helper'
7
+
8
+ require 'pwnlib/ui'
9
+
10
+ class UITest < MiniTest::Test
11
+ def test_pause
12
+ hook_stdin(StringIO.new("\n")) do
13
+ assert_output(<<-EOS) { log_stdout { ::Pwnlib::UI.pause } }
14
+ [INFO] Paused (press enter to continue)
15
+ EOS
16
+ end
17
+ end
18
+ end