Frida 0xB


通过分析上述代码可以看到主要逻辑还是在native层中的getFlag函数中
下面到so层进行分析

反编译出来发现什么都没有

但在汇编界面又能看到有东西
所以估计是进行了某些操作阻碍了ida的反编译

我们看到这里
它给rbp+var_24赋值为0x0DEADBEEF
cmp [rbp+var_24], 539
又将这个值与0x539比较
所以这段代码永假,所以下面的代码全都会被跳过,不执行
这里直接nop掉
再反编译程序就出来了

所以我们只需要通过hook把刚才那个永假条件改成nop就行
大概思路就是找到那个永假条件的代码对应的地址
然后更改它的十六进制数据
改成90(nop)即可
或者改成74(jz)
具体代码实现是参考网上的wp写的
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| function hookTestB(){ var libc_base = Module.getBaseAddress("libfrida0xb.so") //libc基地址 var jnz = libc_base.add(0x170CE); //JNZ所在偏移 console.log("libc_base : ",libc_base); console.log("jnz : ",jnz);
Memory.protect(jnz, 0x1000, "rwx"); //赋予rwx权限 var writer = new X86Writer(jnz);
// 读取内存范围内的指令 var size = 0x30; // 读取的字节数 var instructionBytes = Memory.readByteArray(jnz, size); console.log("instructionBytes :",instructionBytes); // 解析并输出汇编指令 var instructions = Instruction.parse(jnz, instructionBytes); console.log("instructions :",instructions);
try { for (var i = 0; i < 0x170D4-0x170CE; i++) { //填充6个NOP writer.putNop() } writer.flush();// 刷新指令缓存 } finally {
writer.dispose();// 释放writer对象 }
var instructionBytes = Memory.readByteArray(jnz, size); console.log("new instructionBytes :",instructionBytes); // 解析并输出汇编指令 var instructions = Instruction.parse(jnz, instructionBytes); console.log("new instructions :",instructions); }
function main(){ Java.perform(function(){ hookTestB(); }); } setImmediate(main);
|