MoR03r MoR03r's Blog
国赛2018 部分题目writeup
发表于 2018-5-2 | CTF

0x01 EASYWEB

前面做题的时候一直发现这个题不能注入,后来在登录页面随手试了admin和空口令登录,抓包发现会自动填充密码,把密码去掉拿到flag。

Image

0x02 验证码

刚开始放出这个题目的时候是点击图片的验证码,随手点了几个等成绩刷新便拿到了flag。在放出验证码2后发现,这个题目竟然改过了。最终的flag:

Image

0x03 picture

1.首先得到一张jpg图片,丢到binwalk里看到隐藏数据,直接使用-e参数解压出来下面的base64:

 S1ADBBQAAQAAADkwl0xs4x98WgAAAE4AAAAEAAAAY29kZe
    PegfAPrkdnhMG2gb86/AHHpS0GMqCrR9s21bP43SqmesL+oQGo5
    0ljz4zIctqxIsTHV25+1mTE7vFc9gl5IUif7f1/rHIpHql7nqKPb+2M6n
    RLuwhU8mb/w1BLAQI/ABQAAQAAADkwl0xs4x98WgAAAE4AA
    AAEACQAAAAAAAAAIAAAAAAAAABjb2RlCgAgAAAAAAAB
    ABgAAFvDg4Xa0wE8gAmth9rTATyACa2H2tMBUEsFBgAAAAA
    BAAEAVgAAAHwAAADcAFtQeXRob24gMi43XQ0KPj4+IKh9qH
    2ofQ0KDQpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbG
    FzdCk6DQogIEZpbGUgIjxweXNoZWxsIzA+IiwgbGluZSAxLCBpb
    iA8bW9kdWxlPg0KICAgIKh9qH2ofQ0KWmVyb0RpdmlzaW9uRX
    Jyb3I6IKh9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofa
    h9qH2ofah9qH2ofah9qH2ofah9qH2ofSA8LSBwYXNzd29yZCA7KQ
    0KPj4+IAA=

2.解base64可以得到一个头部损坏的zip压缩包,修复50 4B得到一个加密后的压缩包。

Image

3.直接打开压缩包可以发现右侧的一段提示,这是Python在处理1/0时抛出的异常,手动抛出一下议程可以得到解压密码:

Image

4.输入密码解压得到一串字符串,猜测为uuencode:

 begin 644 key.txt
    G0TE30TY[,C,X.$%&,C@Y,T5".#5%0C%"-#,Y04)&1C8Q-S,Q.49]
    end

5.解uuencode可以得到flag:

Image

0x04 寻找入侵者

1.首先从attack.pcapng中提取出所有无线包的mac地址。写个脚本实现

 # -*- coding: utf-8 -*-
    import scapy.all as scapy

    packages = scapy.rdpcap('attack.pcapng')
    fp = open('passwd_mac.txt','a+')
    for i in packages:
        try:
            addr1 = i.addr1
            addr2 = i.addr2
            addr3 = i.addr3
            fp.write(addr1 + '\n')
            fp.write(addr2 + '\n')
            fp.write(addr3 + '\n')
        except:
            pass
    fp.close()

2.使用aricrack对无线包进行跑包,得到密码: 88:25:93:c1:c8:eb

3.使用airdecap解密无线包并使用wireshark打开后,发现下面的数据流:

Image

4.提取这个压缩包出来后发现有损坏,尝试访问这个流中的地址,重新下载到了key.rar,解压缩,直接对流量包strings一下,得到flag。

0x05 flag_in_your_hand

非常非常简单的题目,在js中可以看到一个ck函数,这里是主要的验证输入token的位置。

Image

直接写个脚本,逐位减3,还原为字符串即可。

 # -*- coding: utf-8 -*-

    cipher = [118, 104, 102, 120, 117, 108, 119, 124, 48, 123, 101, 120]
    plain = ''
    for i in cipher:
        plain += chr(i-3)
    print plain

输入得到的字符串:security-xbu,得到flag:

Image

0x06 oldstreamgame

之前在强网杯中出现过的流密码,在赛后也分析过,但没找到WHCTF里提到的流密码快速攻击,所以就只能选择爆破了,但是经过分析以后发现,要爆破32位的二进制数,也就是4294967295(大约43亿)的字典,如果第一位从1开始,那也有2147483647(大约21亿5千万)的字典,算了,死马当作活马医,如果连尝试的勇气都没有,那还来打国赛?于是便修改了一下给的题目:

 # flag = "flag{xxxxxxxxxxxxxxxx}"
    # assert flag.startswith("flag{")
    # assert flag.endswith("}")
    # assert len(flag)==14

    def lfsr(R,mask):
            output = (R << 1) & 0xffffffff
            i=(R&mask)&0xffffffff
            lastbit=0
            while i!=0:
                    lastbit^=(i&1)
                    i=i>>1
            output^=lastbit
            return (output,lastbit)

    # R=int(flag[5:-1],16)

    # f=open("key","w")
    # for i in range(100):
    #     tmp=0
    #     for j in range(8):
    #         (R,out)=lfsr(R,mask)
    #         tmp=(tmp << 1)^out
    #     f.write(chr(tmp))
    # f.close()

    f = open('key', 'r')
    ll = []
    for i in f.read():
            ll.append(ord(i))
    print ll
    R = 0

    s = '0123456789abcdef'
    for a in '89abcdef':
            for b in s:
                    for c in s:
                            for d in s:
                                    for e in s:
                                            for ff in s:
                                                    for jj in s:
                                                            for kk in s:
                                                                    mask = 0b10100100000010000000100010010100
                                                                    # print mask
                                                                    p = int(a+b+c+d+e+ff+jj+kk,16)
                                                                    # print p
                                                                    R = p
                                                                    lb = []
                                                                    for j in range(4):
                                                                            tmp=0
                                                                            for l in range(8):
                                                                                    (R,out) = lfsr(R,mask)
                                                                                    tmp = (tmp << 1)^out
                                                                            lb.append(tmp)
                                                                    if ll[:4] == lb:
                                                                            print p
                                                                            exit()</pre>

这个题目在刚出来就这样在跑,距离比赛结束还有半个小时的时候,突然听不到笔记本风扇的拖拉机的声音,这个时候我便知道,跑出来了,简直是个suprise.

0x07 run

这个题目是Python的沙盒逃逸,其实非常简单,但是总是GET不到那个点,也想到了应该是利用getattribute来进行绕过,但是机会总在不经意间溜走。赛后半小时,还是搞定了这个题目。

 ().__class__.__bases__[0].__getattribute__(().__class__.__bases__[0].__subclasses__()[59].__init__.im_func,'func_global'+'s')['linecache'].__dict__['o'+'s'].__dict__['s'+'ystem']('l'+'s')

评论:

icq
2018-05-23 14:14
看到留言,特来关注老师博客.
TOP