XMAN练习 writeup及所得

XMAN夏令营虽然没参加,但是选拔赛的题目还是乘着闲暇时间做了几道,并且也学习到了一些。
在这里做个总结。

第一道reverse

老规矩就IDA看一波

找关键字符,跟踪过去F5大法。下图很明显关键处,而if判断便是重要所在。

这个题目逻辑还是很清晰的,里面自带的乍一看以为是Base64,然而编译出来的不知道什么鬼,在往下看,将我们输入的19位异或操作然后sub_4996DD函数又是一通操作,其实就是做了Base64转换,为什么看出来,应为上面的Base64解码就是19位,根据特性所以猜测如此

那就很明了了,逆运算即可,附上代码:

from base64 import *
w='WEw2TX82amFXOFlUXz1RSUVfbw=='
t=b64decode(w)
print(t)
q=''
for j in range(len(t)):
    q+=chr(ord(t[j])^j)
print(q)

第二道安卓

直接反编译一波

明显的correct和failed提示,关键就是encode.check了

跟过去,可以看到算法,也很简单
输入的字符与b进行加法运算与61取模然后乘2再减去循环次要和输入的一样,那就爆破吧。

附上代码:

b = [23, 22, 26, 26, 25, 25, 25, 26, 27, 28, 30, 30, 29, 30, 32, 32]
w=''
for i in range(len(b)):
    for j in range(127):
        if ((j+b[i])%61)*2-i==j:
            w+=chr(j)
print(w)

第三道 安卓(有所得)

给的是一个smali文件,直接用smali2java编译成java语言看好了。

看看代码,大致流程和Base64没差,除了最后的对应转换表,将输入的以8位二进制转换,然后以6的倍数为条件补‘0’,最后6位为单位切片,在对应标志选择相应位置替代。

这样一来就可以逆向算法,一步一步已经写出了代码:

end='xsZDluYYreJDyrpDpucZCo'
temp='+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
aa=[]
bb=[]
cc=[]
str1=''
cnt=0
s=''
flag=''
for i in end:
    aa.append(temp.find(i))
for i in aa:
    bb.append(bin(i)[2:])
for i in range(len(bb)):
    while (len(bb[i]) != 6):
        bb[i] = '0' + bb[i]
for i in bb:
    str1 += i
for i in str1:
    s += i
    cnt += 1
    if not cnt % 8:
        cc.append(s)
        s = ''
for i in cc:
    flag+=chr(int(i,2))
print('flag= %s' % (flag))

上面都是一些简单的操作,所得何在,在于python的认知

  • int(str,’2/8/10/16’):这个可以将字符串转换为整型十进制,在这题的应用就在于将‘100101’转换为对应的十进制整形。
  • ‘’.split(‘’):可以将string按照相应的代表性质字符转换为列表
    例如:’10010101 11110000’.split(‘ ‘)==>[‘10010101’,’11110000’]

  • bin()转换之后得到的是一个str类型数据。

以上三点也许大牛看来很low,但毕竟是自己的积累。最后附上最终代码:

w=[]
mt=''
end='xsZDluYYreJDyrpDpucZCo'
temp='+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
for i in range(len(end)):
w.append(temp.find(end[i]))

m=" ".join([format(i,'b') for i in w])

for j in m.split(' '):
    if len(j) != 6:
        mt+= '0' * (6 - len(j)) + j
    else:
        mt+=j

m_change=mt[:-(len(mt)%8)]

flag=" ".join(bin(int(x,2)) for x in [m_change[i:i+8] for i in range(0,len(m_change),8)])
print(''.join([chr(i) for i in [int(b, 2) for b in flag.split(' ')]]))
Contents
  1. 1. 第一道reverse
  2. 2. 第二道安卓
  3. 3. 第三道 安卓(有所得)
|