seeded randomizer Writeup
Hsctf 2021
Solved By : thewhiteh4t
- we are given a java file with two functions
import java.util.Random;
public class SeededRandomizer {
public static void display(char[] arr) {
for (char x: arr)
System.out.print(x);
System.out.println();
}
public static void sample() {
Random rand = new Random(79808677);
char[] test = new char[12];
int[] b = {9, 3, 4, -1, 62, 26, -37, 75, 83, 11, 30, 3};
for (int i = 0; i < test.length; i++) {
int n = rand.nextInt(128) + b[i];
test[i] = (char)n;
}
display(test);
}
public static void main(String[] args) {
// sample();
// Instantiate another seeded randomizer below (seed is integer between 0 and 1000, exclusive):
char[] flag = new char[33];
int[] c = {13, 35, 15, -18, 88, 68, -72, -51, 73, -10, 63,
1, 35, -47, 6, -18, 10, 20, -31, 100, -48, 33, -12,
13, -24, 11, 20, -16, -10, -76, -63, -18, 118};
for (int i = 0; i < flag.length; i++) {
int n = (int)(Math.random() * 128) + c[i];
flag[i] = (char)n;
}
display(flag);
}
}
- sample prints “Hello World”
- random is initialized with a constant seed
79808677
Random rand = new Random(79808677);
- this means that the value produced by random will now be constant every time we execute the script
- our flag is in main and this time
Math.random
is used instead of previous approach - but in the comments we can see that they have mentioned the range of seed which lies between 0 and 1000
- I modified main to bruteforce random with seeds from 0 to 1000
public static void main(String[] args) {
//sample();
// Instantiate another seeded randomizer below (seed is integer between 0 and 1000, exclusive):
char[] flag = new char[33];
int[] c = {13, 35, 15, -18, 88, 68, -72, -51, 73, -10, 63,
1, 35, -47, 6, -18, 10, 20, -31, 100, -48, 33, -12,
13, -24, 11, 20, -16, -10, -76, -63, -18, 118};
for (int x = 0; x < 1001; x++) {
Random rand = new Random(x);
for (int i = 0; i < flag.length; i++) {
int n = rand.nextInt(128) + c[i];
flag[i] = (char)n;
}
display(flag);
}
}
Output :