Skip to content

13- Input Validation Issues - Part 3

Pasted image 20260828105531

Tiene toda la pinta que esto va ser un Buffer Overflow

Primero de todo porque se vuelve a usar la misma librería en C

java
public class InputValidation3Activity extends AppCompatActivity {
    private DivaJni djni;

    @Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.BaseFragmentActivityDonut, android.app.Activity
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input_validation3);
        this.djni = new DivaJni();
    }

    public void push(View view) {
        EditText cTxt = (EditText) findViewById(R.id.ivi3CodeText);
        if (this.djni.initiateLaunchSequence(cTxt.getText().toString()) != 0) {
            Toast.makeText(this, "Launching in T - 10 ...", 0).show();
        } else {
            Toast.makeText(this, "Access denied!", 0).show();
        }
    }
}

Y el código del método al que se llama es

java
bool Java_jakhar_aseem_diva_DivaJni_initiateLaunchSequence (long *param_1,undefined8 param_2,undefined8 param_3)

{
  int iVar1;
  char *__src;
  char local_18 [24];
  
  __src = (char *)(**(code **)(*param_1 + 0x548))(param_1,param_3,0);
  strcpy(local_18,__src);
  if (local_18[0] == '!') {
    local_18[0] = '.';
  }
  iVar1 = strncmp(".dotdot",local_18,7);
  return iVar1 == 0;
}

Para que se lancen los misiles, lo único que tenemos que hacer es poner :

.dotdot
Pasted image 20260828111427

Pero lo que tenemos que hacer es crashear la App no lanzar los misiles:

SI metemos muchas As peta la Activity:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Esto se debe a esta línea, copia el input del usuario en la variable local local_18

Podemos escribir lo que queramos sin límite, por lo que podemos escribir en la pila hasta sobreescribir la dirección de retorno y crashear el programa cuando retorne de la función Java_jakhar_aseem_diva_DivaJni_initiateLaunchSequence

c
strcpy(local_18,__src);

Podemos calcular el offset y nos daremos cuenta que con 37 As sobreescribimos la dirección de retorno y crashea el programa

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

De ahí podríamos tratar de conseguir RCE, la cosa es que en android hay ASRL/PIE etc. y necesitaríamos un leak para hacer un ret2LIBc

Notas personales de seguridad ofensiva.