hfctfwp(re)

1.easy python revering
看字节码操作,昂哥直接看直接写exp太强了,我就直接手动写了个源码出来(昂哥永远滴神)

arr0=[249,91,149,113,16,91,53,41,8]
arr1=[43,1,6,69,20,62,6,44,24,113,6,35,0,3,6,44,20,22,127,60]
arr2=[90,100,87,109,86,108,86,105,90,104,88,102]
def check0(flag):
    for x in flag:
        if ord(x)<32 and ord(x)>=128:
            return True
    return False

def check1(flag):
    if len(flag)<100==False:
        return False
    if ((len(flag)*len(flag))%777)^233==513:
        return True
    else:
        return False

def check2(flag):
    if (((((ord(flag[0])*128)+(ord(flag[1])))*128+(ord(flag[2])))*128+(ord(flag[3])))*128+ord(flag[4]))*128+ord(flag[5])!=3533889469877:
        return False
    else:
        if ord(flag[-1])+1!=125:
            return False
    return True
w=lambda x,y:x^y #前一个和后一个异或
def check3(flag):
    arr=map(ord,flag)
    a=arr[6:30:3]
    for i in range(len(a)):
        if((a[i]*17684+372511)%257)!=arr0[i]:
            return False
    b=arr[-2:33:-1]*5
    c=map(w,zip(b,arr[7:27]))
    if c!=arr1:
        return False
    p=0
    for i in range(28,34):
        if ((arr[i]+107)/16+77)!=arr2[p] and ((arr[i]+117)%16+99)!=arr2[p]:
            return False
        else:
            return True





根据第一个check1,知道flag长度39
第二个check2,前五个其实盲是flag{这五个字符,代入验证也是对的
同时最后一个字符也就出来了,}是这个。
第三个check3()里面之前是验证出ASCII码值大于32小于128,直接爆破,先将6,30,3的爆破出来,之后再继续往下看发现是38倒序过来,的才能求,所以要先求出3833的值,之后求完后,列表乘以5,是一模一样复制5个,说明是周期性,就用求余,再异或回去,再将剩余的也爆破一下。搞定。

总结一下,不要盲目的用z3来求,直接爆破,简单快捷,然后就是py的一些性质,这次也见到了之前很多没学过的东西,完全是边打边学,其他题太难了,顶不住。

posted @ 2020-04-19 19:57  YenKoc  阅读(172)  评论(0编辑  收藏  举报