首页
社区
课程
招聘
[原创]看雪 2017 CTF 第六题 EOR base64
2017-6-13 12:00 3775

[原创]看雪 2017 CTF 第六题 EOR base64

HHHso 活跃值
22
2017-6-13 12:00
3775

0x01 提取 apk中的/lib/armeabi-v7a/librf-chen.so,

0x02 IDA反编译,有ptrace和kill(pid,...)反调试机制,将涉及两者的调用指令全部清零,即改为"MOVS R0,R0" nil指令

0x03 更新 apk中的/lib/armeabi-v7a/librf-chen.so,并重新签名

0x04 IDA<adb forward tcp:23946 tcp:23946>虚拟机,调试

0x05 提取"异或EOR和base64加密"的内部比对注册码xb_rkey

    前期混淆清除分析可以发现最终比对位置为 .text 000038D0 ,调试断下可知

    librf_chen.so:A46D58D0 LDRB            R2, [R1,R4]

    librf_chen.so:A46D58D2 LDRB            R3, [R0,R4]

    librf_chen.so:A46D58D4 CMP             R3, R2

    R0:异或EOR和BASE64加密的内部xb_rkey 

    A46F2020  4A 50 79 6A 75 70 33 65  43 79 4A 6A 6C 6B 56 36  JPyjup3eCyJjlkV6

    A46F2030  44 6D 53 6D 47 48 51 3D  21 21 0A 0A 00 00 00 00  DmSmGHQ=!!......

    R1:异或EOR和BASE64加密的输入xb_ikey 

    B4B58DE0  65 4B 2F 30 36 38 71 52  57 57 67 7A 78 52 38 78  eK/068qRWWgzxR8x

    B4B58DF0  42 47 53 6D 48 48 74 73  4A 4D 30 3D 00 00 00 00  BGSmHHtsJM0=....

0x06 逆向获取异或操作因子 xorvector

  因为:xb_ikey = base64.b64encode(ikey ^ xorvector)

  所以:xorvector =  base64.b64decode(xb_ikey) ^ ikey

  

  base64.b64decode(xb_ikey)可以从[0x05]处通过xb_ikey解码得到,也可以在base64编码前得到

  

  [0x06.0x01]check函数在 text:00005AFC 开始执行base64编码,调试断下

    R0: base64.b64decode(xb_ikey)

    A48E6460  78 AF F4 EB CA 91 59 68  33 C5 1F 31 04 64 A6 1C

    A48E6470  7B 6C 24 CD 00 00 00 00  00 00 00 00 00 00 00 00

    在IDAPpython执行下述代码可以得到注册码rkey=madebyericky94528,#0xA48E6460对应于断点处R0值

    import base64

    b = base64.b64decode('JPyjup3eCyJjlkV6DmSmGHQ=!!'

    #b = '$\xfc\xa3\xba\x9d\xde\x0b"c\x96Ez\x0ed\xa6\x18t'

    ikey = '12345678901234567890'

    xorvector = []

    rkeyL = []

    for i in xrange(0,17):

      xorvector.append(Byte(0xA48E6460+i) ^ ord(ikey[i]))

      rkeyL.append(chr(xorvector[i] ^ ord(b[i])))

    Python>rkeyL

    ['m', 'a', 'd', 'e', 'b', 'y', 'e', 'r', 'i', 'c', 'k', 'y', '9', '4', '5', '2', '8']

    Python>b"".join(rkeyL) #>> rkey

    madebyericky94528

  [0x06,0x02]直接利用[0x05]中断点处信息得到注册码

    import base64

    xb_rkey='JPyjup3eCyJjlkV6DmSmGHQ=' #

    x_rkey = base64.b64decode()

    #x_rkey = '$\xfc\xa3\xba\x9d\xde\x0b"c\x96Ez\x0ed\xa6\x18t'

    xb_ikey = 'eK/068qRWWgzxR8xBGSmHHtsJM0='

    x_ikey =  base64.b64decode(xb_ikey)

    #x_ikey='x\xaf\xf4\xeb\xca\x91Yh3\xc5\x1f1\x04d\xa6\x1c{l$\xcd'

    ikey = '12345678901234567890'

    xorvector = []

    rkeyL = []

    for i in xrange(0,17):

      xorvector.append(ord(x_ikey[i]) ^ ord(ikey[i]))

      rkeyL.append(chr(xorvector[i] ^ ord(x_rkey[i])))

    rkey = b"".join(rkeyL)

    print rkey

    #madebyericky94528

  

0x07 MORE?

  此方式攻击关键点是获取输入ikey对应的xb_ikey和xb_rkey='JPyjup3eCyJjlkV6DmSmGHQ=',

  而不同ikey对应不同xb_ikey,都可以用于获取xorvector因子;

  上述攻击中ikey长度取了20,实际ikey的长度最小应该为x_rkey的长度17,只要得到足够长的xorvector因子即可。



[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回