Frida 0xB

微信截图_20250710170107

微信截图_20250710170120

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

下面到so层进行分析

微信截图_20250710170221

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

微信截图_20250710170259

但在汇编界面又能看到有东西

所以估计是进行了某些操作阻碍了ida的反编译

微信截图_20250710170513

我们看到这里

它给rbp+var_24赋值为0x0DEADBEEF

cmp [rbp+var_24], 539

又将这个值与0x539比较

所以这段代码永假,所以下面的代码全都会被跳过,不执行

这里直接nop掉

再反编译程序就出来了

微信截图_20250710170823

所以我们只需要通过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);