小白670 发表于 2018-4-23 23:10

2018ddctf安卓RSA-ida动态调试so(180423-每日破解)

本帖最后由 小白670 于 2018-4-24 09:04 编辑

虽然这个题目叫RSA,但是跟RSA关系并不大,出题人很皮。题目的代码不容易静态分析,需要使用动态调试的方法。
Ida动态调试详细教程https://blog.csdn.net/feibabeibei_beibei/article/details/52740212

反编译分析可知,程序加载了so库,并且用so库里的stringFromJNI()函数来判断输入



在lib目录下,找到libhello-libs.so文件,拖进ida分析,在exports中找到关键函数


双击进去分析,然后一键F5,得到代码如下:


进入上图的关键函数,静态分析,只能得出输入的字符串长度要等于36,后面的循环有点乱,是出题人故意扰乱的,不过大概可以知道是将输入的数据和程序中的数据异或,程序中的数据如下:






到这一步,就不得不使用动态调试了,不过在动态调试前还得做一些准备工作,首先用andriodkiller打开apk,如图加上debugger条件,然后编译,把编译后的apk放到手机或者模拟器上,然后用ida打开这个新的apk的libhello-libs.so



先运行android_server文件,出现下面的提示既成功了,上面有教程具体怎么做



然后端口转发,启动程序


接着打开ddms,没有的要自己百度了,我弄了挺久的,有点麻烦


可以看到我们要调试的程序,然后


Port是调试程序的jdwp进程号,一般8700都是用来调试的,其他的不变照着输就好了

接着就是设置ida了



Process option里设置这个


Debugger option里设置这个






在attach to process 前,先下断点

然后attach to process



随便输入一些数据,程序停在断点,进入关键函数,看到这里在比较字符串长度是否等于0x24



跳过这里,为了分析具体的变化,我们在ida里面加上watch,




然后在watch里面右键选择add,加上要查看的的寄存器



加上一些常用的寄存器后,效果如下:R0里是我输入的字符串



接着往下分析,下图是异或的过程


异或完后来到了一个很复杂的循环里,动态分析很容易得出是在判断arr是否等于arr,i从0到26,程序里加了多个循环,但其实效果跟我说的是一样的,如果是这样的话,那其实有效字符串变成了10个



可以看到,这里如果不等于的话就跳转到失败,但是每次手动改寄存器的值有比较麻烦,所以我这里修改了函数代码,反正已经知道它到底是干嘛的。
因为ida不支持直接修改代码,所以我们只能走弯路


设置如上后我们可以看到指令的机器码了,我这里是已经改好的,把原来的D0改成D1了






然后需要找到代码在so文件中的偏移,首先找到so文件的base,然后用那条指令的地址一减就得到了偏移0x9CF6,接着在010editor里面编辑,先跳到偏移量,




修改后如下,但是还没结束,还需要用andriodkiller重新编译,然后换新的apk和so文件调试········




以上步骤有点繁琐,但是修改代码后就可以直接跳过那烦人的判断了,总的来说还是值得的,我在比赛后看大佬博客才知道还可以set ip跳过·······







取前十个字符,进行下一步操作



下面是将前10个字符传进atoll函数,将字符转换为long long 整数,非常关键


分析得知结果存储在R0和R1,低位存在R0,高位存在R1



第二个j_j_j__ZNSt3mapIciSt4lessIcESaISt4pairIKciEEEixERS3函数有用,它把字符jlocpnmbmbhikcjgrla转换为新的数字字符串,



接着把这串字符串转化数字



然后用这个数字除以我们之前那十个字符转化的数字,



最后就是判断条件了






后面还有我就不贴了,分析可以得知只有当10个字符转化的数字为5889412424631952987的因数,且是较小的那个时,才返回正确,否则错误。分解大数倒是跟RSA有点关系,用数学工具可以得到结果


脚本如下:
byte_4DECB=
##key=1499419583
key=
j=0
str=''
for i in range(len(byte_4DECB)):
    byte_4DECB^=key
    j=(j+1)%10
    str+=chr(byte_4DECB)
    print byte_4DECB

print str


最后那个分析,我手推的,最后得出结论,要求5889412424631952987除以我们的数余数为0且要小于商。这次学到很多东西,基本上每一步都是从0开始学的,最后做出来非常开心,虽然还是个菜鸡,但是已经在慢慢成长了。最后附上一张我推最后过程的草稿:


小白670 发表于 2018-4-24 09:01

xushuwei1204 发表于 2018-4-24 08:53
棒棒的,支持一下

谢谢支持{:301_975:}

小白670 发表于 2018-4-24 08:31

mayl8822 发表于 2018-4-23 23:50
看不到图啦

不好意思,昨天晚上发的,因为网站突然维护不能重新编辑了,我今天把图片发上来

小白670 发表于 2018-4-24 08:30

Hmily 发表于 2018-4-23 23:47
发错版块了,都乱码了,给你编辑下,图片上传看这个:https://www.52pojie.cn/misc.php?mod=faq&action=faq ...

图片我待会弄,这个安卓破解不是发到这个版块么

小白670 发表于 2018-4-25 08:31

pghuanghui 发表于 2018-4-24 19:54
我想问问楼主,jdb未找到怎么回事?DDMS和手机也都ROOT了,也将Android_server打开了 就是没有jdb这个命令.

如果没有jdb的话,下一个就好了,可能你的adb工具包里面没有带jdb,如果有jdb还有问题的话可以再问我

Hmily 发表于 2018-4-23 23:47

发错版块了,都乱码了,给你编辑下,图片上传看这个:https://www.52pojie.cn/misc.php?mod=faq&action=faq&id=29&messageid=36

mayl8822 发表于 2018-4-23 23:50

看不到图啦

xushuwei1204 发表于 2018-4-24 08:53

棒棒的,支持一下

kpa 发表于 2018-4-24 09:09

谢谢楼主,我最近在做这一道题 没有头绪,看了你的的帖子,有很多收获!

小白670 发表于 2018-4-24 09:20

kpa 发表于 2018-4-24 09:09
谢谢楼主,我最近在做这一道题 没有头绪,看了你的的帖子,有很多收获!

能帮上忙太好了,不过这题有很多混淆代码,还有最后的判断条件我都没有细讲,时间精力有限{:301_1008:}

mylin 发表于 2018-4-24 09:29

现在还看不懂,慢慢向大神学习,谢谢分享
页: [1] 2 3 4 5 6
查看完整版本: 2018ddctf安卓RSA-ida动态调试so(180423-每日破解)