强网杯RE-复现
easyre & game
0x0 前言
这次做出了 gamemaster和easyapk,在此就不写出来,就发自己需要复现的题目
本次easyre复现观看pz师傅视频复现
0x1 分析
拿到程序先用figer修复一下函数,可以发现fork和sys_ptrace
可以看见创建了一个子线程,直接把这个re3dump下来
启动子线程然后进行一个等待,等待子线程反馈后 保存了寄存器的值然后进行一个判断
在re3里面可以看见这个操作 int3断点后 下面跟了一个值 可以发现就是我们需要判断的值,主线程就是在等待一个这个
观察如果进入第一个int3后的函数,里面又读取了子线程的值 然后和一个值进行了异或,相当于一个smc
动调到异或的位置,可以发现异或的就是我们下面的地址
我们在异或后面下断,同时打印异或后正确的值,方便我们patch回去
这里的左值就是子线程需要smc的地址
xorKey = {8723: 2533025110152939745, 8739: 5590097037203163468, 8755: 17414346542877855401, 8771: 17520503086133755340, 8787: 12492599841064285544, 8803: 12384833368350302160, 8819: 11956541642520230699, 8835: 12628929057681570616, 8851: 910654967627959011, 8867: 5684234031469876551, 8883: 6000358478182005051, 8899: 3341586462889168127, 8915: 11094889238442167020, 8931: 17237527861538956365, 8947: 17178915143649401084, 8963: 11176844209899222046, 8979: 18079493192679046363, 8995: 7090159446630928781, 9011: 863094436381699168, 9027: 6906972144372600884, 9043: 16780793948225765908, 9059: 7086655467811962655, 9075: 13977154540038163446, 9091: 7066662532691991888, 9107: 15157921356638311270, 9123: 12585839823593393444, 9139: 1360651393631625694, 9155: 2139328426318955142, 9171: 2478274715212481947, 9187: 12876028885252459748, 9203: 18132176846268847269, 9219: 17242441603067001509, 9235: 8492111998925944081, 9251: 14679986489201789069, 9267: 13188777131396593592, 9283: 5298970373130621883, 9299: 525902164359904478, 9315: 2117701741234018776, 9331: 9158760851580517972}
addr = 0x2213
while True:
data = get_qword(addr)
key = xorKey[addr]
dec = data ^ key
idc.patch_qword(addr, dec)
addr += 16
直接在re3修复回去
然后在末尾可以发现还有一个int3,这个就是进行第二个函数,第二个函数进去其实就是把smc给还原回去
修复后可以发现是一个数织游戏
找到规则值,发现不对
发现在init中有一个复制的操作,会通过地址换算影响到50A0的规则值,然后把真正的值放到在线网站进行解密即可
https://handsomeone.github.io/Nonogram/
GAME
0x0 前言 工具
https://github.com/nelenkov/android-backup-extractor
工具
https://blog.csdn.net/bakelFF/article/details/123049992
配置MVN 用来压包工具
MVN报错无法JAVAhome 就是环境变量去掉bin
报错不能运行,有可能像我一样有两个java环境 java和javac版本不同
把需要的版本的环境变量位置提高就ok了
java -jar abe.jar unpack ba.ab ba.tar
0x1 分析java层
可以看到有AES加密和base64,还有一个地方检测root
0x2 so层分析
进去通过索引 可以发现很多字符串都是被加密了,我们索引找到异或回去发现这个字符串不就是java层中的函数名嘛
0x3 解密字符串
直接通过ce搜索字符串找到内存所在位置dump出来
分析so时可以发现一些字符串的作用,在内存中都可以看见
通过key再寻找到IV
0x4 确定算法正确
我输入的用户名是lanlan抓包获取
然后进行加密
解密回去
可以发现字符串每6位中间的字符串交换位置
安装app抓包获得其中的加好友位置可以发现一个admin的账号
获取admin账号的account和name
0x5 解密
进行解密
0x6 Getflag
import requests
url ="http://47.93.244.181/re/GetFlag.php"
res = requests.post(url, data={"code":"123125", "account":"&Od987$2sPa?>l<k^j", "username":"admin"})
print(res.text)
0x7 总结
GAME复现学习,只能说CE 直接不用动调so取正确的key和iv。看了其他师傅文章里面还有一些反调试,vpn检测 frida检测,其他师傅使用hook方法过掉,root检测真机直接用面具就过了。总结来说CE直接查内存是最骚的操作。原本还想复现一下强网其他题目并且发文章,现在可能就复现看一下就不发文章了。学习逆向做CTF也快接近一年了,有比赛打有空再发文章,在这里感谢各位师傅的观看。
芜湖,结尾感谢一下Nepnep战队的Qfrost师傅和ThTsOd师傅教了我很多!!
Nepnep万岁!!!
如果有师傅想学习逆向,战队内部有Q神 T神讲解题目哦,欢迎加入。