ctf-party 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +29 -0
  3. data/.yardopts +4 -0
  4. data/.yardopts-dev +6 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +52 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +57 -0
  9. data/Rakefile +11 -0
  10. data/bin/ctf_party_console +7 -0
  11. data/bin/ctf_party_setup +6 -0
  12. data/docs/.nojekyll +0 -0
  13. data/docs/About.md +5 -0
  14. data/docs/CHANGELOG.md +5 -0
  15. data/docs/README.md +52 -0
  16. data/docs/_coverpage.md +10 -0
  17. data/docs/_media/logo.png +0 -0
  18. data/docs/_navbar.md +3 -0
  19. data/docs/_sidebar.md +13 -0
  20. data/docs/index.html +31 -0
  21. data/docs/pages/documentation.md +30 -0
  22. data/docs/pages/install.md +84 -0
  23. data/docs/pages/publishing.md +39 -0
  24. data/docs/pages/quick-start.md +23 -0
  25. data/docs/pages/usage.md +61 -0
  26. data/docs/vendor/docsify.js +1 -0
  27. data/docs/vendor/plugins/emoji.min.js +1 -0
  28. data/docs/vendor/plugins/search.min.js +1 -0
  29. data/docs/vendor/prismjs/components/prism-ruby.min.js +1 -0
  30. data/docs/vendor/themes/vue.css +1 -0
  31. data/docs/yard/String.html +2909 -0
  32. data/docs/yard/Version.html +121 -0
  33. data/docs/yard/_index.html +123 -0
  34. data/docs/yard/class_list.html +51 -0
  35. data/docs/yard/css/common.css +1 -0
  36. data/docs/yard/css/full_list.css +58 -0
  37. data/docs/yard/css/style.css +496 -0
  38. data/docs/yard/file.LICENSE.html +70 -0
  39. data/docs/yard/file.README.html +124 -0
  40. data/docs/yard/file_list.html +61 -0
  41. data/docs/yard/frames.html +17 -0
  42. data/docs/yard/index.html +124 -0
  43. data/docs/yard/js/app.js +303 -0
  44. data/docs/yard/js/full_list.js +216 -0
  45. data/docs/yard/js/jquery.js +4 -0
  46. data/docs/yard/method_list.html +275 -0
  47. data/docs/yard/top-level-namespace.html +112 -0
  48. data/lib/ctf_party.rb +7 -0
  49. data/lib/ctf_party/base64.rb +99 -0
  50. data/lib/ctf_party/digest.rb +115 -0
  51. data/lib/ctf_party/flag.rb +94 -0
  52. data/lib/ctf_party/rot.rb +47 -0
  53. data/lib/ctf_party/version.rb +5 -0
  54. data/test/test_string.rb +134 -0
  55. metadata +218 -0
@@ -0,0 +1,112 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.9.20
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ pathId = "";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+
41
+
42
+ <span class="title">Top Level Namespace</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Top Level Namespace
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ </div>
80
+
81
+ <h2>Defined Under Namespace</h2>
82
+ <p class="children">
83
+
84
+
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="Version.html" title="Version (module)">Version</a></span>
86
+
87
+
88
+
89
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="String.html" title="String (class)">String</a></span>
90
+
91
+
92
+ </p>
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+ </div>
103
+
104
+ <div id="footer">
105
+ Generated on Wed Nov 20 19:33:26 2019 by
106
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
+ 0.9.20 (ruby-2.6.2).
108
+ </div>
109
+
110
+ </div>
111
+ </body>
112
+ </html>
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Project internal
4
+ require 'ctf_party/base64'
5
+ require 'ctf_party/rot'
6
+ require 'ctf_party/digest'
7
+ require 'ctf_party/flag'
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Ruby standard library
4
+ require 'base64'
5
+
6
+ class String
7
+ # Encode the string into base64
8
+ # @param opts [Hash] optional parameters
9
+ # @option opts [Symbol] :mode Default value: +:strict+.
10
+ # Other values are +:strict+ (+:rfc4648+) or +:urlsafe+.
11
+ # @see https://ruby-doc.org/stdlib-2.6.5/libdoc/base64/rdoc/Base64.html
12
+ # @return [String] the Base64 encoded string
13
+ # @example
14
+ # 'Super lib!'.to_b64 # => "U3VwZXIgbGliIQ=="
15
+ def to_b64(opts = {})
16
+ opts[:mode] ||= :strict
17
+ return Base64.strict_encode64(self) if opts[:mode] == :strict ||
18
+ opts[:mode] == :rfc4648
19
+ return Base64.encode64(self) if opts[:mode] == :rfc2045
20
+ return Base64.urlsafe_encode64(self) if opts[:mode] == :urlsafe
21
+ end
22
+
23
+ # Encode the string into base64 in place as described for {String#to_b64}.
24
+ # @return [nil]
25
+ # @example
26
+ # myStr = 'Ruby' # => "Ruby"
27
+ # myStr.to_b64! # => nil
28
+ # myStr # => "UnVieQ=="
29
+ def to_b64!(opts = {})
30
+ opts[:mode] ||= :strict
31
+ replace(to_b64) if opts[:mode] == :strict ||
32
+ opts[:mode] == :rfc4648
33
+ replace(to_b64(mode: :rfc2045)) if opts[:mode] == :rfc2045
34
+ replace(to_b64(mode: :urlsafe)) if opts[:mode] == :urlsafe
35
+ end
36
+
37
+ # Decode the string from base64
38
+ # @param opts [Hash] optional parameters
39
+ # @option opts [Symbol] :mode Default value: +:strict+.
40
+ # Other values are +:strict+ (+:rfc4648+) or +:urlsafe+.
41
+ # @see https://ruby-doc.org/stdlib-2.6.5/libdoc/base64/rdoc/Base64.html
42
+ # @return [String] the Base64 decoded string
43
+ # @example
44
+ # 'UnVieQ=='.from_b64 # => "Ruby"
45
+ def from_b64(opts = {})
46
+ opts[:mode] ||= :strict
47
+ return Base64.strict_decode64(self) if opts[:mode] == :strict ||
48
+ opts[:mode] == :rfc4648
49
+ return Base64.decode64(self) if opts[:mode] == :rfc2045
50
+ return Base64.urlsafe_decode64(self) if opts[:mode] == :urlsafe
51
+ end
52
+
53
+ # Decode the string from base64 in place as described for {String#from_b64}.
54
+ # @return [nil]
55
+ # @example
56
+ # a = 'SGVsbG8gd29ybGQh' # => "SGVsbG8gd29ybGQh"
57
+ # a.from_b64! # => nil
58
+ # a # => "Hello world!"
59
+ def from_b64!(opts = {})
60
+ opts[:mode] ||= :strict
61
+ replace(from_b64) if opts[:mode] == :strict ||
62
+ opts[:mode] == :rfc4648
63
+ replace(from_b64(mode: :rfc2045)) if opts[:mode] == :rfc2045
64
+ replace(from_b64(mode: :urlsafe)) if opts[:mode] == :urlsafe
65
+ end
66
+
67
+ # Is the string encoded in base64?
68
+ # @param opts [Hash] optional parameters
69
+ # @option opts [Symbol] :mode Default value: +:strict+.
70
+ # Other values are +:strict+ (+:rfc4648+) or +:urlsafe+.
71
+ # @see https://ruby-doc.org/stdlib-2.6.5/libdoc/base64/rdoc/Base64.html
72
+ # @return [Boolean] +true+ if the string is a valid base64 string, +false+
73
+ # else.
74
+ # @example
75
+ # 'SGVsbG8gd29ybGQh'.b64? # => true
76
+ # 'SGVsbG8g@@d29ybGQh'.b64? # => false
77
+ def b64?(opts = {})
78
+ opts[:mode] ||= :strict
79
+ b64 = false
80
+ # https://www.rexegg.com/regex-ruby.html
81
+ reg1 = %r{\A(?:[a-zA-Z0-9+/]{4})*(?:|(?:[a-zA-Z0-9+/]{3}=)|
82
+ (?:[a-zA-Z0-9+/]{2}==)|(?:[a-zA-Z0-9+/]{1}===))\Z}xn
83
+ reg3 = /\A(?:[a-zA-Z0-9\-_]{4})*(?:|(?:[a-zA-Z0-9\-_]{3}=)|
84
+ (?:[a-zA-Z0-9\-_]{2}==)|(?:[a-zA-Z0-9\-_]{1}===))\Z/xn
85
+ if opts[:mode] == :strict || opts[:mode] == :rfc4648
86
+ b64 = true if reg1.match?(self)
87
+ elsif opts[:mode] == :rfc2045
88
+ b64 = true
89
+ split("\n").each do |s|
90
+ b64 = false unless reg1.match?(s)
91
+ end
92
+ elsif opts[:mode] == :urlsafe
93
+ b64 = true if reg3.match?(self)
94
+ else
95
+ raise ArgumentError 'Wrong mode'
96
+ end
97
+ return b64
98
+ end
99
+ end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Ruby standard library
4
+ require 'digest'
5
+
6
+ class String
7
+ # Calculate the md5 hash of the string.
8
+ # @see https://ruby-doc.org/stdlib-2.6.1/libdoc/digest/rdoc/Digest/MD5.html
9
+ # @return [String] md5 hash
10
+ # @example
11
+ # 'noraj'.md5 # => "556cc23863fef20fab5c456db166bc6e"
12
+ def md5
13
+ Digest::MD5.hexdigest self
14
+ end
15
+
16
+ # Calculate the md5 hash of the string in place as described for {#md5}.
17
+ # @example
18
+ # a = '\o/' # => "\\o/"
19
+ # a.md5! # => "881419964e480e66162da521ccc25ebf"
20
+ # a # => "881419964e480e66162da521ccc25ebf"
21
+ def md5!
22
+ replace(md5)
23
+ end
24
+
25
+ # Calculate the sha1 hash of the string.
26
+ # @see https://ruby-doc.org/stdlib-2.6.1/libdoc/digest/rdoc/Digest/SHA1.html
27
+ # @return [String] sha1 hash
28
+ # @example
29
+ # 'ctf-party'.sha1 # => "5a64f3bc491d0977e1e3578a48c65a89a16a5fe8"
30
+ def sha1
31
+ Digest::SHA1.hexdigest self
32
+ end
33
+
34
+ # Calculate the sha1 hash of the string in place as described for {#sha1}.
35
+ # @example
36
+ # bob = 'alice' # => "alice"
37
+ # bob.sha1! # => "522b276a356bdf39013dfabea2cd43e141ecc9e8"
38
+ # bob # => "522b276a356bdf39013dfabea2cd43e141ecc9e8"
39
+ def sha1!
40
+ replace(sha1)
41
+ end
42
+
43
+ # Calculate the sha2 hash of the string.
44
+ # @param opts [Hash] optional parameters
45
+ # @option opts [Integer] :bitlen Defines the bit lenght of the digest.
46
+ # Default value: 256 (SHA2-256). other valid vales are 384 (SHA2-384)
47
+ # and 512 (SHA2-512).
48
+ # @see https://ruby-doc.org/stdlib-2.6.1/libdoc/digest/rdoc/Digest/SHA2.html
49
+ # @return [String] sha hash
50
+ # @example
51
+ # 'try harder'.sha2 # => "5321ff2d4b1389b3a350dfe8ca77e3889dc6259bb233ad..."
52
+ # 'try harder'.sha2(bitlen: 512) # => "a7b73a98c095b22e25407b15c4dec128c..."
53
+ def sha2(opts = {})
54
+ opts[:bitlen] ||= 256
55
+ Digest::SHA2.new(opts[:bitlen]).hexdigest self
56
+ end
57
+
58
+ # Calculate the sha2 hash of the string in place as described for {#sha2}.
59
+ # @example
60
+ # th = 'try harder' # => "try harder"
61
+ # th.sha2!(bitlen: 384) # => "bb7f60b9562a19c3a83c23791440af11591c42ede9..."
62
+ # th # => "bb7f60b9562a19c3a83c23791440af11591c42ede9988334cdfd7efa4261a..."
63
+ def sha2!(opts = {})
64
+ replace(sha2(opts))
65
+ end
66
+
67
+ # Alias for {#sha2} with default value ( +sha2(bitlen: 256)+ ).
68
+ def sha2_256
69
+ sha2
70
+ end
71
+
72
+ # Alias for {#sha2!} with default value ( +sha2!(bitlen: 256)+ ).
73
+ def sha2_256!
74
+ replace(sha2)
75
+ end
76
+
77
+ # Alias for {#sha2} with default value ( +sha2(bitlen: 384)+ ).
78
+ def sha2_384
79
+ sha2(bitlen: 384)
80
+ end
81
+
82
+ # Alias for {#sha2!} with default value ( +sha2!(bitlen: 384)+ ).
83
+ def sha2_384!
84
+ replace(sha2(bitlen: 384))
85
+ end
86
+
87
+ # Alias for {#sha2} with default value ( +sha2(bitlen: 512)+ ).
88
+ def sha2_512
89
+ sha2(bitlen: 512)
90
+ end
91
+
92
+ # Alias for {#sha2!} with default value ( +sha2!(bitlen: 512)+ ).
93
+ def sha2_512!
94
+ replace(sha2(bitlen: 512))
95
+ end
96
+
97
+ # Calculate the RIPEMD-160 hash of the string.
98
+ # @see https://ruby-doc.org/stdlib-2.6.1/libdoc/digest/rdoc/Digest/RMD160.html
99
+ # @return [String] RIPEMD-160 hash
100
+ # @example
101
+ # 'payload'.rmd160 # => "3c6255c112d409dafdb84d5b0edba98dfd27b44f"
102
+ def rmd160
103
+ Digest::RMD160.hexdigest self
104
+ end
105
+
106
+ # Calculate the RIPEMD-160 hash of the string in place as described for
107
+ # {#rmd160}.
108
+ # @example
109
+ # pl = 'payload' # => "payload"
110
+ # pl.rmd160! # => "3c6255c112d409dafdb84d5b0edba98dfd27b44f"
111
+ # pl # => "3c6255c112d409dafdb84d5b0edba98dfd27b44f"
112
+ def rmd160!
113
+ replace(rmd160)
114
+ end
115
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ctf_party/digest'
4
+
5
+ class String
6
+ # The flag configuration hash. See {.flag=}.
7
+ @@flag = {
8
+ prefix: '',
9
+ suffix: '',
10
+ enclosing: ['{', '}'],
11
+ digest: nil
12
+ }
13
+
14
+ # Show the actual flag configuration. See {.flag=}.
15
+ def self.flag
16
+ @@flag
17
+ end
18
+
19
+ # rubocop:disable Metrics/LineLength
20
+
21
+ # Update the flag configuration.
22
+ # @param hash [Hash] flag configuration
23
+ # @option hash [String] :prefix prefix of the flag. Default: none.
24
+ # @option hash [String] :suffix suffix of the flag. Default: none.
25
+ # @option hash [Array<String>] :enclosing the characters used to surround
26
+ # the flag. Default are curly braces: +{+, +}+. The array must contain
27
+ # exactly 2 elements.
28
+ # @option hash [String] :digest the hash algorithm to apply on the flag.
29
+ # Default: none. Allowed values: md5, sha1, sha2_256, sha2_384, sha2_512,
30
+ # rmd160.
31
+ # @return [Hash] hash of the updated options.
32
+ # @note You can provide the full hash or only the key to update.
33
+ # @example
34
+ # String.flag # => {:prefix=>"", :suffix=>"", :enclosing=>["{", "}"], :digest=>nil}
35
+ # String.flag = {prefix: 'sigsegv', digest: 'md5'}
36
+ # String.flag # => {:prefix=>"sigsegv", :suffix=>"", :enclosing=>["{", "}"], :digest=>"md5"}
37
+ # 'this_1s_a_fl4g'.flag # => "sigsegv{a5bec9e2a86b6b70d288451eb38dfec8}"
38
+ def self.flag=(hash)
39
+ hash.select! { |k, _v| @@flag.key?(k) }
40
+ @@flag.merge!(hash)
41
+ end
42
+
43
+ # rubocop:enable Metrics/LineLength
44
+
45
+ # Format the current string into the configured flag format. See {.flag=}
46
+ # example.
47
+ # @return [String] the format flag.
48
+ def flag
49
+ flag = ''
50
+ flag += @@flag[:prefix]
51
+ flag += @@flag[:enclosing][0]
52
+ if @@flag[:digest].nil?
53
+ flag += self
54
+ else
55
+ case @@flag[:digest]
56
+ when 'md5'
57
+ flag += md5
58
+ when 'sha1'
59
+ flag += sha1
60
+ when 'sha2_256'
61
+ flag += sha2_256
62
+ when 'sha2_384'
63
+ flag += sha2_384
64
+ when 'sha2_512'
65
+ flag += sha2_512
66
+ when 'rmd160'
67
+ flag += rmd160
68
+ end
69
+ end
70
+ flag += @@flag[:enclosing][1]
71
+ flag + @@flag[:suffix]
72
+ end
73
+
74
+ # Format the current string into the configured flag format in place as
75
+ # described for {#flag}.
76
+ def flag!
77
+ replace(flag)
78
+ end
79
+
80
+ # Check if the string respect the defined flag format.
81
+ # @return [Boolean] true if it respects the configured flag format. but it
82
+ # does not check digest used.
83
+ # @example
84
+ # String.flag = {prefix: 'flag'}
85
+ # flag = 'Brav0!'
86
+ # flag.flag! # => "flag{Brav0!}"
87
+ # flag.flag? # => true
88
+ # flag = 'ctf{Brav0!}'
89
+ # flag.flag? # => false
90
+ def flag?
91
+ /#{@@flag[:prefix]}#{@@flag[:enclosing][0]}[[:print:]]+
92
+ #{@@flag[:enclosing][1]}#{@@flag[:suffix]}/ox.match?(self)
93
+ end
94
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ class String
4
+ # "Encrypt / Decrypt" the string with Caesar cipher. This will shift the
5
+ # alphabet letters by +n+, where +n+ is the integer key. The same function
6
+ # is used for encryption / decryption.
7
+ # @param opts [Hash] optional parameters
8
+ # @option opts [Integer] :shift The shift key. Default value: 13.
9
+ # @see https://en.wikipedia.org/wiki/Caesar_cipher
10
+ # @return [String] the (de)ciphered string
11
+ # @example
12
+ # 'Hello world!'.rot # => "Uryyb jbeyq!"
13
+ # 'Hello world!'.rot(shift: 11) # => "Spwwz hzcwo!"
14
+ # 'Uryyb jbeyq!'.rot # => "Hello world!"
15
+ # 'Spwwz hzcwo!'.rot(shift: 26-11) # => "Hello world!"
16
+ def rot(opts = {})
17
+ opts[:shift] ||= 13
18
+ alphabet = Array('a'..'z')
19
+ lowercase = Hash[alphabet.zip(alphabet.rotate(opts[:shift]))]
20
+ alphabet = Array('A'..'Z')
21
+ uppercasecase = Hash[alphabet.zip(alphabet.rotate(opts[:shift]))]
22
+ encrypter = lowercase.merge(uppercasecase)
23
+ chars.map { |c| encrypter.fetch(c, c) }.join
24
+ end
25
+
26
+ # "Encrypt / Decrypt" the string with Caesar cipher in place as described for
27
+ # {String#rot}.
28
+ # @return [String] the (de)ciphered string as well as changing changing the
29
+ # object in place.
30
+ # @example
31
+ # a = 'Bonjour le monde !' # => "Bonjour le monde !"
32
+ # a.rot! # => "Obawbhe yr zbaqr !"
33
+ # a # => "Obawbhe yr zbaqr !"
34
+ def rot!(opts = {})
35
+ replace(rot(opts))
36
+ end
37
+
38
+ # Alias for {#rot} with default value ( +rot(shift: 13)+ ).
39
+ def rot13
40
+ rot
41
+ end
42
+
43
+ # Alias for {#rot!} with default value ( +rot!(shift: 13)+ ).
44
+ def rot13!
45
+ rot!
46
+ end
47
+ end