首先感慨一下,感觉自己还是太菜了,这个是2014sctf的RE200,实际是400分的安卓题目,现在做出来其实也是在大佬的提示下完成的,怎么说只能说是分析调出来了,并不算是自己做的,本题过程也很复杂(真心膜拜比赛期间可以做出来的大牛了)下面进入正题,我尽可能讲的清楚一些,在此期间也会借鉴一下大佬的东西
首先肯定是安卓模拟器看一看软件到底是干啥的,大概就是输入一个东西,返回一个值。然后我们将安卓apk文件拖到jeb下看一下,很快找到关键的代码
_cxa_begin_match
中的,然后我们去看一看吧
反调试,代码在.init段
我们查看.init段,发现定义了个函数,_cxa_chk_fail函数,首先看一下
m_y tempabc
6 syc
9 xctf
但是我们在后面尝试中发现只用到了第一种情况!(至今不知道是为什么…这个很奇怪,应该是和线程调用有关,但是我不太明白)
然后我们继续回到 _cxa_begin_match函数,首先调用了一个函数是imp_Unwind_k
继续回到_cxa_begin_match函数,然后进入了gun_armfini_33函数,我们看看它干了什么
GoodCracK3R
def make(str,lens):
a=[]
for i in range(256):
a.append(i)
pos=0
pos_temp=0
for i in range(256):
temp = a[i]
pos_temp=(ord(str[pos])+a[i]+pos_temp)&0xff
a[i]=a[pos_temp]
a[pos_temp]=temp
pos=((pos+1)%lens)&0xff
return a
#make('K3R',3)
然后我们这个v8数组后面还会用到。之后进入gun_armfini_36函数,这个函数主要就是对11位之后的字符串进行了处理
a8e5588f7e3f758
!
但是等等!a8e5588f7e3f758是15位的,也就是说一定有一位是0x01这种形式的,11位(那个GoodCracK3R)后面存在8位字符,事实上后八位加密后情况可能是如下
[[0x0a,0x8e,0x55,0x88,0xf7,0xe3,0xf7,0x58],
[0xa8,0x0e,0x55,0x88,0xf7,0xe3,0xf7,0x58],
[0xa8,0xe5,0x05,0x88,0xf7,0xe3,0xf7,0x58],
[0xa8,0xe5,0x58,0x08,0xf7,0xe3,0xf7,0x58],
[0xa8,0xe5,0x58,0x8f,0x07,0xe3,0xf7,0x58],
[0xa8,0xe5,0x58,0x8f,0x7e,0x03,0xf7,0x58],
[0xa8,0xe5,0x58,0x8f,0x7e,0x3f,0x07,0x58],
[0xa8,0xe5,0x58,0x8f,0x7e,0x3f,0x75,0x08]]
我们实验最后正确的是这个(这也是比较坑的地方….)
[0xa8,0xe5,0x58,0x8f,0x7e,0x03,0xf7,0x58]
然后根据上面的分析,我们就可以得到gun_armfini_33加密以后后八位的字符串是啥了!
我也用python生成了一下程序如下
def make(str,lens):
a=[]
for i in range(256):
a.append(i)
pos=0
pos_temp=0
for i in range(256):
temp = a[i]
pos_temp=(ord(str[pos])+a[i]+pos_temp)&0xff
a[i]=a[pos_temp]
a[pos_temp]=temp
pos=((pos+1)%lens)&0xff
return a
#make('K3R',3)
def hehe():
a=make('K3R',3)
value=[0xa8,0xe5,0x58,0x8f,0x7e,0x03,0xf7,0x58]
temp1=0
temp2=0
temp3=0
flag=''
print a
for i in value:
temp1=(temp1+1)&0xff
temp2=a[temp1]
temp3=(temp3+temp2)&0xff
a[temp1]=a[temp3]
a[temp3]=temp2
flag+=chr(i^a[(a[temp1]+temp2)&0xff])
print flag
hehe()
最后得到gun_armfini_33加密后输入字符串为
GoodCracK3R;{0jN|B6
之后是不是就简单了!只需要逆向一下gun_armfini_33函数,再移位回去再抑或一下就得到答案了!解密程序如下
ppp="GoodCracK3R;{0jN|B6"
key = 'syc'
flag=[]
for i in ppp:
flag.append(ord(i))
print flag
for j in range(len(flag)):
if flag[j]>=ord('a') and flag[j]<=ord('z'):
flag[j]=(flag[j]-97+26-ord(key[j%3])+97)%26+97
elif flag[j]>=ord('A') and flag[j]<=ord('Z'):
flag[j]=(flag[j]-65+26-ord(key[j%3])+97)%26+65
newflag=''
for i in range(6,6+len(flag)):
newflag+=chr(flag[i%len(flag)]^(i-5))
print newflag
#xctf{hgJ7Q=|8a\wV;A~}}Wc}
至此成功解出答案!
写的可能稍微有一些些乱,但是这题目真心的好题目,又不太懂的地方还请大神斧正,也请各位包含。题目很复杂,所以一定一定要有耐心!嗯!加油