😫今天终于想起来复现了,这次比赛没做出来一道题,好惨

hook_fish

分析过程

timu

总之就是输入flag验证是否正确

先找到主函数

main

check验证函数应该在hook_fish.dex中,根据fish函数的参数hookfish找到下载链接

down

输入的flag先经过本地encrypt函数加密,再经过hook_fish.dex中的check方法进行混淆

解密过程

jiemi

check方法用哈希映射加密,在mainactivity中保留了decode方法,可以用hook方法解密

1
2
3
4
5
6
7
8
9
10
11
12
Java.perform(function() {
var MainActivity =
Java.use("com.example.hihitt.MainActivity");
console.log("找到类: com.example.hihitt.MainActivity");
//hook 掉删除的方法,并直接在此方法中进行解密
MainActivity.fish_fade.implementation = function() {
console.log("阻止删除了文件");
var result =
this.decode("jjjliijijjjjjijiiiiijijiijjiijijjjiiiiijjjjliiijijjjjljjiilijijiiiiiljiijjiiliiiiiiiiiiiljiijijiliiiijjijijjijijijijiilijiijiiiiiijiljijiilijijiiiijjljjjljiliiijjjijiiiljijjijiiiiiiijjliiiljjijiiiliiiiiiljjiijiijiijijijjiijjiijjjijjjljiliiijijiiiijjliijiijiiliiliiiiiiljiijjiiliiijjjliiijjljjiijiiiijiijjiijijjjiiliiliiijiijijijiijijiiijjjiijjijiiiljiijiijilji");
console.log("解密结果: " + result);
};
});

得到解密结果: 0qksrtuw0x74r2n3s2x3ooi4ps54r173k2os12r32pmqnu73r1h432n301twnq43prruo2h5

然后逆向解密

jiemi

code函数的作用就是每两个字节之间交换顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main(){
unsigned char encode[73] =
"0qksrtuw0x74r2n3s2x3ooi4ps54r173k2os12r32pmqnu73r1h432n301twnq43prruo2h5";
for(int i =0;i<72;i++){
if(encode[i] >='0' && encode[i]<='9'){
encode[i]= (encode[i]-(i%4))+49;
}else{
encode[i]= (encode[i]-(i%10))- 55;
}
}
for(int i=0;i<72;i+=2){
char tmp = encode[i];
encode[i]=encode[i+1];
encode[i+1]=tmp;
}
for(int i=0;i<72;i++){
printf("%c",encode[i]);
}
}
//结果为9a9287988abfb9a3b6a978b075bda3afb274bba38c7493afa3b1bda3aa7597ac6575b0c1

flag