首页
社区
课程
招聘
[讨论]writeup by sjunliang
发表于: 2015-10-18 20:49 2600

[讨论]writeup by sjunliang

2015-10-18 20:49
2600
参赛id:sjunliang

第三题:
so文件放到ida里看,什么都没有,应该是加过壳的。
用定制的dalvik vm读出了check函数的地址,算出偏移是0x19C39,但是没法转成代码,怀疑在初始化的时候有对代码做变化。
不太想强行去逆向这个so,考虑动态的方法去跑native trace。试了qemu自带的trace功能,但是不成功,可能是我编译的qemu有问题。试了一些学术工具,包括droidscope和panda,都用不起来。
因为有其他事要忙,遂放弃。
第二题:
用IDA打开so,可以看到我们的输入被丢到了1DE0这函数。1DE0里只要做的事情是将我们的输入补全16个字节,输入不全的地方用index补全。然后会丢到24C8这个地址去执行下一步,这时候看24C8的地址是没有代码的,因为在调用之前会有一个解密过程,去异或了5E9C处的值,把5E9C这的数据当成一个长为0x6C的表来解密。写一个脚本把24C8处的数据解密后替换,就可以在IDA看到24C8处真正的代码。24C8首先会把之前处理过的数据每一个字节加上自己的index,然后和之前一样丢到14A4里去执行。这里14A4的解密是异或51AC的值,用同样的方法解密,可以进入14A4。14A4进来以后会把处理过的输入再去加上1DE0处的值,这里要注意的是1DE0的数据在这之前经过了两次变换,分别异或了5281和51AC处的值。然后会送入5388处的函数执行,5388处的数据需要异或0x4D,进入5388后可以看到之前处理过的输入被加密了。加密函数是10轮的block cipher,看上去是个AES。经过分析,我们在查表替换的地方发现了优化过的AES S盒,所以可以确定是标准的AES算法。那么5388开头的4个4字节的数应该就是加密密钥,写一个python脚本去解密。
from Crypto.Cipher import AES

key = '7A C6 CD 6B 9D 7C 2B 6B  B1 59 A4 8D 80 06 9D AB'.replace(' ','').decode('hex')
key1 = '6BCDC67A6B2B7C9D8DA459B1AB9D0680'.decode('hex')
c = '\x5C\xDA\x77\x2F\xA3\xC6\x3E\x39\xB6\xF0\xF3\xED\x51\x5A\x99\x86'
d = ''
for i in c:
        d += chr(ord(i)^0x4d)
aes = AES.new(key1 , AES.MODE_ECB)
temp =  aes.decrypt(c)
print temp.encode('hex')
a1 = 'F0 4F 2D E9 1C B0 8D E2  34 D0 4D E2 01 DB 4D E2'.replace(' ','').decode('hex')
b1 = 'AA EA FC 76 FB FA 4F 7D  14 CF 39 6C 8C 04 16 28'.replace(' ','').decode('hex')
c1 = '45 19 0B 60 01 06 7E DB  D5 A7 67 46 61 77 96 77'.replace(' ','').decode('hex')

l = 0
tmp = ''

for i in a1:

       
       
        tmp += chr( ord(i) ^ ord(b1[l]) ^ ord(c1[l]))
        l = l+1
print tmp.encode('hex')
l = 0
tmp1 = ''
for i in temp:
        mm = (ord(i) - ord(tmp[l]) - l)
        if mm < 0:
                mm = mm + 256
        print hex(mm)
        tmp1  += chr(mm)
        l = l+1       
print tmp1.encode('hex')
print tmp1
这里需要注意的是key的大小端问题,调整过来之后解出来正确的输入是kboloy0。
第一题:
用来check的函数非常的大,jeb没法转成java,所以只能直接看smali代码。从return往前推,一共有4个地方跳到了return这个分支。可能产生返回值1的有两个,具体分析一下。第一个地方代码如下:
00010E08  const-wide/32           v4, 0xF4240
00010E0E  rem-long                v4, v8, v4
00010E12  const-wide/32           v6, 0x1E74E
00010E18  add-long/2addr          v4, v6
00010E1A  cmp-long                v4, v4, v10
00010E1E  if-nez                  v4, :10FC8
:10E22
00010E22  const/4                 v4, 0x1
00010E24  goto/16                 :58FC
可以看到需要比较一些值,用netbeans直接调试,可以发现比较的两个值其中之一不会变,另一个值会随着输入线性变化,修改输入值就可以解出答案了。
待续

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//