more
BIN
St3g0/_pico.flag.png.extracted/29.old
Normal file
BIN
St3g0/_pico.flag.png.extracted/29.out
Normal file
BIN
St3g0/_pico.flag.png.extracted/29.zlib
Normal file
BIN
St3g0/pico.flag.png
Executable file
|
After Width: | Height: | Size: 13 KiB |
BIN
disk_disk_sleuth/dds1-alpine.flag.img.gz
Executable file
BIN
disk_disk_sleuth_II/dds2-alpine.flag.img.gz
Executable file
BIN
extensions/flag.png
Executable file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
extensions/flag.txt
Executable file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
packets_primer/network-dump.flag.pcap
Executable file
BIN
sleuthkit_apprentice/disk.flag.img.gz
Executable file
BIN
sleuthkit_intro/disk.img.gz
Executable file
BIN
trivial_flag_transfer_protocol/_program.deb.extracted/5A2
Normal file
BIN
trivial_flag_transfer_protocol/_program.deb.extracted/5A2.d/usr/bin/steghide
Executable file
@@ -0,0 +1,10 @@
|
||||
|
||||
* .au mu-law audio data is treated as linear 8 bit unsigned value in the neighbourhood relation (with radius 1).
|
||||
The neighbourhood relation should be defined with respect to the logarithmic nature of mu-law data.
|
||||
|
||||
* steghide uses the classes hash_set and hash_map from sgi's implementation of
|
||||
the standard template library. These two classes are not part of the official
|
||||
C++ standard but part of the GNU's libstdc++. If you happen to be on a system
|
||||
that does not include theses classes you won't be able to compile steghide.
|
||||
|
||||
If you find a bug, please tell me (shetzl@chello.at) about it.
|
||||
@@ -0,0 +1,17 @@
|
||||
Stefan Hetzl <shetzl@chello.at> author, maintainer
|
||||
|
||||
I would like to thank...
|
||||
|
||||
Petra Mutzel <mutzel@ads.tuwien.ac.at> for being a great guide trough graph theory
|
||||
Christine Pippan <christine_pippan@chello.at> for designing the logo
|
||||
Trimbitas Sorin <lacroix-iv@go.ro> romanian translation
|
||||
Alberto A. Schiano <chanio@users.sourceforge.net> spanish translation
|
||||
Cedric Gross <cgross@wanadoo.fr> french translation
|
||||
Julien Catanese <julien_catanese@yahoo.fr> french translation
|
||||
Tilman Linneweh <arved@freebsd.org> freebsd port
|
||||
Rasputin <rara.rasputin@virgin.net> freebsd port
|
||||
Brian Russo <wolfie@debian.org> debian package
|
||||
Guenter Bechly <gbechly@gmx.de> debian package
|
||||
|
||||
and numerous others who have contributed by sending bug reports
|
||||
or interesting suggestions.
|
||||
@@ -0,0 +1,122 @@
|
||||
steghide 0.5.1 :
|
||||
================
|
||||
|
||||
* new algorithm that maintains first-order statistics for all file formats
|
||||
|
||||
* support for all types of jpeg files (using libjpeg)
|
||||
|
||||
* compression of embedded data (using zlib)
|
||||
|
||||
* use of permutation as distribution function
|
||||
|
||||
* a 'info' command to display the information about a cover- or stego- file (including it's capacity)
|
||||
|
||||
* random data can be taken from /dev/urandom
|
||||
|
||||
* spanish translation
|
||||
|
||||
* romanian translation
|
||||
|
||||
|
||||
steghide 0.4.6b :
|
||||
=================
|
||||
|
||||
* bugfix (did not compile on some systems)
|
||||
|
||||
|
||||
steghide 0.4.6 :
|
||||
================
|
||||
|
||||
* support for the jpeg file format
|
||||
|
||||
* switched from C to C++ (partial rewrite)
|
||||
|
||||
* bugfixes
|
||||
|
||||
|
||||
steghide 0.4.5 :
|
||||
================
|
||||
|
||||
* internationalization (GNU gettext)
|
||||
|
||||
* german locale
|
||||
|
||||
* french locale
|
||||
|
||||
|
||||
steghide 0.4.4 :
|
||||
================
|
||||
|
||||
* performance rewrite of memory management code
|
||||
|
||||
|
||||
steghide 0.4.3 :
|
||||
================
|
||||
|
||||
* support for crc32 checksum of the plain data
|
||||
|
||||
* switch to enable/disable embedding of plain file name
|
||||
|
||||
* rewrite of some parts
|
||||
|
||||
|
||||
steghide 0.4.2 :
|
||||
================
|
||||
|
||||
* interval length defaults to the maximum possible
|
||||
|
||||
* verbosity, quiet and force switches
|
||||
|
||||
* prompt for passphrase if not given on command line
|
||||
|
||||
|
||||
steghide 0.4.1 :
|
||||
================
|
||||
|
||||
* more secure embedding algorithm
|
||||
|
||||
* libmcrypt is used for encryption
|
||||
|
||||
* libmhash is used for hashing
|
||||
|
||||
* command line syntax revision
|
||||
|
||||
* reorganisation and partial rewrite
|
||||
|
||||
* bugfixes
|
||||
|
||||
|
||||
steghide 0.3 :
|
||||
==============
|
||||
|
||||
* blowfish encryption
|
||||
|
||||
* md5 for generating 128 bit keys from passphrase
|
||||
|
||||
* autconf and automake
|
||||
|
||||
* rpm packages
|
||||
|
||||
* support for au files
|
||||
|
||||
* man page
|
||||
|
||||
* interactive mode
|
||||
|
||||
* command line syntax revision
|
||||
|
||||
* fixed a bug that prevented the use of stdin as cover or stego data stream
|
||||
|
||||
|
||||
steghide 0.2 :
|
||||
==============
|
||||
|
||||
* support for wav (pcm) files
|
||||
|
||||
* support for bmp files that use color tables
|
||||
|
||||
* support for OS/2 1.x bmp files
|
||||
|
||||
* file format auto-detection
|
||||
|
||||
* internal changes (better buffer-management)
|
||||
@@ -0,0 +1,27 @@
|
||||
These are things that I plan to implement in the future:
|
||||
|
||||
* partition code into library and frontend
|
||||
|
||||
* graphical user interface
|
||||
|
||||
* user-friendly installer for Windows version (InnoSetup)
|
||||
|
||||
* use libaudiofile for audio file format support
|
||||
|
||||
* make embedding data in audio cds possible (embed markers for synchronization)
|
||||
|
||||
* rewrite memory management such that cover-/stego-file must no longer be kept in memory as a whole
|
||||
|
||||
* support for other file formats (mp3, png, gif, avi)
|
||||
|
||||
* user's guide (sgml?, docbook?, gnu texinfo?)
|
||||
|
||||
* support for RLE-encoded bmps
|
||||
|
||||
* matrix encoding
|
||||
|
||||
? support for spreading one secret file into a set of >= 1 cover files
|
||||
|
||||
? support for embedding more than one message into one cover file (different passphrases)
|
||||
|
||||
? allow PGP encryption of embedded data (gpgme?)
|
||||
@@ -0,0 +1,28 @@
|
||||
This package was debianized by Dr. Guenter Bechly <gbechly@debian.org> on
|
||||
Mon, 1 Jan 2001 20:24:27 +0100.
|
||||
|
||||
It was downloaded from
|
||||
http://steghide.sourceforge.net/download/
|
||||
|
||||
Upstream Author:
|
||||
Stefan Hetzl <shetzl@teleweb.at>
|
||||
|
||||
Copyright: GPL
|
||||
|
||||
This software is copyright (c) by Stefan Hetzl
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
with your Debian GNU system, in /usr/share/common-licenses/GPL, or
|
||||
with the Debian GNU steghide source package as the file COPYING. If
|
||||
not, write to the Free Software Foundation, Inc., 51 Franklin St,
|
||||
Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
BIN
trivial_flag_transfer_protocol/_program.deb.extracted/5A2.xz
Normal file
BIN
trivial_flag_transfer_protocol/_program.deb.extracted/84
Normal file
@@ -0,0 +1,18 @@
|
||||
Package: steghide
|
||||
Source: steghide (0.5.1-9.1)
|
||||
Version: 0.5.1-9.1+b1
|
||||
Architecture: amd64
|
||||
Maintainer: Ola Lundqvist <opal@debian.org>
|
||||
Installed-Size: 426
|
||||
Depends: libc6 (>= 2.2.5), libgcc1 (>= 1:4.1.1), libjpeg62-turbo (>= 1:1.3.1), libmcrypt4, libmhash2, libstdc++6 (>= 4.9), zlib1g (>= 1:1.1.4)
|
||||
Section: misc
|
||||
Priority: optional
|
||||
Description: A steganography hiding tool
|
||||
Steghide is steganography program which hides bits of a data file
|
||||
in some of the least significant bits of another file in such a way
|
||||
that the existence of the data file is not visible and cannot be proven.
|
||||
.
|
||||
Steghide is designed to be portable and configurable and features hiding
|
||||
data in bmp, wav and au files, blowfish encryption, MD5 hashing of
|
||||
passphrases to blowfish keys, and pseudo-random distribution of hidden bits
|
||||
in the container data.
|
||||
@@ -0,0 +1,17 @@
|
||||
71bdab1263ab4b8d28f34afa5f0ab121 usr/bin/steghide
|
||||
11db80c2a5dbb9c6107853b08aeacc49 usr/share/doc/steghide/ABOUT-NLS.gz
|
||||
57deb17212483b49f89587180d4d67d4 usr/share/doc/steghide/BUGS
|
||||
72c7831222483f5c6d96ac2a8ca7ad48 usr/share/doc/steghide/CREDITS
|
||||
adbb29f44a5e5eefda3c3d756cc15ab1 usr/share/doc/steghide/HISTORY
|
||||
fe7cac39a1a1ef0975d24dfcf02f09b7 usr/share/doc/steghide/LEAME.gz
|
||||
85587b9213ca2301eb450aad574d5f87 usr/share/doc/steghide/README.gz
|
||||
a9e03fa8166b8fa918c81db1855b68d1 usr/share/doc/steghide/TODO
|
||||
09d7710e276a06c4a3f3bc81b3b86a41 usr/share/doc/steghide/changelog.Debian.amd64.gz
|
||||
e454b20fdc2208f8170e28b90b6d43f7 usr/share/doc/steghide/changelog.Debian.gz
|
||||
1a2e10366a3a55d7a4cb5fc3c87a6bf7 usr/share/doc/steghide/changelog.gz
|
||||
df8c0ea893b3f6f64a917824c6c9d224 usr/share/doc/steghide/copyright
|
||||
fc53645374c583f11f628331be710d9a usr/share/locale/de/LC_MESSAGES/steghide.mo
|
||||
b8ceabc96f9bffd9157103e1a86be33f usr/share/locale/es/LC_MESSAGES/steghide.mo
|
||||
87ee9a19bb49b217dad67b5a889bb1d1 usr/share/locale/fr/LC_MESSAGES/steghide.mo
|
||||
dbc3a8e974ccf7e91da81aca4a5c1605 usr/share/locale/ro/LC_MESSAGES/steghide.mo
|
||||
921a5afd279097e4ed359ce3767068f5 usr/share/man/man1/steghide.1.gz
|
||||
1
trivial_flag_transfer_protocol/flag.txt
Normal file
@@ -0,0 +1 @@
|
||||
picoCTF{h1dd3n_1n_pLa1n_51GHT_18375919}
|
||||
1
trivial_flag_transfer_protocol/instructions.txt
Normal file
@@ -0,0 +1 @@
|
||||
GSGCQBRFAGRAPELCGBHEGENSSVPFBJRZHFGQVFTHVFRBHESYNTGENAFSRE.SVTHERBHGNJNLGBUVQRGURSYNTNAQVJVYYPURPXONPXSBEGURCYNA
|
||||
0
trivial_flag_transfer_protocol/picture
Normal file
BIN
trivial_flag_transfer_protocol/picture1.bmp
Normal file
|
After Width: | Height: | Size: 805 KiB |
BIN
trivial_flag_transfer_protocol/picture2.bmp
Normal file
|
After Width: | Height: | Size: 35 MiB |
BIN
trivial_flag_transfer_protocol/picture3.bmp
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
1
trivial_flag_transfer_protocol/plan
Normal file
@@ -0,0 +1 @@
|
||||
VHFRQGURCEBTENZNAQUVQVGJVGU-QHRQVYVTRAPR.PURPXBHGGURCUBGBF
|
||||
BIN
trivial_flag_transfer_protocol/program.deb
Normal file
BIN
trivial_flag_transfer_protocol/tftp.pcapng
Executable file
57
vault-door-1/VaultDoor1.java
Executable file
@@ -0,0 +1,57 @@
|
||||
import java.util.*;
|
||||
|
||||
class VaultDoor1 {
|
||||
public static void main(String args[]) {
|
||||
VaultDoor1 vaultDoor = new VaultDoor1();
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
System.out.print("Enter vault password: ");
|
||||
String userInput = scanner.next();
|
||||
String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
|
||||
if (vaultDoor.checkPassword(input)) {
|
||||
System.out.println("Access granted.");
|
||||
} else {
|
||||
System.out.println("Access denied!");
|
||||
}
|
||||
}
|
||||
|
||||
// I came up with a more secure way to check the password without putting
|
||||
// the password itself in the source code. I think this is going to be
|
||||
// UNHACKABLE!! I hope Dr. Evil agrees...
|
||||
//
|
||||
// -Minion #8728
|
||||
public boolean checkPassword(String password) {
|
||||
return password.length() == 32 &&
|
||||
password.charAt(0) == 'd' &&
|
||||
password.charAt(29) == '3' &&
|
||||
password.charAt(4) == 'r' &&
|
||||
password.charAt(2) == '5' &&
|
||||
password.charAt(23) == 'r' &&
|
||||
password.charAt(3) == 'c' &&
|
||||
password.charAt(17) == '4' &&
|
||||
password.charAt(1) == '3' &&
|
||||
password.charAt(7) == 'b' &&
|
||||
password.charAt(10) == '_' &&
|
||||
password.charAt(5) == '4' &&
|
||||
password.charAt(9) == '3' &&
|
||||
password.charAt(11) == 't' &&
|
||||
password.charAt(15) == 'c' &&
|
||||
password.charAt(8) == 'l' &&
|
||||
password.charAt(12) == 'H' &&
|
||||
password.charAt(20) == 'c' &&
|
||||
password.charAt(14) == '_' &&
|
||||
password.charAt(6) == 'm' &&
|
||||
password.charAt(24) == '5' &&
|
||||
password.charAt(18) == 'r' &&
|
||||
password.charAt(13) == '3' &&
|
||||
password.charAt(19) == '4' &&
|
||||
password.charAt(21) == 'T' &&
|
||||
password.charAt(16) == 'H' &&
|
||||
password.charAt(27) == 'f' &&
|
||||
password.charAt(30) == 'b' &&
|
||||
password.charAt(25) == '_' &&
|
||||
password.charAt(22) == '3' &&
|
||||
password.charAt(28) == '6' &&
|
||||
password.charAt(26) == 'f' &&
|
||||
password.charAt(31) == '0';
|
||||
}
|
||||
}
|
||||
41
vault-door-1/sol.py
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/home/maxime/.pyvenv/bin/python3
|
||||
|
||||
S = '''
|
||||
password.charAt(0) == 'd' &&
|
||||
password.charAt(1) == '3' &&
|
||||
password.charAt(2) == '5' &&
|
||||
password.charAt(3) == 'c' &&
|
||||
password.charAt(4) == 'r' &&
|
||||
password.charAt(5) == '4' &&
|
||||
password.charAt(7) == 'b' &&
|
||||
password.charAt(17) == '4' &&
|
||||
password.charAt(23) == 'r' &&
|
||||
password.charAt(29) == '3' &&
|
||||
password.charAt(10) == '_' &&
|
||||
password.charAt(9) == '3' &&
|
||||
password.charAt(11) == 't' &&
|
||||
password.charAt(15) == 'c' &&
|
||||
password.charAt(8) == 'l' &&
|
||||
password.charAt(12) == 'H' &&
|
||||
password.charAt(20) == 'c' &&
|
||||
password.charAt(14) == '_' &&
|
||||
password.charAt(6) == 'm' &&
|
||||
password.charAt(24) == '5' &&
|
||||
password.charAt(18) == 'r' &&
|
||||
password.charAt(13) == '3' &&
|
||||
password.charAt(19) == '4' &&
|
||||
password.charAt(21) == 'T' &&
|
||||
password.charAt(16) == 'H' &&
|
||||
password.charAt(27) == 'f' &&
|
||||
password.charAt(30) == 'b' &&
|
||||
password.charAt(25) == '_' &&
|
||||
password.charAt(22) == '3' &&
|
||||
password.charAt(28) == '6' &&
|
||||
password.charAt(26) == 'f' &&
|
||||
password.charAt(31) == '0'
|
||||
'''
|
||||
|
||||
l = list(map(lambda a: [int(a[0]), a[1]], map(lambda a: a.strip().replace(" ", ' ').split(' '), S.strip().replace("password.charAt(", '').replace(')', '').replace(" &&", '').replace("== ", '').splitlines())))
|
||||
l.sort()
|
||||
print(''.join(map(lambda a: a[1].replace('\'', ''), l)))
|
||||
|
||||
44
vault-door-3/VaultDoor3.java
Executable file
@@ -0,0 +1,44 @@
|
||||
import java.util.*;
|
||||
|
||||
class VaultDoor3 {
|
||||
public static void main(String args[]) {
|
||||
VaultDoor3 vaultDoor = new VaultDoor3();
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
System.out.print("Enter vault password: ");
|
||||
String userInput = scanner.next();
|
||||
String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
|
||||
if (vaultDoor.checkPassword(input)) {
|
||||
System.out.println("Access granted.");
|
||||
} else {
|
||||
System.out.println("Access denied!");
|
||||
}
|
||||
}
|
||||
|
||||
// Our security monitoring team has noticed some intrusions on some of the
|
||||
// less secure doors. Dr. Evil has asked me specifically to build a stronger
|
||||
// vault door to protect his Doomsday plans. I just *know* this door will
|
||||
// keep all of those nosy agents out of our business. Mwa ha!
|
||||
//
|
||||
// -Minion #2671
|
||||
public boolean checkPassword(String password) {
|
||||
if (password.length() != 32) {
|
||||
return false;
|
||||
}
|
||||
char[] buffer = new char[32];
|
||||
int i;
|
||||
for (i=0; i<8; i++) {
|
||||
buffer[i] = password.charAt(i);
|
||||
}
|
||||
for (; i<16; i++) {
|
||||
buffer[i] = password.charAt(23-i);
|
||||
}
|
||||
for (; i<32; i+=2) {
|
||||
buffer[i] = password.charAt(46-i);
|
||||
}
|
||||
for (i=31; i>=17; i-=2) {
|
||||
buffer[i] = password.charAt(i);
|
||||
}
|
||||
String s = new String(buffer);
|
||||
return s.equals("jU5t_a_sna_3lpm18gb41_u_4_mfr340");
|
||||
}
|
||||
}
|
||||
19
vault-door-3/sol.py
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/home/maxime/.pyvenv/bin/python3
|
||||
S = "jU5t_a_sna_3lpm18gb41_u_4_mfr340"
|
||||
|
||||
flag = ['']*32
|
||||
|
||||
for i in range(31, 16, -2):
|
||||
flag[i] = S[i]
|
||||
|
||||
for i in range(16, 32, 2):
|
||||
flag[46-i] = S[i]
|
||||
|
||||
for i in range(8, 16):
|
||||
flag[23-i] = S[i]
|
||||
|
||||
for i in range(8):
|
||||
flag[i] = S[i]
|
||||
|
||||
print(''.join(flag))
|
||||
|
||||
45
vault-door-4/VaultDoor4.java
Executable file
@@ -0,0 +1,45 @@
|
||||
import java.util.*;
|
||||
|
||||
class VaultDoor4 {
|
||||
public static void main(String args[]) {
|
||||
VaultDoor4 vaultDoor = new VaultDoor4();
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
System.out.print("Enter vault password: ");
|
||||
String userInput = scanner.next();
|
||||
String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
|
||||
if (vaultDoor.checkPassword(input)) {
|
||||
System.out.println("Access granted.");
|
||||
} else {
|
||||
System.out.println("Access denied!");
|
||||
}
|
||||
}
|
||||
|
||||
// I made myself dizzy converting all of these numbers into different bases,
|
||||
// so I just *know* that this vault will be impenetrable. This will make Dr.
|
||||
// Evil like me better than all of the other minions--especially Minion
|
||||
// #5620--I just know it!
|
||||
//
|
||||
// .:::. .:::.
|
||||
// :::::::.:::::::
|
||||
// :::::::::::::::
|
||||
// ':::::::::::::'
|
||||
// ':::::::::'
|
||||
// ':::::'
|
||||
// ':'
|
||||
// -Minion #7781
|
||||
public boolean checkPassword(String password) {
|
||||
byte[] passBytes = password.getBytes();
|
||||
byte[] myBytes = {
|
||||
106 , 85 , 53 , 116 , 95 , 52 , 95 , 98 ,
|
||||
0x55, 0x6e, 0x43, 0x68, 0x5f, 0x30, 0x66, 0x5f,
|
||||
0142, 0131, 0164, 063 , 0163, 0137, 0143, 061 ,
|
||||
'9' , '4' , 'f' , '7' , '4' , '5' , '8' , 'e' ,
|
||||
};
|
||||
for (int i=0; i<32; i++) {
|
||||
if (passBytes[i] != myBytes[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
14
vault-door-4/sol.py
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/home/maxime/.pyvenv/bin/python3
|
||||
|
||||
row_1 = [106 , 85 , 53 , 116 , 95 , 52 , 95 , 98]
|
||||
row_2 = [0x55, 0x6e, 0x43, 0x68, 0x5f, 0x30, 0x66, 0x5f]
|
||||
row_3 = [0o142, 0o131, 0o164, 0o63 , 0o163, 0o137, 0o143, 0o61]
|
||||
row_4 = ['9' , '4' , 'f' , '7' , '4' , '5' , '8' , 'e']
|
||||
|
||||
print(''.join(
|
||||
list(map(lambda a: chr(a), row_1)) +
|
||||
list(map(lambda a: chr(a), row_2)) +
|
||||
list(map(lambda a: chr(a), row_3)) +
|
||||
row_4
|
||||
))
|
||||
|
||||
49
vault-door-5/VaultDoor5.java
Executable file
@@ -0,0 +1,49 @@
|
||||
import java.net.URLDecoder;
|
||||
import java.util.*;
|
||||
|
||||
class VaultDoor5 {
|
||||
public static void main(String args[]) {
|
||||
VaultDoor5 vaultDoor = new VaultDoor5();
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
System.out.print("Enter vault password: ");
|
||||
String userInput = scanner.next();
|
||||
String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
|
||||
if (vaultDoor.checkPassword(input)) {
|
||||
System.out.println("Access granted.");
|
||||
} else {
|
||||
System.out.println("Access denied!");
|
||||
}
|
||||
}
|
||||
|
||||
// Minion #7781 used base 8 and base 16, but this is base 64, which is
|
||||
// like... eight times stronger, right? Riiigghtt? Well that's what my twin
|
||||
// brother Minion #2415 says, anyway.
|
||||
//
|
||||
// -Minion #2414
|
||||
public String base64Encode(byte[] input) {
|
||||
return Base64.getEncoder().encodeToString(input);
|
||||
}
|
||||
|
||||
// URL encoding is meant for web pages, so any double agent spies who steal
|
||||
// our source code will think this is a web site or something, defintely not
|
||||
// vault door! Oh wait, should I have not said that in a source code
|
||||
// comment?
|
||||
//
|
||||
// -Minion #2415
|
||||
public String urlEncode(byte[] input) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i=0; i<input.length; i++) {
|
||||
buf.append(String.format("%%%2x", input[i]));
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public boolean checkPassword(String password) {
|
||||
String urlEncoded = urlEncode(password.getBytes());
|
||||
String base64Encoded = base64Encode(urlEncoded.getBytes());
|
||||
String expected = "JTYzJTMwJTZlJTc2JTMzJTcyJTc0JTMxJTZlJTY3JTVm"
|
||||
+ "JTY2JTcyJTMwJTZkJTVmJTYyJTYxJTM1JTY1JTVmJTM2"
|
||||
+ "JTM0JTVmJTMwJTYyJTM5JTM1JTM3JTYzJTM0JTY2";
|
||||
return base64Encoded.equals(expected);
|
||||
}
|
||||
}
|
||||
9
vault-door-5/sol.py
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/home/maxime/.pyvenv/bin/python3
|
||||
from base64 import b64decode
|
||||
from urllib.parse import unquote
|
||||
|
||||
S = "JTYzJTMwJTZlJTc2JTMzJTcyJTc0JTMxJTZlJTY3JTVm" + "JTY2JTcyJTMwJTZkJTVmJTYyJTYxJTM1JTY1JTVmJTM2" + "JTM0JTVmJTMwJTYyJTM5JTM1JTM3JTYzJTM0JTY2"
|
||||
S = b64decode(S)
|
||||
S = unquote(S)
|
||||
print(S)
|
||||
|
||||
42
vault-door-6/VaultDoor6.java
Executable file
@@ -0,0 +1,42 @@
|
||||
import java.util.*;
|
||||
|
||||
class VaultDoor6 {
|
||||
public static void main(String args[]) {
|
||||
VaultDoor6 vaultDoor = new VaultDoor6();
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
System.out.print("Enter vault password: ");
|
||||
String userInput = scanner.next();
|
||||
String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
|
||||
if (vaultDoor.checkPassword(input)) {
|
||||
System.out.println("Access granted.");
|
||||
} else {
|
||||
System.out.println("Access denied!");
|
||||
}
|
||||
}
|
||||
|
||||
// Dr. Evil gave me a book called Applied Cryptography by Bruce Schneier,
|
||||
// and I learned this really cool encryption system. This will be the
|
||||
// strongest vault door in Dr. Evil's entire evil volcano compound for sure!
|
||||
// Well, I didn't exactly read the *whole* book, but I'm sure there's
|
||||
// nothing important in the last 750 pages.
|
||||
//
|
||||
// -Minion #3091
|
||||
public boolean checkPassword(String password) {
|
||||
if (password.length() != 32) {
|
||||
return false;
|
||||
}
|
||||
byte[] passBytes = password.getBytes();
|
||||
byte[] myBytes = {
|
||||
0x3b, 0x65, 0x21, 0xa , 0x38, 0x0 , 0x36, 0x1d,
|
||||
0xa , 0x3d, 0x61, 0x27, 0x11, 0x66, 0x27, 0xa ,
|
||||
0x21, 0x1d, 0x61, 0x3b, 0xa , 0x2d, 0x65, 0x27,
|
||||
0xa , 0x6c, 0x60, 0x37, 0x30, 0x60, 0x31, 0x36,
|
||||
};
|
||||
for (int i=0; i<32; i++) {
|
||||
if (((passBytes[i] ^ 0x55) - myBytes[i]) != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
9
vault-door-6/sol.py
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/home/maxime/.pyvenv/bin/python3
|
||||
|
||||
B = [0x3b, 0x65, 0x21, 0xa , 0x38, 0x0 , 0x36, 0x1d,
|
||||
0xa , 0x3d, 0x61, 0x27, 0x11, 0x66, 0x27, 0xa ,
|
||||
0x21, 0x1d, 0x61, 0x3b, 0xa , 0x2d, 0x65, 0x27,
|
||||
0xa , 0x6c, 0x60, 0x37, 0x30, 0x60, 0x31, 0x36]
|
||||
|
||||
print(''.join(map(lambda a: chr(a^0x55), B)))
|
||||
|
||||
67
vault-door-7/VaultDoor7.java
Executable file
@@ -0,0 +1,67 @@
|
||||
import java.util.*;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.security.*;
|
||||
|
||||
class VaultDoor7 {
|
||||
public static void main(String args[]) {
|
||||
VaultDoor7 vaultDoor = new VaultDoor7();
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
System.out.print("Enter vault password: ");
|
||||
String userInput = scanner.next();
|
||||
String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
|
||||
if (vaultDoor.checkPassword(input)) {
|
||||
System.out.println("Access granted.");
|
||||
} else {
|
||||
System.out.println("Access denied!");
|
||||
}
|
||||
}
|
||||
|
||||
// Each character can be represented as a byte value using its
|
||||
// ASCII encoding. Each byte contains 8 bits, and an int contains
|
||||
// 32 bits, so we can "pack" 4 bytes into a single int. Here's an
|
||||
// example: if the hex string is "01ab", then those can be
|
||||
// represented as the bytes {0x30, 0x31, 0x61, 0x62}. When those
|
||||
// bytes are represented as binary, they are:
|
||||
//
|
||||
// 0x30: 00110000
|
||||
// 0x31: 00110001
|
||||
// 0x61: 01100001
|
||||
// 0x62: 01100010
|
||||
//
|
||||
// If we put those 4 binary numbers end to end, we end up with 32
|
||||
// bits that can be interpreted as an int.
|
||||
//
|
||||
// 00110000001100010110000101100010 -> 808542562
|
||||
//
|
||||
// Since 4 chars can be represented as 1 int, the 32 character password can
|
||||
// be represented as an array of 8 ints.
|
||||
//
|
||||
// - Minion #7816
|
||||
public int[] passwordToIntArray(String hex) {
|
||||
int[] x = new int[8];
|
||||
byte[] hexBytes = hex.getBytes();
|
||||
for (int i=0; i<8; i++) {
|
||||
x[i] = hexBytes[i*4] << 24
|
||||
| hexBytes[i*4+1] << 16
|
||||
| hexBytes[i*4+2] << 8
|
||||
| hexBytes[i*4+3];
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
public boolean checkPassword(String password) {
|
||||
if (password.length() != 32) {
|
||||
return false;
|
||||
}
|
||||
int[] x = passwordToIntArray(password);
|
||||
return x[0] == 1096770097
|
||||
&& x[1] == 1952395366
|
||||
&& x[2] == 1600270708
|
||||
&& x[3] == 1601398833
|
||||
&& x[4] == 1716808014
|
||||
&& x[5] == 1734291511
|
||||
&& x[6] == 960049251
|
||||
&& x[7] == 1681089078;
|
||||
}
|
||||
}
|
||||
6
vault-door-7/sol.py
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/home/maxime/.pyvenv/bin/python3
|
||||
|
||||
I = [1096770097, 1952395366, 1600270708, 1601398833, 1716808014, 1734291511, 960049251, 1681089078]
|
||||
|
||||
print(''.join(map(lambda a: (chr(a>>24) + chr((a%(2**24))>>16) + chr((a%(2**16))>>8) + chr(a%(2**8))), I)))
|
||||
|
||||
75
vault-door-8/VaultDoor8.java
Executable file
@@ -0,0 +1,75 @@
|
||||
// These pesky special agents keep reverse engineering our source code and then
|
||||
// breaking into our secret vaults. THIS will teach those sneaky sneaks a
|
||||
// lesson.
|
||||
//
|
||||
// -Minion #0891
|
||||
import java.util.*;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.security.*;
|
||||
|
||||
class VaultDoor8 {
|
||||
public static void main(String args[]) {
|
||||
Scanner b = new Scanner(System.in);
|
||||
System.out.print("Enter vault password: ");
|
||||
String c = b.next();
|
||||
String f = c.substring(8,c.length()-1);
|
||||
VaultDoor8 a = new VaultDoor8();
|
||||
if (a.checkPassword(f)) {
|
||||
System.out.println("Access granted.");
|
||||
}
|
||||
else {
|
||||
System.out.println("Access denied!");
|
||||
}
|
||||
}
|
||||
|
||||
public char[] scramble(String password) {
|
||||
/* Scramble a password by transposing pairs of bits. */
|
||||
char[] a = password.toCharArray();
|
||||
for (int b=0; b<a.length; b++) {
|
||||
char c = a[b];
|
||||
c = switchBits(c,1,2);
|
||||
c = switchBits(c,0,3);
|
||||
/* c = switchBits(c,14,3);
|
||||
* c = switchBits(c, 2, 0); */
|
||||
c = switchBits(c,5,6);
|
||||
c = switchBits(c,4,7);
|
||||
c = switchBits(c,0,1);
|
||||
/* d = switchBits(d, 4, 5);
|
||||
* e = switchBits(e, 5, 6); */
|
||||
c = switchBits(c,3,4);
|
||||
c = switchBits(c,2,5);
|
||||
c = switchBits(c,6,7);
|
||||
a[b] = c;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
public char switchBits(char c, int p1, int p2) {
|
||||
/* Move the bit in position p1 to position p2,
|
||||
* and move the bit that was in position p2
|
||||
* to position p1. Precondition: p1 < p2 */
|
||||
char mask1 = (char)(1 << p1);
|
||||
char mask2 = (char)(1 << p2);
|
||||
/* char mask3 = (char)(1<<p1<<p2); mask1++; mask1--; */
|
||||
char bit1 = (char)(c & mask1);
|
||||
char bit2 = (char)(c & mask2);
|
||||
/* System.out.println("bit1 " + Integer.toBinaryString(bit1));
|
||||
* System.out.println("bit2 " + Integer.toBinaryString(bit2)); */
|
||||
char rest = (char)(c & ~(mask1 | mask2));
|
||||
char shift = (char)(p2 - p1);
|
||||
char result = (char)((bit1<<shift) | (bit2>>shift) | rest);
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean checkPassword(String password) {
|
||||
char[] scrambled = scramble(password);
|
||||
char[] expected = {
|
||||
0xF4, 0xC0, 0x97, 0xF0, 0x77, 0x97, 0xC0, 0xE4,
|
||||
0xF0, 0x77, 0xA4, 0xD0, 0xC5, 0x77, 0xF4, 0x86,
|
||||
0xD0, 0xA5, 0x45, 0x96, 0x27, 0xB5, 0x77, 0xC2,
|
||||
0xD2, 0x95, 0xA4, 0xF0, 0xD2, 0xD2, 0xC1, 0x95 };
|
||||
return Arrays.equals(scrambled, expected);
|
||||
}
|
||||
}
|
||||
|
||||
41
vault-door-8/sol.py
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/home/maxime/.pyvenv/bin/python3
|
||||
|
||||
def switch(i, a, b):
|
||||
#print(bin(i))
|
||||
|
||||
mask_a = 1<<a
|
||||
mask_b = 1<<b
|
||||
#print(bin(mask_a), bin(mask_b))
|
||||
|
||||
bit_a = i & mask_a
|
||||
bit_b = i & mask_b
|
||||
#print(bin(bit_a), bin(bit_b))
|
||||
|
||||
rest = i & ((mask_a | mask_b) ^ 0xff)
|
||||
#print(bin(rest))
|
||||
|
||||
if bit_a:
|
||||
rest |= mask_b
|
||||
if bit_b:
|
||||
rest |= mask_a
|
||||
#print(bin(rest))
|
||||
#print()
|
||||
|
||||
return rest
|
||||
|
||||
hex = [0xF4, 0xC0, 0x97, 0xF0, 0x77, 0x97, 0xC0, 0xE4, 0xF0, 0x77, 0xA4, 0xD0, 0xC5, 0x77, 0xF4, 0x86,
|
||||
0xD0, 0xA5, 0x45, 0x96, 0x27, 0xB5, 0x77, 0xC2, 0xD2, 0x95, 0xA4, 0xF0, 0xD2, 0xD2, 0xC1, 0x95]
|
||||
|
||||
for c in hex:
|
||||
c = switch(c, 6, 7)
|
||||
c = switch(c, 2, 5)
|
||||
c = switch(c, 3, 4)
|
||||
c = switch(c, 0, 1)
|
||||
c = switch(c, 4, 7)
|
||||
c = switch(c, 5, 6)
|
||||
c = switch(c, 0, 3)
|
||||
c = switch(c, 1, 2)
|
||||
print(chr(c), end='')
|
||||
|
||||
print()
|
||||
|
||||
26
vault_door_training/VaultDoorTraining.java
Executable file
@@ -0,0 +1,26 @@
|
||||
import java.util.*;
|
||||
|
||||
class VaultDoorTraining {
|
||||
public static void main(String args[]) {
|
||||
VaultDoorTraining vaultDoor = new VaultDoorTraining();
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
System.out.print("Enter vault password: ");
|
||||
String userInput = scanner.next();
|
||||
String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
|
||||
if (vaultDoor.checkPassword(input)) {
|
||||
System.out.println("Access granted.");
|
||||
} else {
|
||||
System.out.println("Access denied!");
|
||||
}
|
||||
}
|
||||
|
||||
// The password is below. Is it safe to put the password in the source code?
|
||||
// What if somebody stole our source code? Then they would know what our
|
||||
// password is. Hmm... I will think of some ways to improve the security
|
||||
// on the other doors.
|
||||
//
|
||||
// -Minion #9567
|
||||
public boolean checkPassword(String password) {
|
||||
return password.equals("w4rm1ng_Up_w1tH_jAv4_eec0716b713");
|
||||
}
|
||||
}
|
||||
BIN
what_lies_within/buildings.png
Executable file
|
After Width: | Height: | Size: 611 KiB |