吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 35155|回复: 198
收起左侧

[Android 原创] 2020年春节红包第四题wp

    [复制链接]
梦游枪手 发表于 2020-2-10 03:03
本帖最后由 梦游枪手 于 2020-2-10 14:50 编辑

准备工具

IDA Pro,GDA,能真机调试的Android机一台

GDA分析

先把apk拉到GDA,找到MainActivity的onClick方法。
QQ截图20200209135516.png
主要逻辑代码在so文件里面。

IDA分析调试

直接把libxtian.so丢到IDA分析,但没找到checkSn函数,说明函数是动态注册的。so有混淆,无法静态分析,只能真机调试了,真机调试的步骤网上有很多,这里就略过了。
动态注册Native的函数为RegisterNatives,启动调试,IDA停在JNI_OnLoad函数后,转到 _ZN3art3JNI15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodi,下断后运行。
QQ截图20200209141708.png
跟随R2寄存器,就能找到checkSn函数的地址了。
QQ截图20200209141926.png
重命名为checkSn并下断,在真机那边输入uid和假码,点验证,IDA停在checkSn函数上,说明就是这里了。
现在面对最大的一个问题:混淆。
QQ截图20200209143858.png
看起来是一个自写的类似OLLVM的控制流混淆。因为流程混淆有直接操作PC寄存器的代码,所以IDA的F5报废,字符串也都是运行时才会解密,无法下手。
QQ截图20200209144134.png
楼主不会去混淆,而且为了这个红包题专门去分析混淆手段也太累了,就想顶着混淆解决。
这时候就可以用IDA的trace功能,用它抓取程序执行过的所有指令,不过这个红包题可以不用抓所有指令,可以使用function tracing,只抓取函数调用。
QQ截图20200209152748.png
但不知为何,trace会跑飞,抓取不到所有的函数调用,所以我只好弄了个IDC脚本来单步。

static main(void)
{
    do
    {
        step_over();
        wait_for_next_event(STEP,-1);
    }while(PC!=0xEEDAFC2C);//停在何处
}

注意要设置脚本停止在checkSn函数返回处,设置断点防止跑飞。
QQ截图20200209154954.png
IDA停在checkSn后,打开function tracing,跑一次脚本,等停在checkSnretn,按esc后退,找到跑飞处,在下面那句代码下断。清除trace记录后,在checkSn函数头再跑一次。
QQ截图20200209155235.png

分析checkSn的函数调用

抓到函数调用后,关闭function tracing,在抓取到的指令上下断,跟踪分析,由于我已经分析过一次了,所以指令上面有注释。
QQ截图20200209160730.png
在最后一条BLX上,也就是getpwdlen上下断,停下后步入,注意观察。
QQ截图20200209161134.png
R6寄存器存放着GetStringUTFLength函数的地址,说明这里确实是取字符串长度的,至于是uid还pwd用排除法即可。
走出API调用后,回到checkSn继续往下跟,可以找到检查pwd的长度的代码。
QQ截图20200209162057.png
pwd长度不足15,所以直接返回了,我们修改下假码,继续抓取,逐个分析即可。
QQ截图20200209163941.png
现在看图里的trace也能知道大致流程了,checkSn获取输入的uid和pwd,调用check函数,判断是否pwd符合uid。修改check函数的返回值为1并运行,Toast显示成功,说明正确。
现在把分析目标转到check函数,check函数内也有混淆,修改上面的脚本为PC!=0xEEDAF362并下断,并使用上面的步骤抓取所有函数调用。
QQ截图20200209203630.png

分析check函数

我的IDA在check函数无法使用function tracing,app会崩溃,原因未知,所以我只能改成instruction tracing了。抓取的指令太多就不展示出来了,我会放在附件里。
这里说下check函数的分析思路和主要流程。
在trace文件里找出所有BLX,下断步入,如果是调用API,则跟踪出API名,如果是调用so本身的函数,那就直接在LR的地址下断运行。不要忘记记录参数和返回值。
如果对每个调用的内部函数都trace一遍,读代码,我觉得要花太多时间,所以记录参数和返回值,凭经验直接猜算法,如果猜不到再trace指令。
check函数首先调用gettimeofday,然后将timeval除以1800000,也就是30分钟。
QQ截图20200209215546.png
然后将uid和结果拼接在一起,算出一个32字节的hash,存放在栈顶地址处。
QQ截图20200210020601.png
这个hash算法我没能还原出来,本来以为是sm3,但是验算了几次都不对,跟也跟不出个头绪,就直接过了,还好不影响解出题目。
之后取出hash的17-20位。
QQ截图20200210020926.png
与uid拼接到一起,等待最后比较。
QQ截图20200210021302.png
接着对pwd进行base64解码,码表是修改过的,图里写的sm3就是上面的hash,忘了改注释。
QQ截图20200210021532.png
解码后,再进行RC4解密,key为52pojie2020xtian
QQ截图20200210022022.png
逐位异或0x20。
QQ截图20200210022121.png
QQ截图20200210022346.png
最后与uid+hash比较。
QQ截图20200210022616.png
check函数的流程就走完了。

编写注册机

没还原出hash算法,所以不能写出注册机,因为pwd时效只有30分钟。
只能在JNI_OnLoad+43B2处复制对应当前时间的结果,再加密。附python代码一份

import hashlib
from Crypto.Cipher import ARC4
b64table = 'AzSxleoQp02MtvisIZUF8ThRaEL9Nd57qG6DfOkW4JHXmYjwV1Pn3uycrCgbKB-_='
decryptkey = '52pojie2020xtian'

def RC4(data, key):
    rc41 = ARC4.new(key)
    encrypted = rc41.encrypt(data)
    return encrypted

def b64encode(s):
    res = []
    leftover = len(s) % 3
    for i in range(0, len(s) - leftover, 3):
        c2 = ord(s[i])
        c1 = ord(s[i + 1])
        c0 = ord(s[i + 2])
        res.append(b64table[(c2 >> 2) & 0x3f])
        res.append(b64table[((c2 & 0x3) << 4) | ((c1 >> 4) & 0x0f)])
        res.append(b64table[((c1 & 0x0f) << 2) | ((c0 >> 6) & 0x03)])
        res.append(b64table[c0 & 0x3f])
    i += 3
    if leftover == 1:
        c2 = ord(s[i])
        res.append(b64table[(c2 >> 2) & 0x3f])
        res.append(b64table[(c2 & 0x3) << 4])
        res.append(b64table[-1])
        res.append(b64table[-1])
    elif leftover == 2:
        c2 = ord(s[i])
        c1 = ord(s[i + 1])
        res.append(b64table[(c2 >> 2) & 0x3f])
        res.append(b64table[((c2 & 0x3) << 4) | ((c1 >> 4) & 0x0f)])
        res.append(b64table[(c1 & 0x0f) << 2])
        res.append(b64table[-1])
    return ''.join(res)

def b64decode(s):
    res = []
    end = len(s)
    if s[-1] == b64table[-1]:
        end -= 4
    for i in range(0, end, 4):
        c3, c2, c1, c0 = b64table.index(s[i]), b64table.index(
            s[i + 1]), b64table.index(s[i + 2]), b64table.index(s[i + 3])
        res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
        res.append(chr(((c2 & 0x0f) << 4) | ((c1 >> 2) & 0x0f)))
        res.append(chr(((c1 & 0x03) << 6) | (c0 & 0x03f)))
    if end < len(s):
        if s[-2] == b64table[-1]:
            c3, c2 = b64table.index(s[end]), b64table.index(s[end + 1])
            res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
        else:
            c3, c2, c1 = b64table.index(s[end]), b64table.index(s[end + 1]), b64table.index(s[end + 2])
            res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
            res.append(chr(((c2 & 0x0f) << 4) | ((c1 >> 2) & 0x0f)))
    return ''.join(res)

def wuaiencrypt(message):
    r = ''
    for i in list(message):
        r += chr(ord(i) ^ 0x20)
    r = RC4(r, decryptkey)
    return b64encode(r)

def wuaidecrypt(message):
    c = list(b64decode(message))
    c = list(RC4(b''.join(c), decryptkey))
    for i in range(len(c)):
        c[i] = chr(ord(c[i]) ^ 0x20)
    return ''.join(c)

enc = 'lu_BURGbkz3qtwLXBkYm'
flag = '0325008b4f37de1'

print wuaidecrypt(enc)
print wuaiencrypt(flag)

等大佬解出hash算法再做keygen吧,这个80CB的红包还是不好拿啊。
Screenshot_2020-02-10-02-29-04-258_com.wuaipojie..png

最后

前两天手贱把trace文件删掉了,今天重新trace check函数,IDA花式崩,花了不少时间。剁手剁手。
附上trace和idb,trc后缀的可以在IDA里加载,另外idb貌似有点问题,附加题目会崩溃,注意一下。
idb和trace.zip (1.48 MB, 下载次数: 98)

免费评分

参与人数 108吾爱币 +317 热心值 +101 收起 理由
philips_carey + 1 我很赞同!
紫风飘零 + 1 我很赞同!
0小张 + 1 + 1 热心回复!
ztf6124 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
huangyutong + 1 + 1 用心讨论,共获提升!
Hmiku + 1 + 1 热心回复!
cst198926 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
月六点年一倍 + 1 我很赞同!
hssl1019 + 1 + 1 谢谢@Thanks!
jjm580 + 1 + 1 我很赞同!
维C糖果 + 1 + 1 我很赞同!
Jioccer + 1 + 1 热心回复!
zhangjunteng + 1 + 1 热心回复!
explorer126 + 2 + 1 鼓励转贴优秀软件安全工具和文档!
此用户无法显示 + 2 + 1 鼓励转贴优秀软件安全工具和文档!
qq524350 + 1 谢谢@Thanks!
mda435 + 1 谢谢@Thanks!
GodIand + 1 + 1 我很赞同!
你不是一个人 + 1 + 1 热心回复!
Lugia + 1 + 1 谢谢@Thanks!
三角心 + 1 + 1 用心讨论,共获提升!
cxfyg + 1 + 1 膜拜大佬!!!
KYO_2代 + 1 我很赞同!
padao + 1 + 1 用心讨论,共获提升!
一心即佛 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ZDavy + 1 + 1 谢谢@Thanks!
limpoamp + 1 + 1 谢谢@Thanks!
meino + 1 谢谢@Thanks!
15396991846 + 1 我很赞同!
莫千秋 + 1 + 1 谢谢@Thanks!
lynxtang + 1 + 1 谢谢@Thanks!
fandh88 + 1 我很赞同!
Ldcsuki + 1 + 1 谢谢@Thanks!
小哥9527 + 1 + 1 我很赞同!
wwh1004 + 3 + 1 不会安卓
jlzoe + 1 + 1 谢谢@Thanks!
sunbester + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
魔鬼视觉 + 1 + 1 热心回复!
lmjg520 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
habhab + 1 我很赞同!
越简单越好 + 1 + 1 小白不懂
HelloJavaScript + 1 + 1 我很赞同!
青木公 + 1 + 1 谢谢@Thanks!
石碎大胸口 + 1 + 1 我很赞同!
xx666666 + 1 + 1 用心讨论,共获提升!
梁总 + 1 + 1 热心回复!
古或郎 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
烤烟型虾米 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gardenofida + 1 tql
517pojie + 1 + 1 我很赞同!
空灵dashu + 1 + 1 我很赞同!
努力的小和尚 + 1 + 1 我很赞同!
qazqzz + 1 + 1 谢谢@Thanks!
gaosld + 1 + 1 谢谢@Thanks!
叶隽 + 1 用心讨论,共获提升!
星夜启程 + 1 + 1 膜拜大佬
xiaobeis500c + 1 + 1 佩服佩服
何晓 + 1 我很赞同!
虔来学习 + 1 我很赞同!
风清海蓝 + 1 + 1 热心回复!
yixi + 1 + 1 谢谢@Thanks!
jiangfeng810814 + 1 我很赞同!
抱歉、 + 1 用心讨论,共获提升!
Liufei2019 + 1 我很赞同!
水尖尖的下巴 + 1 + 1 谢谢@Thanks!
AssassinQ + 1 + 1 谢谢@Thanks!
快乐交友 + 1 + 1 热心回复!
daniel7785 + 1 用心讨论,共获提升!
秃头毛笔 + 1 + 1 我很赞同!
fantion + 1 + 1 我很赞同!
cnngtc + 3 + 1 凝视大佬
cosct + 1 + 1 膜拜大佬
meanwhile + 1 + 1 我很赞同!
iBristlecone + 1 + 1 大佬大佬
ffcc0077 + 1 我很赞同!
开心糖 + 2 + 1 膜拜大佬
姚小宝 + 3 + 1 我很赞同!
Dreace + 1 + 1 用心讨论,共获提升!
plasd + 1 + 1 谢谢@Thanks!
solly + 2 + 1 谢谢@Thanks!
CrazyNut + 3 + 1 来了来了 来膜拜大佬了
oauth + 1 + 1 我很赞同!
独行风云 + 1 + 1 膜拜大佬
maoyu + 1 + 1 热心回复!
skywilling + 2 + 1 用心讨论,共获提升!
深天深天 + 1 + 1 膜拜大佬!
LibertyCola + 1 + 1 热心回复!
XhyEax + 3 + 1 谢谢@Thanks!
snowfox + 1 + 1 谢谢@Thanks!
lzc090 + 3 + 1 谢谢@Thanks!
昨夜星辰恰似你 + 2 + 1 老哥牛逼
kaoyange + 1 + 1 Android大神,好厉害呀呀呀
nws0507 + 1 + 1 tql
生有涯知无涯 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
996579747 + 1 + 1 我很赞同!
Hmily + 200 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wangyujie96 + 1 + 1 太强了
二娃 + 2 谢谢@Thanks!
千世樱 + 1 + 1 强强强
1006706246 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2020-2-10 13:10
牛叉,80cb确实太少了,写分享再送200。
hlrlqy 发表于 2020-2-10 03:31
手撕ollvm的大佬,佩服佩服
这一手trace用的属实惊艳
史迪仔 发表于 2020-2-10 03:15
灰灰。 发表于 2020-2-10 03:34
很强,还从没用过ida的trace
qwesyw2008 发表于 2020-2-10 05:36
看不懂,但是大佬nb
fwmsuper 发表于 2020-2-10 07:55
感谢楼主辛苦分享
李梦洁 发表于 2020-2-10 08:02
感谢楼主辛苦分享
李梦洁 发表于 2020-2-10 08:03
感谢楼主分享
jefel 发表于 2020-2-10 08:17
高手过拆!!
kone153 发表于 2020-2-10 08:45
虽然看不懂,但还是看看多学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 00:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表