图文精华

易锦教育»学术中心 学术交流社区 作业中心 Android逆向精英班(第一期) 2021-09-08 精英班学员
分享

2021-09-08 精英班学员

分析附件中的APP程序,调试里面的两个native函数,获取正确的flag。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
选择远比努力更重要!
回复

使用道具 举报

已有(16)人评论

跳转到指定楼层
枯燥的小飞机 发表于 2021-9-9 19:22:25
本帖最后由 枯燥的小飞机 于 2021-9-10 12:58 编辑

调试两个native方法,得到正确的flag:
1.拿到apk,先拖到jadx-gui反编译分析java代码,得出结论:正确的flag是通过java层输入的字符串,传到so层通过encrypt(String str)方法得到结果,再与so层生成的字符串作对比,如果相等,那么flag正确。由于比较前两个字符串都会调用getSecret(String string)进行加密,所以java层的getSecret(String string)不过是障眼法。

2.接下来分析getFlag()方法,由于它没有传任何参数,所以可以肯定,该方法的返回值完全在so层生成,要得到被native修饰的getFlag()方法的返回值,我们需要利用ida进行动态调试。在动态调试之前,我们可以先把apk?lib/v7a目录下的唯一so文件拖出来静态分析一遍(如果有多个so,可以根据java层的system.loadlibrary(XXX)方法拿到正确的so)。so拖进ida,打开函数和导出窗口,我们能非常容易的看到java层的两个native方法是静态注册的。

3.开始动态调试,如何启动android_server附加目标进程这里我就不详细说了直接跳过


4.通过学习ndk的相关知识,我们知道静态注册的方法,实际上会有两个固定参数(JNIEnv* , jobject/jclass),通过上面java层的分析我们知道该函数并未传参,所以这里断定这个的参数是env,那么现在就需要导入jni.h头文件并添加相应的结构体,修改参数以方便识别函数。



5.改好类型之后,直接拉到函数尾部,为什么要这样?因为我们只需要返回值,不需要关注过程,java层是根据它的返回值来判断输入是否合法的!搞明白这一点就好办了,那就下断让程序跑起来在即将返回之前端下来就好了,那么问题一下就简化了


6.成功断下,开始f8单步调试。




7.当然上面的寄存器好几个都存有值,为什么我就断定是那个数据呢,其实看过函数流程就知道另外的字符串是在函数内部声明的字符串,当然也是经过hook验证过正确性的,这里就不细说了。到了这步就意味着我们已经获取到了so层的flag字段,那么我们到底该输入什么样的flag才能与我们刚获取的flag相等呢?就要开始分析我们另一个native方法了,前面的步骤和之前一样,直接来到关键点




8.一开始看到那个for循环有点懵逼,字符串的地址减去字符串的地址是啥?字符串地址小于字符串长度是啥?后来仔细一想for循环的执行流程想明白了答案:for(表达式1;表达二;表达式3){循环体 ... },表达式1是初始化操作,表达式2是结束循环条件,表达式3是趋于结束条件的表达式,执行顺序是先执行一直表达式1,再执行表达式2,在执行循环体,最后表达式,第二轮就不在执行表达式1。这样一想就瞬间明白了,在本题中的for循环i和v4是同一个东西,相减就等于0,i是控制循环的变量,那么一下就清晰了,标准的for循环,给定字符串按每个字符减一。那逆向算法就把前面拿到的字符串每位+1就得到结果了


拿到正确的FLAG:flag{Ar3_y0u_go1nG_70_scarborough_Fair}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

sp66lpf 发表于 2021-9-10 00:07:46
BY  兔飞猛进

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

小飞 发表于 2021-9-10 01:12:31
分析附件中的APP程序,调试里面的两个native函数,获取正确的flag。
1.拖入jadx 先看看,主要分析 getFlag 和 encrypt 2个 native

2.getFlag=ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|
3.encrypt  规则就是-1操作
KE3TLNE6M43EK4GM34LKMLETG
JD2SKMD5L32DJ3FL23KJLKDSF
4.flag值比较输入值 因为encrypt是-1 我们这个时候flag+1即可


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

睡梦中的仙人 发表于 2021-9-10 02:42:13
首先通过java层分析,可以看出MainActivity中由我们输入的值通过native方法encryptnative方法getFlag 进行计较就能得到Success。其中java层的getSecret方法无非就是计算MD5之类的完全可以不用管,看到都烦直接跳过。也就是说getFlag()encrypt(this.etFlag.getText().toString())相等就行了。
所以关键还是在libphcm.so上,先来一波静态分析。分别找找encryptgetFlag方法
先看getflag 改名这些就不用说了,常规操作,最后return v21;并且可以看到v21是一个长度为40char的数组,也就是字符串长度应该是小于等于40的。经过一系列的循环和异或操作后,最后返回v21,好这个函数静态分析完了,等下上动态调试看最后结果就行,中间过程不重要。
通过一系列类型定义修改之后encrypt方法变形成为
这个函数就没啥好讲的了,就一个转换,一个循环,然后返回,逻辑简单,直接上手调试就好。
现在就来动态调试了,启动监听然后IDA附加====,然后下断getflag,然后运行起来。
这里有个STMIA 指令,将R0R1的数据存储到R2指向的地址上,R2值更新,意思来张图就清晰了,R0R1占用8个字节,从R2往上走8个字节。
然后就开始循环,每次往R2写入8个字节,一直到R3=LR
总共获得了40FFAD149C - FFAD1474 = 10进制)40个字节的字符串。然后第一个循环完成。开始第二个循环,第二个循环一次过了,因为它是通过判断Hello Ph0en1x 这个字符串-8的长度,剩下0en1x正好和条件相等,跳出了循环
R2R4R6的值发生了变化
来到第3个循环,太复杂看得眼花,直接跳过,最终函数返回值为:ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|
然后来到第二个函数处,下断调试
经过调试一次发现只要值存放在R5上,实际操作就是将传入字符串按位都减1,那么后面就不需要在试了,我们要输入的值就是ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|每一位都加一,这里可以采用其他开发工具自己编写一个代码按位加1,自然就得到了结果,我就偷懒,懒得写了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

挥霍 发表于 2021-9-10 17:19:58
本帖最后由 挥霍 于 2021-9-10 18:14 编辑

分析附件中的APP程序,调试里面的两个native函数,获取正确的flag。










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

mlq 发表于 2021-9-10 23:13:25
动态调试得到  getflag返回值 ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|
查看encrypt伪代码 发现是将字符串中每个字符-1;
说以得到key 为 flag{Ar3_y0u_go1nG_70_scarborough_Fair}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

心情落叶 发表于 2021-9-12 00:50:16
本帖最后由 心情落叶 于 2021-9-12 00:56 编辑

2021-09-12 落沙提交

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

听雨安卓逆向 发表于 2021-9-12 10:54:31
分析附件中的APP程序,调试里面的两个native函数,获取正确的flag。方式一:IDA动态调试



方式二:frida调试返回值:

最终输出正确字符串flag。。。。。emm。。。Frida 真强  哈哈


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

马到成功 发表于 2021-9-12 20:08:44
由于图片太多,就上传压缩包
该程序调试entrycp(String)函数是那个字符串不是我们输入的值的原因是这个函数在java层调用了两次,在第一次调用的时候它传了一个值,我们要运行到第二次这个字符串就是我们输入的值了。
学员:马到成功

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则