攻防世界 mobile 丛林的秘密
攻防世界 mobile 丛林的秘密 先进jadx中看java代码 看到有个check_key 先跟进去看看 发现在native层直接进so文件里面看 找到验证函数 根据代码分析 v6应该就是我们输入的数据 伪随机数先和aD584a68d4e213d数组比较 不等于的话返回1 再去和v6比较 很明显这是不会成立的 不由得怀疑这是不是假的check_key函数 我们在native层还看到了另一个函数sayHello 不妨换个思路 点进去看看 发现传入了一个本地网址 http://127.0.0.1:8000 再跟进JNI_OnLoad函数 这是一个so文件初始化的函数 加载so文件会优先加载这个函数 跟进inti_proc 这个函数主要是进行了服务器初始化的操作 对byte_3010这一数据进行了一系列解密处理 有点像smc自解密 一开始想通过动态调试解决这个代码问题 但是一直调不了 也找不到问题出在哪 又看到nullsub_函数对这个服务器发送了一个请求 把解密之后的byte_3010数据传到了服务器上 所以可以从服务器中直接读取数据 12adb shellcu...
L3Hctf复现
L3Hctf复现ez_android先将程序拖进jadx中分析 找到MainActivity 通过mainactivity找到TauriActivity 再通过TauriActivity找到WryActivity 发现主要逻辑都在native层里面 把so文件放进ida中分析 随便填点东西在程序里 输出了Wrong answer 再根据这个字符串在so层里面找 找到了greet函数 这里采用正向爆破的方法 代码如下 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include<stdio.h>#include <memory.h>#include<stdint.h>void jiami(uint8_t *a){ uint64_t v10; uint8_t v11; unsigned char aDghpc2lzywtleq[]="dGhpc2lzYWtleQ&quo...
Frida 0xB
Frida 0xB 通过分析上述代码可以看到主要逻辑还是在native层中的getFlag函数中 下面到so层进行分析 反编译出来发现什么都没有 但在汇编界面又能看到有东西 所以估计是进行了某些操作阻碍了ida的反编译 我们看到这里 它给rbp+var_24赋值为0x0DEADBEEF cmp [rbp+var_24], 539 又将这个值与0x539比较 所以这段代码永假,所以下面的代码全都会被跳过,不执行 这里直接nop掉 再反编译程序就出来了 所以我们只需要通过hook把刚才那个永假条件改成nop就行 大概思路就是找到那个永假条件的代码对应的地址 然后更改它的十六进制数据 改成90(nop)即可 或者改成74(jz) 具体代码实现是参考网上的wp写的 代码如下 12345678910111213141516171819202122232425262728293031323334353637383940function hookTestB(){var libc_base = Module.getBaseAddress("libfrida0...
Frida 0xA
Frida 0xA 基本上都是些初始化及画面设置的代码主要就是native层的stringFromJNI 仔细分析了一下 发现也没有什么和flag有关的东西 再看看左手边的函数表 发现有一个get_flag 所以我们需要主动调用so文件中的get_flag并在日志中查看即可 这里需要注意的是get_flag在so文件中并非真叫get_flag 而是需要切到汇编函数中去看 函数名字为_Z8get_flagii 代码如下 1234567891011121314151617181920function hookTestA(){var funcAddr = Module.findExportByName("libfrida0xa.so","_Z8get_flagii");//声明函数指针if (!funcAddr) { console.error("Function not found!"); return; }//NativeFunction的第一个参数是...
Frida 0x9
Frida 0x9 由上面的代码可知 我们只需要修改check_flag的值,让它返回值为1337即可 下面进到so层看看 代码如下 12345678910111213141516function hookTest9(){ let MainActivity = Java.use("com.ad2001.a0x9.MainActivity");MainActivity["check_flag"].implementation = function () { console.log(`MainActivity.check_flag is called`); let result = this["check_flag"](); console.log(`MainActivity.check_flag result=${result}`); return 1337;};}function main(){ Java.per...
Frida 0x8
Frida 0x8 可以看到这里的主要逻辑就是cmpstr这个方法,而这个方法又是在native层实现的,所以我们要进到so文件里面去看 从这我们可以看出s1就是我们输入的ip s2就是flag 所以,我们可以通过hook strcmp这个函数 来获取s2的值 但是需要注意的是 strcmp这个函数在很多地方都会被调用 所以直接打印s2的值会有很多值 但是也能从输出的数据找到flag 但也费时间 这里优化了一下 当s1的值满足特定条件的时候我们再输出s2的值 在代码中我是让s1=123 代码如下 1234567891011121314151617181920212223242526272829303132function hookTest8(){ Java.perform(function(){ //根据导出函数名打印地址 var helloAddr = Module.findExportByName("libfrida0x8.so","strcmp"); c...
Frida 0x7
Frida 0x7 根据如上代码,这一题有两个思路 第一个是hook Checker类的构造方法, 让num1>512并且num2>512即可输出flag 第二个思路是利用Checker类的构造方法再构造一个新的Checker类,传的num1和num2都要大于512 再把这个类传给flag方法,即可输出flag 代码如下 这里需要注意的是,方法1需要通过frida中的-f来启动,用-F来启动无法实现,因为程序在启动时就已经执行了flag(ch);所以即使hook了构造方法ch也已经通过hook之前的构造方法生成了 123456789101112131415161718function hookTest7_1(){ var utils = Java.use("com.ad2001.frida0x7.Checker"); //修改类的构造函数的实现,$init表示构造函数 utils.$init.overload('int','int').implementation = funct...
Frida 0x6
Frida 0x6 看到如上代码可以得出 代码中写了get_flag 但没有地方调用它 所以,我们要通过hook Checker这个构造方法构造一个Checker类再给里面的num1和num2赋值 让num1=1234,num2==4321 再传入get_flag中,即可在程序中输出flag 代码如下 1234567891011121314151617181920212223function hookTest6(){ var ret = null; Java.perform(function () { Java.choose("com.ad2001.frida0x6.MainActivity",{ //要hook的类 onMatch:function(instance1){ var utils = Java.use("com.ad2001.frida0x6.Checker");...
Frida 0x5
Frida 0x5 根据上述代码可知 我们需要用hook非静态方法的方式hook flag方法 让code==1337即可 12345678910111213141516171819function hookTest5(){ var ret = null; Java.perform(function () { Java.choose("com.ad2001.frida0x5.MainActivity",{ //要hook的类 onMatch:function(instance){ instance.flag(1337); //要hook的方法 }, onComplete:function(){ //console.log("result: " + ret); ...
Frida 0x4
Frida 0x4 这里我们照常看到mainactivity 发现只是对这个界面进行了一些设置 没有flag 又看到存在一个check类 点开里面发现有get_flag函数 但是这个方法实现完flag并不会输出到程序中去,而是作为返回值 所以我们需要通过hook构造一个Check类,再调用这个类中的get_flag令a==1337并且打印执行这个方法之后的返回值 12345678910111213function hookTest4(){ var ClassName=Java.use("com.ad2001.frida0x4.Check"); var instance = ClassName.$new(); var a=instance.get_flag(1337); console.log(a);}function main(){ Java.perform(function(){ hookTest4(); ...