虐心周末之-BCTF 百度杯网络安全大赛

2014-03-10 +3 166179人围观 ,发现 17 个不明物体 其他

BCTF“百度杯”全国网络安全技术对抗赛,是由百度公司主办,清华和北大的安全技术专家提供技术支持,紫金江宁、南京赛宁承办,面向全国范围网络安全技术实战竞赛!

BCTF 周五突然看到了,之前也看了一下,以前从来没参加过,比较感兴趣,遂注册战队加入。

本人小菜,其实也就是想看看,周六看到有人推荐《天注定》于是看了一下,看完回不过神,于是顺手拿了一本书,《蛙》,真的不错,自从毕业就很少看书,居然一直看到7点。

BCTF的事,好像忘,看了最强大脑,正准备睡觉,看到群里有人说了一下BCTF,于是欣欣然打开,没想到这么虐心啊……

MISC 初来乍到

看到题目完全没有思路,直接F12看了,没有任何信息,然后一看90%的战队都做了,然后一遍一遍的看题目,我X,不是真的就@的一下就行了吧,于是打开微博,@了,顺便Follow了,本来没注意,就是试一下,等了一会儿,看到微博有提示,新的朋友,下面公司一栏就是flag……我只想说,ca0……不知道其它战友是什么心情……

PPC & CRYPTO 混沌密码锁

一样没有思路,这题文字里其实没有什么关系,看了链接,down下来源码,看了两遍,不就是排列组合嘛,虽然,可以从answer的格式来判断大概是什么排列,但是才9个function,fun6,fun2已经用了,那就搞个循环,跑一遍应该非常快,事实上确实很快……

import base64,binascii,zlib
import os,random
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
def abc(str):
    return sha.new(str).hexdigest()
def bin2dec(string_num):
    return str(int(string_num, 2))
def hex2dec(string_num):
    return str(int(string_num.upper(), 16))
def dec2bin(string_num):
    num = int(string_num)
    mid = []
    while True:
        if num == 0: break
        num,rem = divmod(num, 2)
        mid.append(base[rem])
    return ''.join([str(x) for x in mid[::-1]])
def dec2hex(string_num):
    num = int(string_num)
    mid = []
    while True:
        if num == 0: break
        num,rem = divmod(num, 16)
        mid.append(base[rem])
    return ''.join([str(x) for x in mid[::-1]])
def hex2bin(string_num):
    return dec2bin(hex2dec(string_num.upper()))
def bin2hex(string_num):
    return dec2hex(bin2dec(string_num))
def reverse(string):
    return string[::-1]
def read_key():
    os.system('cat flag')
def gb2312(string):
    return string.decode('gb2312')
answer='78864179732635837913920409948348078659913609452869425042153399132863903834522365250250429645163517228356622776978637910679538418927909881502654275707069810737850807610916192563069593664094605159740448670132065615956224727012954218390602806577537456281222826375'
func_names = ['fun1', 'fun2', 'fun3', 'fun4', 'fun5', 'fun6', 'fun7', 'fun8', 'fun9']
f={}
f['fun1']=reverse
f['fun2']=base64.b64decode
f['fun3']=zlib.decompress
f['fun4']=dec2hex
f['fun5']=binascii.unhexlify
f['fun6']=gb2312
f['fun7']=bin2dec
f['fun8']=hex2bin
f['fun9']=hex2dec
def check_equal(a, b):
    if a == b:
        return True
    try:
        if int(a) == int(b):
            return True
    except:
        return False
    return False
def main():
    print "Welcome to Secure Passcode System"
    print "First, please choose function combination:"
f1 = 'fun3'
f2 = 'fun5'
f3 = 'fun1'
f4 = 'fun4'
"""
for f1 in fun_names:
    for f2 in fun_names:
        for f3 in fun_names:
            for f3 in fun_names: #循环跑出函数组合
"""
if f1 not in func_names or f2 not in func_names or f3 not in func_names or f4 not in func_names:
    print 'invalid function combination'
    #exit()
    #continue
try:
    answer_hash = f['fun6'](f['fun2'](f[f1](f[f2](f[f3](f[f4](answer))))))
   
except:
    print "Wrong function combination, you bad guy!"
    #exit()
    #continue
if len(answer_hash) == 0:
    print 'You must be doing some little dirty trick! Stop it!'
    #exit()
    #continue
usercode = answer
try:
    user_hash = f['fun6'](f['fun2'](f[f1](f[f2](f[f3](f[f4](usercode))))))
   
    if user_hash == answer_hash:
        if check_equal(answer, usercode):
            print "This passcode has been locked, please use the new one\n"
            #print f1,f2,f3,f4
            print answer_hash
            read_key()
            exit()
        else:
            print "Welcome back! The door always open for you, your majesty! "
            read_key()
            exit()
    else:
        print "Sorry, bad passcode.\n"
except:
    print "Sorry, bad passcode. Please try again."
if __name__ == '__main__':
    main()

注释掉exit(),添加continue,但是忘了添加下面的跑出结果时的exit(),跑了还在继续啊,果然添加上,跑出来是fun3,fun5,fun1,fun4,但是很显然,结果只能是This passcode has been locked, please use the new one

但是这些,TMD都不是重点,又看了一下,重点就是一个read_key(),一看代码,我那个去……在客户端跑没用……找不到线上提交的地方,还有我真不这两货是干嘛的……218.2.197.242:9991 218.2.197.243:9991

一看时间,夜里2点了,还是睡吧,感冒都还没有好……

这些评论亮了

  • anlfi (5级) 回复
    so lz没有解出来 这也能叫文章?用了3个for语句 循环导出解密结果 寻找base64加密格式的即可
    结果就是 3 5 1 4
    要求为 hash解密结果相同 passcode hash 不能相同
    很简单的一题
    base64加解密会省略==
    so 只要多加几个==就可以构造出 pass check_equal函数的 10进制字符串了
    web300"
    room 那题怎解 据说改了3个版本 一开始开始过滤 "|" 后来又改了./room(baidu****)
    接着又不过滤了.... 最后只有23队解出来了
    )9( 亮了
发表评论

已有 17 条评论

取消
Loading...
css.php