首页
社区
课程
招聘
[原创]看雪CTF.TSRC 2018 团队赛-第五题 交响曲
2018-12-9 22:02 3155

[原创]看雪CTF.TSRC 2018 团队赛-第五题 交响曲

2018-12-9 22:02
3155

1.思路:

先说一下做题思路(大佬忽略),这是我做看雪题很重要的一个经验,现在分享给你们,且不可外传到其他地方。


       if   ( 风神做题时间)/3600  >= 3:

              print "mo mo chi gua 2 tian , kan write up jiu gou le!!!!"

      else:

              print "ha ha you xi wang!"

嘻嘻!

2.正文....


题目说的安卓8正常运行,实际测试下在应该往后面进行了兼容了的,在我Android5.1的手机上也没问题(ps:作者真是好人啊,没有Android8的我刚好可以玩玩!)

将程序拖入到jeb中找到OnCreate方法


可以明显的看到一个明显的匿名内部类的单击事件!

继续跟进到CrackMe的a方法中


继续跟进


继续看try中的GetText1(这是我命名的,实际方法名我也忘了!)


可以明显的看出是对输入字符串的处理,这里我命名的s_0_3表示取serial序列号的0到第3个字符,其他的s_4_5同理。

简单的分析一下,可以看出函数判断前4个字符是不是0-189,1983-2007, s_4_5 是不是1-12, s_6_7是不是1-31

如果不是均将其赋为0.,其实从1983 和 2007这两个数和1-12 1-31 我们就可以粗略的判断作者将输入的序列号分为三段年月日。

继续看这个函数



简单看一下就知道是对输入3段的进行判断赋值处理然后在赋值给deal_0_3, deal_4_5 , deal_6_7

最后看最后的一个处理函数

  

可以看出是将4个返回值放入print函数的参数中


可以看出这是利用处理过的三个段进行索引然后简单的求出返回值

为什么这里会用try catch这是因为索引值有可能大于数组的长度,当大于数组长度的时候就会返回0,而且也会显示错误的字符串,具体的跟一下就知道了。

GetText2处理后续的序列号


简单化简一下

def GetText2(deal_4_5,s_):
	t=deal_4_5
	flag=0
	for i in range(len(m)):
		if s_==m[i]:
			if t==2 and s_==m[6]:
				return 63
			k=table1[i]
			flag=1
	if flag==0:
		print "not me!"
	return k
到此传入的参数基本弄明白了,
看最后的print

优化的不是很好但是还是可以看出逻辑,参数参数不等于34的时候会打印错误字符串,等于的时候打印成功的字符串(具体可以用ID到R中搜一搜)
其实用jadx也可以看出来,唉奈何用jeb习惯了!

可以看到jadx把Id值都替换了!
到此我们就可以写一个简单的脚本爆破了!!!

3.最后一点介绍一下怎么搭建调试smali的环境.

因为我每次都要忘记,搭建的时候又要出这样那样的错,就写在这里当个笔记吧!

Smalidea+IntelliJ IDEA/Android Studio动态调试安卓


  (1)去 https://bitbucket.org/JesusFreke/smali/downloads这里下载

这两个文件,注意basksmli版本下高了反编译的时候会出错
(2)接着在Android studio中安装smalidea

选中你的zip包进行安装
(3)利用baksmali反编译安卓
写个简单的批处理就可以了
@echo off
if exist projects\myapp\src @DEL /S /Q projects\myapp\src\* 
java -jar baksmali-2.1.2.jar %1 -o ./projects/myapp/src
保存为make_smali.bat,用法 make_smali.bat   xxx.apk
 (4) 将反编译的文件导入Android studio工程

将导入的文件夹设置Resource Root

(5)安装apk

输入am start -D cn.kwaiching.crackme/cn.kwaiching.crackme.CrackMe

使程序进入等待等待调试状态

命令行启动调试模式,adb shell am start -D -n packagename/ MainActivity
packagename为进程名,MainActivity为首页Activity
启动调试app,通过adb shell dumpsys activity top | grep --color=always ACTIVITY在终端获取包名和页面信息。

执行adb shell ps | grep packagename获取进程pid

执行adb forward tcp:8700 jdwp:pid 建立端口转发


(6)跟着箭头走设置调试模式




但端口连接不成功这个profile应该是debug 单击它下好断点就可以调试。没有错误就直接在run中debug。
上述安装调试参考https://blog.csdn.net/linchaolong/article/details/51146492

3.结果

爆破脚本
table1 = [16, 6, 7, 10, 9, 16, 10, 8, 8, 9, 6, 6]
table2 = [5, 10, 8, 15, 16, 15, 8, 16, 8, 16, 9, 17, 8, 17, 10, 8, 9, 18, 5, 15, 10, 9, 8, 9, 15, 18, 7, 8, 16, 6]
table3 = [6, 7, 18, 9, 5, 16, 9, 15, 18, 8, 9, 5]
table4 = [7, 7, 9, 12, 8, 7, 13, 5, 14, 5, 9, 17, 5, 7, 12, 8, 8, 6, 19, 6, 8, 16, 10, 6, 12, 9, 6, 7, 12, 5, 9, 8, 7, 8, 15, 9, 16, 8, 8, 19, 12, 6, 8, 7, 5, 15, 6, 16, 15, 7, 9, 12, 10, 7, 15, 6, 5, 14, 14, 9]
m = ["23to01", "01to03", "03to05", "05to07", "07to09", "09to11", "11to13", "13to15", "15to17", "17to19", "19to21", "21to23"]

deal_0_3=0
deal_4_5=0
deal_6_7=0
def get_table4(deal_0_3):
	if ((deal_0_3-1900)%60) >=len(table4):
		return 0
	t=table4[(deal_0_3-1900)%60]
	#print "table4="+str(t)
	return t
def get_table3(deal_4_5):
	if deal_4_5-1 >=len(table3):
		return 0
	t=table3[deal_4_5-1]
	#print "table3="+str(t)
	return t
def get_table2(deal_6_7):
	if deal_6_7-1 >=len(table2):
		return 0
	t=table2[deal_6_7-1]
	#print "table3="+str(t)
	return t

def GetText2(deal_4_5,s_):
	t=deal_4_5
	flag=0
	for i in range(len(m)):
		if s_==m[i]:
			if t==2 and s_==m[6]:
				return 63
			k=table1[i]
			flag=1
	if flag==0:
		print "not me!"
	return k
def check_mod(s_0_3,s_4_5,s_6_7):
	global deal_0_3
	global deal_4_5
	global deal_6_7
	#print "s_0_3: "+str(s_0_3)
	#print "s_4_5: "+str(s_4_5)
	#print "s_6_7: "+str(s_6_7)
	if s_0_3==1989 or s_0_3==2004:
		s_6_7=31
	if s_4_5 ==1 or s_4_5==4 or s_4_5 == 5 or s_4_5 == 7 or s_4_5 == 10 or s_4_5 == 11 or s_4_5 == 12:
		s_0_3=1999
	
	if s_0_3 <= 1994 and (s_4_5 == 2 or s_4_5 == 6 or s_4_5 == 8) :
		s_4_5=3
	if s_0_3 >= 1996 and (s_4_5 == 2 or s_4_5 == 6 or s_4_5 == 8) :
		s_4_5=9	
	if s_0_3 == 1995 and ( (s_6_7 > (s_4_5 + 2)) or s_4_5 == s_6_7 ) :
		s_4_5=6		
	deal_0_3=s_0_3
	deal_4_5=s_4_5
	deal_6_7=s_6_7
	#print "deal_0_3: "+str(deal_0_3)
	#print "deal_4_5: "+str(deal_4_5)
	#print "deal_6_7: "+str(deal_6_7)
def main():
	for i in range(1983,2007):
		for j in range(1,12):
			for k in range(1,31):
				for h in range(len(m)):
					check_mod(i,j,k)
					a1=get_table4(deal_0_3)
					a2=get_table3(deal_4_5)
					a3=get_table2(deal_6_7)
					if a1!=0 and a2!=0 and a3!=0:
						total=a1+a2+a3+GetText2(deal_4_5,m[h])
						if total==34:
							year=str(i)
							month=str(j)
							day=str(k)
							if len(month)==1:
								month='0'+month
							if len(day)==1:
								day='0'+day
							print "Found:"+year+month+day+m[h]
if __name__=="__main__":
	main()

结果

4.总结

作者应该是湾湾或者香港澳门的吧!

该不会是95年2月5日5点到7点出生的吧。。。。银行卡密码该不会是1995.。。。。。,
ps:其实我也是95的,而且520 浪漫吧!!嘻嘻。可惜银行卡密码不是.......

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2019-3-7 17:10 被大帅锅编辑 ,原因:
上传的附件:
收藏
点赞3
打赏
分享
最新回复 (3)
雪    币: 365
活跃值: (864)
能力值: ( LV9,RANK:186 )
在线值:
发帖
回帖
粉丝
KwaiChing 2018-12-11 19:51
2
0
雲南的卡密碼也簡單,妳生日加兩個數
雪    币: 16152
活跃值: (5921)
能力值: ( LV13,RANK:861 )
在线值:
发帖
回帖
粉丝
大帅锅 4 2018-12-11 20:20
3
0
雪    币: 16152
活跃值: (5921)
能力值: ( LV13,RANK:861 )
在线值:
发帖
回帖
粉丝
大帅锅 4 2018-12-11 20:21
4
0
KwaiChing 雲南的[em_19]卡密碼也簡單,妳生日加兩個數[em_10]
游客
登录 | 注册 方可回帖
返回