Parte 3
- Argumentos predominantes:
→ Interceptor arguments:
→ onEnter: function(args);
⇒ args: son un tipo de Puntero nativo.
1 | var sleep = Module.getExportByName(null, "sleep"); |
- Ponemos el programa en marcha:
1 | ./pew |
- Hacemos un attach con el nuevo interceptador
1 | frida pew -l interceptor-attach.js |
- Podemos observar como llegamos a obtener el argumento que se le pasa a sleep(), a través de args[0];
• Ahora modificaremos el argumento de sleep() con Integers:
args[0] = ptr(“0x01”);
Ó
args[0] = new NativePointer(“0x01”);
1 | var sleep = Module.getExportByName(null, "sleep"); |
Pasemos ahora a modificaciones con strings:
Localizar un nuevo array de caracteres con Memory.allocUtf8String y guardar el puntero.
Asignar el argumento al valor del nuevo puntero
¿Merece la pena?
⇒ Sobreescribir el argumento printf():
1
2
3
4
5
6
7
8
9
10
11var printf = Module.getExportByName(null, "printf");
// Allocate a new memory region, returning the pointer to the string.
var buf = Memory.allocUtf8String("Frida sleep! :D\n");
Interceptor.attach(printf, {
onEnter: function(args) {
// console.log("printf(\"" + args[0].readCString().trim() + "\")");
args[0] = buf; // update the argument to printf
}
});
También hay acceso al registro de la siguiente manera:
1 | var printf = Module.getExportByName(null, "printf"); |
*(Va guardando los valores en el registro rsi).*
Sobreescribiendo valores de retorno:
Interceptar valores de retorno
→ onLeave: function(retval);
Ahora buscaremos nuestro objetivo, rand_range:
- La API que usaremos para obtener la dirección será:
1
2[Local::pew]-> DebugSymbol.getFunctionByName("rand_range");
"0x55f2f2a39185"Usaremos lo siguiente:
1 | var rand_range = DebugSymbol.getFunctionByName("rand_range"); |
Para remplazar in valor de retorno, llamaremos a replace():
- retval.replace(prt(“0x01”));
(Independientemente del valor que devuelve rand_range, lo que haremos será forzar el cambio a 1).
Databinding entre onEnter y onLeave:
1 | onEnter: ftunction(a) { |
→ Nos saldrá uno en el sleeping debido a que arg1 siempre valdrá uno por que adquiere el valor del primer argumento.