Модифицировать байт код

 
 
 
Сообщения:5
Сам никогда с таким не сталкивался, вот стало интересно.
Собственно есть jar, который в результате своей работы должен выдать некий код. задача стоит модифицировать его таким образом, чтобы код генерировался сразу.
Сам код очень простой но вот с редактированием байт кода у меня возникли проблемы :(
На мой взгляд необходимо в одной функции изменить возвращаемое значение.
Джарник подкладываю сюда
https://cloud.mail.ru/public/Jrbd/hG2arWE2v
Изменен:06 фев 2019 07:59
 
 
Сообщения:783
и что, вы думаете, кто-то вам поможет, не зная какую функцию изменить и каким образом? или вам все равно, лишь бы поменять?
 
 
Сообщения:5
Если дизасемблировать, то сразу находится метод main, который нужно поменять.
Повторюсь, код простой, но вот байкод никогда раньше в глаза не видел, не пойму как присвоить одно переменной нужное мне значение.
 
 
Сообщения:783
У метода main нет возвращаемого значения.

Приведите здесь байт-код и скажите, что на что поменять.
 
 
Сообщения:5
Код из дизасемблера
public static void main(String[] var0) {
        String var5 = "http://localhost:8091/";
        String var1 = "bill";
        Integer var2 = 0;
        boolean var3 = true;
        Integer var4 = a(var5 + var1);
        var2 = var2 + var4;
        if (var4 != 0) {
            System.out.println("Functional testing: pass");
        } else {
            System.out.println("Functional testing: failed");
            var3 = false;
        }

        var4 = b(var5 + var1);
        var2 = var2 + var4;
        if (var4 == 0) {
            System.out.println("Security testing: pass");
        } else {
            System.out.println("Security testing: failed");
            var3 = false;
        }

        if (var3) {
            a.a.a.a.a.a var6 = new a.a.a.a.a.a();
            var1 = "JwYVIDclGAcMDRc8BQwRBAYXPBcMPAcKEAIBDwY8OzsmHg==";
            var5 = new String(var6.a(a.a(var1)));
            StringBuilder var7 = new StringBuilder();

            for(int var8 = 0; var8 < var5.length(); ++var8) {
                var7.append((char)(var5.charAt(var8) ^ var2));
            }

            System.out.println("Congratulations! Your flag is " + var7.toString());
        }

    }

Собственно. Надо var2 присвоить значение 100.
<method access="public static " desc="([Ljava/lang/String;)V" name="main">
    <exceptions/>
    <code>
      <LDC cst="http://localhost:8091/" desc="Ljava/lang/String;"/>
      <ASTORE var="0"/>
      <LDC cst="bill" desc="Ljava/lang/String;"/>
      <ASTORE var="1"/>
      <ICONST_0/>
      <INVOKESTATIC desc="(I)Ljava/lang/Integer;" itf="false" name="valueOf" owner="java/lang/Integer"/>
      <ASTORE var="2"/>
      <ICONST_1/>
      <ISTORE var="3"/>
      <NEW desc="java/lang/StringBuilder"/>
      <DUP/>
      <INVOKESPECIAL desc="()V" itf="false" name="&lt;init&gt;" owner="java/lang/StringBuilder"/>
      <ALOAD var="0"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)Ljava/lang/StringBuilder;" itf="false" name="append" owner="java/lang/StringBuilder"/>
      <ALOAD var="1"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)Ljava/lang/StringBuilder;" itf="false" name="append" owner="java/lang/StringBuilder"/>
      <INVOKEVIRTUAL desc="()Ljava/lang/String;" itf="false" name="toString" owner="java/lang/StringBuilder"/>
      <INVOKESTATIC desc="(Ljava/lang/String;)Ljava/lang/Integer;" itf="false" name="a" owner="main/CheckerXXE"/>
      <ASTORE var="4"/>
      <ALOAD var="2"/>
      <INVOKEVIRTUAL desc="()I" itf="false" name="intValue" owner="java/lang/Integer"/>
      <ALOAD var="4"/>
      <INVOKEVIRTUAL desc="()I" itf="false" name="intValue" owner="java/lang/Integer"/>
      <IADD/>
      <INVOKESTATIC desc="(I)Ljava/lang/Integer;" itf="false" name="valueOf" owner="java/lang/Integer"/>
      <ASTORE var="2"/>
      <ALOAD var="4"/>
      <INVOKEVIRTUAL desc="()I" itf="false" name="intValue" owner="java/lang/Integer"/>
      <IFEQ label="0"/>
      <GETSTATIC desc="Ljava/io/PrintStream;" name="out" owner="java/lang/System"/>
      <LDC cst="Functional testing: pass" desc="Ljava/lang/String;"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)V" itf="false" name="println" owner="java/io/PrintStream"/>
      <GOTO label="1"/>
      <Label name="0"/>
      <frame type="NEW">
        <local type="java/lang/String"/>
        <local type="java/lang/String"/>
        <local type="java/lang/Integer"/>
      </frame>
      <GETSTATIC desc="Ljava/io/PrintStream;" name="out" owner="java/lang/System"/>
      <LDC cst="Functional testing: failed" desc="Ljava/lang/String;"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)V" itf="false" name="println" owner="java/io/PrintStream"/>
      <ICONST_0/>
      <ISTORE var="3"/>
      <Label name="1"/>
      <frame type="NEW">
        <local type="java/lang/String"/>
        <local type="java/lang/String"/>
        <local type="java/lang/Integer"/>
        <local type="int"/>
      </frame>
      <NEW desc="java/lang/StringBuilder"/>
      <DUP/>
      <INVOKESPECIAL desc="()V" itf="false" name="&lt;init&gt;" owner="java/lang/StringBuilder"/>
      <ALOAD var="0"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)Ljava/lang/StringBuilder;" itf="false" name="append" owner="java/lang/StringBuilder"/>
      <ALOAD var="1"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)Ljava/lang/StringBuilder;" itf="false" name="append" owner="java/lang/StringBuilder"/>
      <INVOKEVIRTUAL desc="()Ljava/lang/String;" itf="false" name="toString" owner="java/lang/StringBuilder"/>
      <INVOKESTATIC desc="(Ljava/lang/String;)Ljava/lang/Integer;" itf="false" name="b" owner="main/CheckerXXE"/>
      <ASTORE var="4"/>
      <ALOAD var="2"/>
      <INVOKEVIRTUAL desc="()I" itf="false" name="intValue" owner="java/lang/Integer"/>
      <ALOAD var="4"/>
      <INVOKEVIRTUAL desc="()I" itf="false" name="intValue" owner="java/lang/Integer"/>
      <IADD/>
      <INVOKESTATIC desc="(I)Ljava/lang/Integer;" itf="false" name="valueOf" owner="java/lang/Integer"/>
      <ASTORE var="2"/>
      <ALOAD var="4"/>
      <INVOKEVIRTUAL desc="()I" itf="false" name="intValue" owner="java/lang/Integer"/>
      <IFNE label="2"/>
      <GETSTATIC desc="Ljava/io/PrintStream;" name="out" owner="java/lang/System"/>
      <LDC cst="Security testing: pass" desc="Ljava/lang/String;"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)V" itf="false" name="println" owner="java/io/PrintStream"/>
      <GOTO label="3"/>
      <Label name="2"/>
      <frame type="NEW">
        <local type="top"/>
        <local type="top"/>
        <local type="java/lang/Integer"/>
      </frame>
      <GETSTATIC desc="Ljava/io/PrintStream;" name="out" owner="java/lang/System"/>
      <LDC cst="Security testing: failed" desc="Ljava/lang/String;"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)V" itf="false" name="println" owner="java/io/PrintStream"/>
      <ICONST_0/>
      <ISTORE var="3"/>
      <Label name="3"/>
      <frame type="NEW">
        <local type="top"/>
        <local type="top"/>
        <local type="java/lang/Integer"/>
        <local type="int"/>
      </frame>
      <ILOAD var="3"/>
      <IFEQ label="4"/>
      <NEW desc="a/a/a/a/a/a"/>
      <DUP/>
      <INVOKESPECIAL desc="()V" itf="false" name="&lt;init&gt;" owner="a/a/a/a/a/a"/>
      <ASTORE var="0"/>
      <NEW desc="java/lang/String"/>
      <DUP/>
      <ALOAD var="0"/>
      <LDC cst="JwYVIDclGAcMDRc8BQwRBAYXPBcMPAcKEAIBDwY8OzsmHg==" desc="Ljava/lang/String;"/>
      <ASTORE var="1"/>
      <DUP/>
      <ASTORE var="0"/>
      <ALOAD var="1"/>
      <INVOKESTATIC desc="(Ljava/lang/String;)[B" itf="false" name="a" owner="main/a"/>
      <INVOKEVIRTUAL desc="([B)[B" itf="false" name="a" owner="a/a/a/a/a/b"/>
      <INVOKESPECIAL desc="([B)V" itf="false" name="&lt;init&gt;" owner="java/lang/String"/>
      <ASTORE var="0"/>
      <NEW desc="java/lang/StringBuilder"/>
      <DUP/>
      <INVOKESPECIAL desc="()V" itf="false" name="&lt;init&gt;" owner="java/lang/StringBuilder"/>
      <ASTORE var="1"/>
      <ICONST_0/>
      <ISTORE var="3"/>
      <Label name="5"/>
      <frame type="NEW">
        <local type="java/lang/String"/>
        <local type="java/lang/StringBuilder"/>
        <local type="java/lang/Integer"/>
        <local type="int"/>
      </frame>
      <ILOAD var="3"/>
      <ALOAD var="0"/>
      <INVOKEVIRTUAL desc="()I" itf="false" name="length" owner="java/lang/String"/>
      <IF_ICMPGE label="6"/>
      <ALOAD var="1"/>
      <ALOAD var="0"/>
      <ILOAD var="3"/>
      <INVOKEVIRTUAL desc="(I)C" itf="false" name="charAt" owner="java/lang/String"/>
      <ALOAD var="2"/>
      <INVOKEVIRTUAL desc="()I" itf="false" name="intValue" owner="java/lang/Integer"/>
      <IXOR/>
      <I2C/>
      <INVOKEVIRTUAL desc="(C)Ljava/lang/StringBuilder;" itf="false" name="append" owner="java/lang/StringBuilder"/>
      <POP/>
      <IINC inc="1" var="3"/>
      <GOTO label="5"/>
      <Label name="6"/>
      <frame type="NEW">
        <local type="top"/>
        <local type="java/lang/StringBuilder"/>
      </frame>
      <GETSTATIC desc="Ljava/io/PrintStream;" name="out" owner="java/lang/System"/>
      <NEW desc="java/lang/StringBuilder"/>
      <DUP/>
      <LDC cst="Congratulations! Your flag is " desc="Ljava/lang/String;"/>
      <INVOKESPECIAL desc="(Ljava/lang/String;)V" itf="false" name="&lt;init&gt;" owner="java/lang/StringBuilder"/>
      <ALOAD var="1"/>
      <INVOKEVIRTUAL desc="()Ljava/lang/String;" itf="false" name="toString" owner="java/lang/StringBuilder"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)Ljava/lang/StringBuilder;" itf="false" name="append" owner="java/lang/StringBuilder"/>
      <INVOKEVIRTUAL desc="()Ljava/lang/String;" itf="false" name="toString" owner="java/lang/StringBuilder"/>
      <INVOKEVIRTUAL desc="(Ljava/lang/String;)V" itf="false" name="println" owner="java/io/PrintStream"/>
      <Label name="4"/>
      <frame type="NEW"/>
      <RETURN/>
      <Max maxLocals="5" maxStack="4"/>
    </code>
  </method>
 
 
Сообщения:783
var2 присваивается в 3х местах. Какое место заменить на var2=100? или надо добавить новое присваивание?
 
 
Сообщения:5
Перед if (var3) { присвоить значение 100. Больше ничего не надо.
 
 
Сообщения:783
Надо взять декомпилированный Java-текст, сделать в нем исправления, скомпилировать в байт-код, сконвертировать в XML, и будет видно, что надо заменить в XML-представлении всей программы.
При компиляции добавить джарник в classpath, там должен быть нужный для компиляции класс a.a.a.a.a.a. Ну или можно его изготовить заново, пустой с дефолтным конструктором.
 
 
Сообщения:5
проблема в том, что я не могу разобраться со стеком.
Как в него класть, что доставать.
Мне удалось убрать if (var3), но вот при любых попытках пушнуть в переменную var4 нужную мне константу, вылетает ошибка.
 
 
Сообщения:783
var4 или все-таки var2?

там все просто - загрузили константу на стек, и записали с помощью <ASTORE var="4"/>
Только надо учесть, что тип var4 - Integer, а не int. Компилятор сам везде вставил преобразования от int к Integer перед записью, вам надо сделать то же самое.

"нужную мне константу", "вылетает ошибка" - вы хотите реальную помощь получить или просто поплакаться на тяжелую судьбу хакера? Если помощь, то надо показать, что за константу вы пытаетесь записать, и каков текст ошибки.
 
Модераторы:alon4iknazicaTaky_
Сейчас эту тему просматривают:Нет