aboutsummaryrefslogtreecommitdiffhomepage
path: root/Q4.txt
blob: 619c4c9b1e4291317c873436b8180671975c30ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#<?php
# ^^^^ This `#<?php` is NOT a token.

######################################################################
#                                                                    #
#     This program is a "polyglot" of Ruby, Perl, Bash and PHP.      #
#                                                                    #
#                    Run it on each interpreter.                     #
#                                                                    #
######################################################################

false && 1 << 0;

$a = 'a';
$/* 0;

# */$a
=begin
();
1?
0

: //; env file="$0" bash -c 'echo "xrl3 vf: ${file'$(printf '\043\043')'*/}" | tr A-Z a-z | tr a-z n-za-m'; : << 'nil;'

1; function begin() {}

const CIPHER_ALGORITHM = 'aes-256-cbc';
const CIPHERTEXT = 'Iy9whlJmmxqa6krqCCUkCEH/F/S74z6AUZkfunZvOEuoBAQLLTg58u+GdToISxYj';
const PLAINTEXT_HASH = '$2y$10$cTnU7S.hAl7LdiIAoCPNoefMwx6fvn4Q0LpVCzO27s80ruUHbSAVy';
const KEY_PATTERN = '/^[0-9A-Fa-f]{32}$/';

if (!defined('OPENSSL_VERSION_NUMBER')) {
  fputs(STDERR, "\nOpenSSL not available.\n");
  exit(1);
}
if (!in_array(CIPHER_ALGORITHM, openssl_get_cipher_methods(), true)) {
  fputs(STDERR, "\n" . CIPHER_ALGORITHM . " not available.\n");
  exit(1);
}
if (!isset($argv[1]) || !isset($argv[2]) || !isset($argv[3])) {
  fputs(STDERR, "\nUsage: php $argv[0] <key1> <key2> <key3>.\n");
  exit(1);
}
if (preg_match(KEY_PATTERN, $argv[1]) !== 1) {
  fputs(STDERR, "\nInvalid <key1>.\n");
  exit(1);
}
if (preg_match(KEY_PATTERN, $argv[2]) !== 1) {
  fputs(STDERR, "\nInvalid <key2>.\n");
  exit(1);
}
if (strlen($argv[3]) !== 6) {
  fputs(STDERR, "\nInvalid <key3>.\n");
  exit(1);
}
$key3 = $argv[3];
$key3 = str_repeat($key3, strlen($key3));
$key1 = hex2bin($argv[1]) ^ $key3;
$key2 = hex2bin($argv[2]) ^ $key3;

$plaintext = openssl_decrypt(CIPHERTEXT, CIPHER_ALGORITHM, $key1, 0, $key2);
if (!password_verify($plaintext, PLAINTEXT_HASH)) {
  fputs(STDERR, "\n<key1>, <key2> or <key3> is incorrect.\n");
  exit(1);
}
echo "${plaintext}\n";

$a = <<<'nil'

=end

require 'digest/md5'

ds = %w[
  35589a1cc0b3ca90fc52d0e711c0c434
  a690a0615820e2e5c53901d8b8958509
  fca6a9b459e702fa93513c6a8b8c5dfe
]
k = ''
Module.constants.map(&:to_s).sort.each do |i|
  d = Digest::MD5.hexdigest(i)
  k += i if ds.include?(d)
end
puts 'key1 is: ' + Digest::MD5.hexdigest(k)

'
=cut

use utf8;
use Digest::MD5 qw(md5_hex);

my @ds = qw[
  30b92d3052fef34fca8f30d42bb1e395
  6836a6ebcbbf861ed2db0da1babef4bb
  98f5665676b2179cea2e607dacddc2d0
];
my $k = '';
foreach my $i (sort keys %INC) {
  my $d = md5_hex($i);
  $k .= $i if grep /^$d$/, @ds;
}
print "key2 is: " . md5_hex($k) . "\n";

'# ';
nil;