13- Input Validation Issues - Part 3

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
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
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
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
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