1625-5 王子昂 总结《2018年1月7日》 【连续第464天总结】
A. Xman移动安全冬令营选拔赛
B.
搞完领航杯马不停蹄回来搞移动逆向,感谢主办方延长了时间~
逆向类的题目很有意思(°∀°)ノ
脑洞/杂项类的就……(跪

返老还童

反编译查看java代码,发现调用了一个WebView,加载了包内的check_flag.html
解包拿出来,查看发现存在混淆的js代码
用脚本反混淆并整理变量,发现最后要有3个结构类似的函数,区别只在于核心的比较地方而已
发现onClick方法中有调用js,查看这个函数名发现是中间那个

MainActivity.b.loadUrl("javascript:o0O0oo0o0o0o0oO()");

于是针对它分析

function o0O0oo0o0o0o0oO() {const _0x5de4x3 = navigator['userAgent']['split'](';')['map'](_0x5de4x4 => Number(_0x5de4x4));var _0x5de4x5 = function (x) {return function (y) {var gcm = function (a, b) {return 0 === b ? a : gcm(b, a % b);};return x * x - y * y == 56 * (x + y) && 10000 < x * x + x * y + y * y && 10000 > x * x - x * y - y * y && 7 == gcm(x, y);};};document['getElementById']('result')['innerHTML'] = _0x5de4x5(_0x5de4x3[_0x5de4x3['length'] - 2])(_0x5de4x3[_0x5de4x3['length'] - 1]) ? 'flag is XCTF{your input}' : 'try again';
}

这里的gcm函数就是辗转相除法求两数的最大公因子
发现取了两个数,判断它们的返回值是否为1
判断方法就在return那里,由两个方程,两个不等式组成
先记录下来

回头继续分析dex的onClick,在调用js上面还调用了a.a,跟过去看

这里取了输入内容,以-分隔,一共4组,每组4个字符
下面对字符范围进行了约束,懒得看了233
关键地方在这

一大坨方程限定4个数字串~

最后a和b就是送入js的两个数

解方程,我用Z3
Z3求解器,还您一身轻松(<ゝω·)
首先反求a和b

from z3 import *
def gcm(a, b):if a >= b:if a % b == 0:return belse:return gcm(b, a - b)else:return gcm(b, a)x = Int('x')
y = Int('y')
s = Solver()s.add(x>0, y>0, x<256, y<256)
s.add(x*x - y*y == 56*(x+y), 10000<x*x+x*y+y*y, 10000>x*x-x*y-y*y)
result = []
while(s.check()==sat):m = s.model()x1 = m[x].as_long()y1 = m[y].as_long()if(gcm(x1, y1)== 7):result.append((x1, y1))s.add(x!=x1)print(result)

因为最大公因子这个限定不好加给z3,所以我在求解出结果以后再检查最大公因子,满足则记录,不满足则跳过进行下一个
得到若干解

result = [(91, 35), (105, 49), (119, 63), (133, 77), (147, 91), (161, 105), (175, 119), (189, 133), (203, 147), (217, 161), (231, 175), (245, 189)]

再一个一个把方程拖下来输入进行求解


for i in result:x2 = i[0] ^ 55y2 = i[1] + 4^113a = [BitVec("a%d"%i, 8) for i in range(4)]b = [BitVec("b%d"%i, 8) for i in range(4)]c = [BitVec("c%d"%i, 8) for i in range(4)]d = [BitVec("d%d"%i, 8) for i in range(4)]s = Solver()# 限定可见字符for i in a,b,c,d:for j in i:s.add(j>32)# 一大坨方程s.add(a[0] == d[1] - 3,a[3] == d[2] + 1,d[2] % 2 == 0,d[2] == a[2] + 8,d[0] == a[0] - 2,d[1] == (a[3] ^ 18),a[1] * 2 == a[2] - 8,d[3] == a[2],d[3] == x2,12 + b[1] == b[3],c[1] * 2 == b[3]-11,b[2] == y2,b[0] + c[0] == 187,b[0] + c[3] == 210,b[3] ^ b[2] == 47,b[0] ^ b[1] == 15,c[2] ^ b[1]== 5,)# 求解if(s.check()==sat):m = s.model()for i in  a,b,c,d:for j in range(4):print(chr(m[i[j]].as_long()), end='')print('-', end='')print()else:print(unsat)

结果最后只有第一个result出了可见字符解╮(╯_╰)╭

d2lu-bmVy-Y7hp-bgtl-

提交完成

孔雀翎

回来的时候已经有提示了,让试试反射和Xposed……
这俩我都不会呀~不过之前在52上看到过教程,应该可以试试吧(结果最后也没用上因为我并不会(望天

先反编译查看代码,发现在onClick中取得输入后送入一个反射来的方法进行运算,最后与另一个常量比较

这个v3就是反射来的方法,用invoke的方式调用,v0即输入就是参数
d.c通过对常数参数做一堆运算返回一个方法
那么关键就是这个方法是啥了

首先试了一下JEB2动态调试,然而单步跟到invoke以后就提示没法继续跟进去了
无奈继续查找
浪费了俩小时也没找到什么能动态调试/dump方法代码的东西

最后无奈的试试IDA动态调试,没想到还真跟进去了
一下就看到了这里v3反射的是a.a.c.d方法
比对了一下smali确认无误后进行静态分析

……
(╯‵□′)╯︵┻━┻
这个方法里面又进行了5次反射,还好没有别的东西
不会Xp有啥办法尼,硬着头皮怼吧

一一跟进去并记录如下

a.a.c.d->a.a.c.b(byte[], byte[])->a.a.c.b(byte[]) ->a.a.c.b(string)->a.a.c.a(String)->a.a.b.b(byte[])

还好这5个方法里没有更复杂的东西╮(╯_╰)╭连库函数都要反射的话我就没辙了

用Xposed应该可以Hook所有方法,把调用过的每个方法名都记录下来。思路是有,奈何Xposed不会写2333等跟着dalao们学习一个

于是挨个静态分析,结合JEB2的动态调试查看变量
PS: IDA能跟到反射方法里去,但是本地变量监视器实现的太差,除了字符串啥都看不到
而JEB2虽然能看到几乎所有类型的本地变量,但是跟不进反射方法(不过可以在反射的方法内下断来调试)

a.a.c.b(byte[] onClick, byte[]v6)

AES加密,key为”imaeskeyimaeskey”

刚开始看到代码只是显示secretKey,还不能确定是什么加密方法,结果看到这个密钥就不用想了233
padding没找到是什么,测试的时候正向输了一个十六个字节的字符串来测试
最后解密出来看到padding是\r

a.a.c.b(byte[] onClick)

转大写HEX

a.a.c.b(string)

将HEX的每个值通过一个字典转换
动态查看字典后发现就是0-16的4位bin显示
如E->1110

a.a.c.a(String onClick)

压缩,将连续的若干1或0压缩成数目
如11100011010->332111
注:开头若为0则舍去

a.a.b.b(byte[])

改了Table的b64,Table通过构造方法生成,动态dump可得

于是按照流程写出脚本:

from Cryptodome.Cipher import AES
from base64 import *key = b"imaeskeyimaeskey"
aes = AES.new(key, AES.MODE_ECB)table = ['!', '(', '&', '*', '~', ';', ')', ':', '+', 'I', 'J', 'K', '%', 'M', 'F', 'D', '_', 'W', 'H', 'a', '@', 'G', 'Q', 'R', 'S', 'T', 'N', 'O', '$', 'b', 'c', 'd', '^', 'f', 'g', 'h', 'P', 'L', 'e', 'i', 'j', 'k', 'l', 'm', 'n', 'A', 'B', 'C', '#', 'E', 'o', 'p', 'X', 'V', 'U', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', '?']# Reverses = "!_~&!#+(!_@&!_$*!_+(!_~(!#_(!^~)!_+&!_~((!~(!^~*!^~~!^~~!_~*!^+(!^@(!_+(!^^(!_~*(!~(!_~(!_%*!_~&!_~&!^S(!_~((#~((!~&!^%&!_%&!_+(!^~&!#+((_~(!_~(!_+(!_+;!_+(!^~(!_@&!^~:!^~(!_~(!^~(!_~*!^~;!^+(!_~&!^~(!_~&!^@&!^~(!_~(!^_(!#%(!_~&!^~&!^_&!_+&!__&!_+(!_~(!__~(^~)!_~?"# b64解密
flag1 = b""
for i in range(len(s)//4):p = 0q = 0for j in s[i*4:i*4+4]:q = q << 6q |= table.index(j)for j in range(3):p = p << 8p |= q&0xfq = q >> 8flag1 += p.to_bytes(3, 'little')
print(flag1)# 解压缩
flag2 = ""
f = 1
for i in flag1:while(i):flag2 += str(f)i -= 1f ^= 1
print(flag2)# 将BIN转回HEX
flag3 = ""
for i in range(len(flag2)//4):flag3 += hex(int(flag2[i*4:i*4+4], 2))[2:]
print(flag3)# 解码
flag4 = bytes.fromhex(flag3)# 解密
flag = aes.decrypt(flag4)
print(flag)

C. 明日计划
考试~复习~

180107 逆向-Xman移动安全冬令营选拔赛相关推荐

  1. 2018xman冬令营选拔赛第2题wp-Android结合js的逆向实践

    第2题wp 绕着绕着就出来了 1.      使用jd-gui反编译apk源代码. 2.      查看主进程中的OnCreate()函数: 点击按钮a的时候,会创建b对象,b对象会执行url中的js ...

  2. 180124 逆向-XMAN结营赛(前方高能)

    1625-5 王子昂 总结<2018年1月24日> [连续第481天总结] A. 结营赛前方高能WP B. 前方高能 XMAN第七组WriteUp 说实话好像确实有点难,不过逻辑链条很完整 ...

  3. 【CTF大赛】第五届XMan选拔赛 ezCM Writeup

    ezCM 直至比赛结束,这道题目都是 0 解题,一方面是因为比赛时间较短,另一方面还是因为这道题目较难,考察了不常见的椭圆曲线算法(ECC),大大增加了对做题者的要求. 题目信息 题目是使用 Gola ...

  4. 2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛) Jumping Monkey(并查集,逆向考虑)

    LINK 考虑权值最大的节点为 z z z,那么其他所有点最后都是跳到这个点,且不能越过这个点到其他点 那么其实我们可以把所有其他节点的答案都加 1 1 1,相当于把 z z z删掉,分成若干个连通块 ...

  5. Xman资格选拔赛-web

    variacover 这道题一打开就是源码,主要就是根据源码构造url.其中,它接收的参数只有b,但源码中要获取flag的关键参数是a[0].parse_str()函数的作用是把查询字符串解析到变量中 ...

  6. 2021年11月逆向练习

    全文目录 前言 一.BugKu-Timer(阿里CTF) 1. 简单分析 2. 修改安卓程序数值 3. 总结 二.BugKu-signin 1.功能分析 2.找到toString,获取flag 3.总 ...

  7. 训练日记 | 2021.03.21 | 天梯赛选拔赛

    选拔赛用的是 第十八届浙大城院程设竞赛 A - Genshin and KFC 直接输出 B - Codeforces 题意:判断段位有没有改变,如果有就输出"(原段位 to 现段位)&qu ...

  8. 第二届全国技能大赛(世赛项目)福建省选拔赛 网络安全项目任务书

    第二届全国技能大赛(世赛项目)福建省选拔赛 网络安全项目任务书 A模块基础设施设置/安全加固(350分) A-1:登录安全加固(windows.linux) A-2:数据库加固(Linux) A-3: ...

  9. 【安卓逆向】CTF实战分析

    安卓/手游逆向交流群963612891 既然这篇文章提到了CTF 我就先来科普一下 What is CTF??? 赛事介绍: CTF是一种流行的信息安全竞赛形式,其英文名可直译为"夺得Fla ...

最新文章

  1. qq音乐 android pad版,QQ音乐HD(com.tencent.qqmusicpad) - 4.12.1.4 - 应用 - 酷安
  2. 【数据结构与算法】之深入解析“相交链表”的求解思路与算法示例
  3. 508. 出现次数最多的子树元素和
  4. eventBus 与fragment
  5. 图像配准之特征点匹配的思考
  6. 终于有人把监督学习讲明白了
  7. 【AD】Altium designer IPC快速创建封装
  8. [渝粤教育] 云南大学 內部控制理论与实务 参考 资料
  9. Toon Boom Harmony 12 for Mac(二维动画设计工具)
  10. atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php
  11. 零基础如何学习C语言
  12. 基于Java+SpringBoot+vue+element实现校园疫情防控系统详细设计和实现
  13. Ubuntu的HBase2.2.2安装
  14. Cypress自动化测试:type
  15. 采样频率和带宽的关系_示波器的带宽与采样率是什么关系
  16. 芯片加密与解密技术方法
  17. 杀不死的人狼——我读《人月神话》(三)
  18. 什么是API?有什么作用吗?
  19. Spring Cloud: .yml属性文件配置 (完善中)
  20. windows8 下载

热门文章

  1. 主动变被动9个例句_羽毛球六种反手击球技巧,掌握好了,让你化险为夷,变被动为主动...
  2. 快速上手EF+WebApi开发
  3. 杭电子科技大学计算机学院,这四所电子科技大学,是电子信息类专业的实力院校...
  4. Google Adsense收入计算以及提高的5种方式
  5. mactype支持qq浏览器
  6. Process 的 waitFor() 造成的阻塞
  7. 分享一篇游戏测试的面试技巧
  8. 架设某大型网站服务器全部详细过程(郁闷少年)
  9. 防止数据泄漏哪家强,且看ManageEngine家族新成员- Device Control Plus
  10. MySQL使用IN、EXISTS、ANY、ALL关键字的子查询