Ph0en1x-100

附件下载

https://adworld.xctf.org.cn/media/task/attachments/f6adc401d0eb472892a4ac4481f76a85.apk

分析

上手第一步还是看app逻辑, 可以看的出来 输入flag 判断正确与否,又是一个算法题。

打开jadx 找到MainActivity,很明显就可以看到Success

目标:输入正确的flag 让if 判断成立

1
2
先对输入的字符串进行了一次encrypt, 之后在进行一次getSecret ,然后和getFlag() 做了一次判断是否相等
getSecret(getFlag()).equals(getSecret(encrypt(this.etFlag.getText().toString())))

分析encrypt 函数

在jadx中查看函数声明,居然是so里面的,分析吧

搜索字符串 关键字Java_ 直接找到加密方法,进去看看调用逻辑,并不是很难。

然后看看伪代码

a1 是传入进去的字符串,然后 i 是v2的第一个字符,对i的值进行减一 那他这里就是一个位移加密了。

分析getFlag()

分析了半天,感觉静态分析很难,然后看了下别人的思路,我是着实没想到,把这个方法运行一下就得到了flag

得到字符串后编写脚本拿到flag

脚本

1
2
3
4
5
6
7
flag = "ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|"
result = ""

for i in flag:
result += chr((ord(i)+1))

print(result)

result:flag{Ar3_y0u_go1nG_70_scarborough_Fair}

其他解

之后我看了下网上的解法,很多,这里用一个frida hook 拿到getflag 和动态调试拿到flag来演示

frida hook getFlag

编写脚本 hook代码

命令: frida -U com.ph0en1x.android_crackme -l Hook.js

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
function hookphone100() {
Java.perform(function () {
var getFlag = Module.findExportByName("libphcm.so","Java_com_ph0en1x_android_1crackme_MainActivity_getFlag");
console.log(getFlag);
if (getFlag != NULL){
Interceptor.attach(getFlag,{
onEnter:function (args) {

},
onLeave:function (retval) {
var String_java = Java.use('java.lang.String');
var args_4 = Java.cast(retval, String_java)
console.log(retval);
console.log(retval.toInt32());
console.log("getFlag()==>"+args_4)
}
})
}
})
}
function main() {
Java.perform(function () {
hookphone100();
});
}

setImmediate(main);

动态调试

动态调试 看了西米露表姐的wp ,我也尝试使用jeb 进行动态调试。

先以调试模式启动待调试apk,多下点准没错 然后在如图位置 得到了getFlag()的值。

相关文章
评论
分享
  • Hook jni 主动调用

    Hook jni 主动调用要对hellofromc 进行主动调用,修改返回值,但是这里不能直接通过replace去修改返回值,而是要通过newstringutf 去修改返回值。 1234567891011121314151617181...

    Hook jni 主动调用
  • jni函数hook

    jni函数hook(计算 地址方式)12345678910111213141516171819202122232425262728293031323334353637function hookTest9() { Jav...

    jni函数hook
  • Hook 计算非导出函数地址

    hook 读写内存数据对string字符串,可能是加密的,可以通过直接hook 加载的内存数据来读取解密状态的字符串 123456789读取内存字符串数据function hookTest7() { var soAdd...

    Hook 计算非导出函数地址
  • Hook dlopen

    hook dlopen在刚开始hook 我们必须使得app加载so 才能hook, 我们可以hookdlopen 获取到so在那加载,在高版本中有一些so会走android_dlopen_ext 1234567891011121314...

    Hook dlopen
  • Hook 获取指针参数的返回值

    Hook 获取指针参数的返回值在c语言中,一般都会以指针传递返回的值 ,没有return 或者return为true hook sub_750 打印参数和输出 12345678910111213141516171819functio...

    Hook 获取指针参数的返回值
  • Hook 导出函数和修改函数参数返回值

    Hook 导出函数123456789101112131415161718192021222324252627282930// hook 导出函数function hookTest1() { var addAddr =...

    Hook 导出函数和修改函数参数返回值
  • Hook Java层通杀

    Hook 通杀Hook 普通方法和修改函数参数返回值fradaserver 是手机端的, android低版本 frida 尽量低版本 fridaserver版本要与frida库版本一致 不同平台用不同fridaserver 不要和...

    Hook Java层通杀
  • Hook so 导入导出表

    hook so 导入导出表启动frida打开两个cmd 窗口 12345第一个cmd窗口adb shellsucd /data/local/tmp./fx // 这个是frida-server-12.8.14-android-x86...

    Hook so 导入导出表
  • 最右登录协议分析

    Hey, password is required here. 184ec4c94e65a4b619ea732bd39a29aaf452514072ddb6dff084e29ad47fa9af...

    最右登录协议分析
  • 攻防世界-RememberOther

    RememberOther附件下载https://adworld.xctf.org.cn/media/task/attachments/476d9022bb0449c09c0b1e24f0686b66.zip 分析先安装 然后看看逻辑...

    攻防世界-RememberOther
Please check the comment setting in config.yml of hexo-theme-Annie!