defcon, написал ... дайте мне конфетку ... обещали дать
)))
Понятно что это компилированный ява класс ….
Исходя из того что класс называется ZTChallenge
Переименовываем 1.bin -> ZTChallenge.class
Запускаем …
Засада … декомпилируем …. Получается, что-то вроде такого
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class ZTChallenge extends URLClassLoader
{
public ZTChallenge(URL aurl[])
{
super(aurl);
}
protected Class findClass(String s)
throws ClassNotFoundException
{
return defineClass(s, TWISTED, 0, TWISTED.length);
}
public static void main(String args[])
throws Exception
{
_L1:
if(byte1 != 0)
break MISSING_BLOCK_LABEL_18;
JVM INSTR pop ;
byte1 = 2;
fixMe();
break MISSING_BLOCK_LABEL_31;
args;
System.out.println("Wow! I have encountered an exception. It must be a bug!\nPlease fix it, so I can get further.");
System.exit(1);
Class class1;
args = new int[3];
args[0] = 42;
args[1] = 64;
args[2] = 100;
args = args;
for(int i = 0; i < TWISTED.length; i++)
{
byte byte0 = (byte)(TWISTED[i] ^ args[i % 3]);
TWISTED[i] = byte0;
}
System.out.println("You're on the right track! Lets see how much you know about debugging concurrency issues\n.");
System.out.println("Aaaargh, I think I'm stuck....");
class1 = (new ZTChallenge(new URL[0])).findClass(null);
args = class1.getDeclaredMethod("go", new Class[0]);
Object obj = class1.newInstance();
args.invoke(obj, new Object[0]);
return;
byte byte1 = 0;
byte1 = 0;
null;
goto _L1
}
private static void fixMe()
{
if(42 != 100)
throw new IllegalArgumentException("Fix me! Please!");
else
return;
}
static final byte TWISTED[];
static
{
byte abyte0[] = new byte[2249];
abyte0[0] = -32;
abyte0[1] = -66;
abyte0[2] = -34;
abyte0[3] = -108;
.....
abyte0[2246] = 102;
abyte0[2247] = 42;
abyte0[2248] = 117;
TWISTED = abyte0;
}
}
По логике вещей видим … из преобразованного массива создают класс и соответвенно экземпляр этого класса … и вызывают метод «go» .
Но нам париться не хочется … разбираться во всей этой бороде … тут ключивой момент преобразование массива … т.е.
for(int i = 0; i < TWISTED.length; i++)
{
byte byte0 = (byte)(TWISTED[i] ^ args[i % 3]);
TWISTED[i] = byte0;
}
Переделываем ZTChallenge в
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class ZTChallenge extends URLClassLoader {
public ZTChallenge(URL aurl[]) {
super(aurl);
}
protected Class findClass(String s) throws ClassNotFoundException {
return defineClass(s, TWISTED, 0, TWISTED.length);
}
public static void main(String arg[])
throws Exception
{
DataOutputStream dos = new DataOutputStream(new FileOutputStream("/lab/result.class"));
Class class1;
int[] args = new int[3];
args[0] = 42;
args[1] = 64;
args[2] = 100;
for(int i = 0; i < TWISTED.length; i++)
{
byte byte0 = (byte)(TWISTED[i] ^ args[i % 3]);
TWISTED[i] = byte0;
dos.write(TWISTED[i]);
}
dos.close();
}
static final byte TWISTED[];
static {
byte abyte0[] = new byte[2249];
abyte0[0] = -32;
...
abyte0[2248] = 117;
TWISTED = abyte0;
}
}
На выходе получаем … result.class ….
Завтра продолжение!!!
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...